- CKA考試題目
- 第1題: 基於角色的訪問控制-RBAC
- 第2題 節點維護-指定node節點不可用
- 第3題 K8s版本升級
- 第4題 Etcd數據庫備份恢復
- 第5題 網絡策略NetworkPolicy
- 第6題 四層負載均衡service
- 第7題 七層負載均衡Ingress
- 第8題 Deployment管理pod擴縮容
- 第9題 pod指定節點部署
- 第10題 檢查Node節點的健康狀態
- 第11題 一個Pod封裝多個容器
- 第12題 持久化存儲卷Persistent、Volume
- 第13題 PersistentVolumeClaim
- 第14題 監控Pod日志
- 第15題 Sidecar代理
- 第16題 監控Pod度量指標
- 第17題 集群故障排查 – kubelet故障
CKA考試題目
截止到12月11日發現以下所有考試題型沒有變化,無非就是換些名稱而已。及格為66分
注意事項:
1、每一題的最后都有答案,可以先自己嘗試做然后點擊“查看代碼按鈕”,查看答案對比一下(每個人的寫法都可能會有所不同),(凡是yaml內容都需要自己創建yaml文件,寫完之后一定要使用kubectl create -f xxx.yaml進行創建后,再去查看),每一題寫完之后都要使用kubectl get 等命令進行驗證一下
2、考試時允許查看kubernetes.io官方文檔,每一題寫完之后可以保存一下官網文檔的書簽,考試時直接打開復制粘貼即可,比如像我這樣
3、考完之后24小時內一般就會有郵件通知考試是否合格
第1題: 基於角色的訪問控制-RBAC
題目:
中文解釋:
創建一個名為deployment-clusterrole的clusterrole,該clusterrole只允許創建Deployment、Daemonset、Statefulset的create操作
在名字為app-team1的namespace下創建一個名為cicd-token的serviceAccount,並且將上一步創建clusterrole的權限綁定到該serviceAccount
解題:
可參考:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/#kubectl-create-clusterrole
點擊查看代碼
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
kubectl -n app-team1 create serviceaccount cicd-token
kubectl -n app-team1 create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
第2題 節點維護-指定node節點不可用
題目:
中文解釋:
將ek8s-node-1節點設置為不可用,然后重新調度該節點上的所有Pod
參考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#drain
解題:
點擊查看代碼
$ kubectl config use-context ek8s
$ kubectl cordon ek8s-node-1 #設置節點是不可調度狀態
$ kubectl drain ek8s-node-1 --delete-emptydir-data --ignore-daemonsets --force
第3題 K8s版本升級
題目:(12月剛考試完,第3題版本升級從1.21.x升級到1.22.x)
翻譯:
現有的 Kubernetes 集權正在運行的版本是 1.21.0,僅將主節點上的所有 kubernetes 控制面板和組件升級到版本 1.22.0 另外,在主節點上升級 kubelet 和 kubectl
解題:
參考:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
點擊查看代碼
#設置為維護狀態
$ kubectl config use-context mk8s
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 11d v1.21.0
k8s-node01 Ready <none> 8d v1.21.0
k8s-node02 Ready <none> 11d v1.21.0
$ kubectl cordon k8s-master
# 驅逐Pod
$ kubectl drain k8s-master --delete-emptydir-data --ignore-daemonsets –force
#按照題目提示ssh到一個master節點
$ ssh k8s-master
$ apt update
$ apt-cache policy kubeadm | grep 1.22.0 #查看支持哪個版本
$ apt-get install kubeadm=1.22.0-00
#驗證升級計划
$ kubeadm upgrade plan
# 看到如下信息,可升級到指定版本
You can now apply the upgrade by executing the following command:
kubeadm upgrade apply v1.22.0
# 開始升級Master節點
$ kubeadm upgrade apply v1.22.0 --etcd-upgrade=false
[upgrade/successful] SUCCESS! Your cluster was upgraded to "v1.22.0". Enjoy!
[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven't already done so.
# 升級kubectl和kubelet
$ apt-get install -y kubelet=1.22.0-00 kubectl=1.22.0-00
$ systemctl daemon-reload
$ systemctl restart kubelet
$ kubectl uncordon k8s-master
node/k8s-master uncordoned
$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 11d v1.22.0
k8s-node01 Ready <none> 8d v1.21.0
k8s-node02 Ready <none> 11d v1.21.0
第4題 Etcd數據庫備份恢復
題目:
中文解釋:
針對etcd實例https://127.0.0.1:2379創建一個快照,保存到/srv/data/etcd-snapshot.db。在創建快照的過程中,如果卡住了,就鍵入ctrl+c終止,然后重試。
然后恢復一個已經存在的快照: /var/lib/backup/etcd-snapshot-previous.db
執行etcdctl命令的證書存放在:
ca證書:/opt/KUIN00601/ca.crt
客戶端證書:/opt/KUIN00601/etcd-client.crt
客戶端密鑰:/opt/KUIN00601/etcd-client.key
解題:
可參考:https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/
點擊查看代碼
注意:需要自己安裝etcdctl命令
#備份
$ export ETCDCTL_API=3
$ etcdctl --endpoints="https://127.0.0.1:2379" --cacert=/opt/KUIN000601/ca.crt --cert=/opt/KUIN000601/etcd-client.crt --key=/opt/KUIN000601/etcd-client.key snapshot save /srv/data/etcd-snapshot.db
還原
$ mkdir /opt/backup/ -p
$ cd /etc/kubernetes/manifests && mv kube-* /opt/backup
$ export ETCDCTL_API=3
$etcdctl --endpoints="https://127.0.0.1:2379" --cacert=/opt/KUIN000601/ca.crt --cert=/opt/KUIN000601/etcd-client.crt --key=/opt/KUIN000601/etcd-client.key snapshot restore /var/lib/backup/etcd-snapshot-previous.db --data-dir=/var/lib/etcd-restore
$ vim etcd.yaml
# 將volume配置的path: /var/lib/etcd改成/var/lib/etcd-restore
volumes:
- hostPath:
path: /etc/kubernetes/pki/etcd
type: DirectoryOrCreate
name: etcd-certs
- hostPath:
path: /var/lib/etcd-restore
# 還原k8s組件
$ mv /opt/backup/* /etc/kubernetes/manifests
$ systemctl restart kubelet
第5題 網絡策略NetworkPolicy
題目:
中文解釋:
創建一個名字為all-port-from-namespace的NetworkPolicy,這個NetworkPolicy允許internal命名空間下的Pod訪問該命名空間下的9000端口。
並且不允許不是internal命令空間的下的Pod訪問
不允許訪問沒有監聽9000端口的Pod。
解題:
參考:https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
點擊查看代碼
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: all-port-from-namespace
namespace: internal
spec:
ingress:
- from:
- podSelector: {}
ports:
- port: 9000
protocol: TCP
podSelector: {}
policyTypes:
- Ingress
第6題 四層負載均衡service
題目:
中文解釋:
重新配置一個已經存在的deployment front-end,在名字為nginx的容器里面添加一個端口配置,名字為http,暴露端口號為80,然后創建一個service,名字為front-end-svc,暴露該deployment的http端口,並且service的類型為NodePort。
解題:
本題可以參考:https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/
點擊查看代碼
$ kubectl edit deploy front-end
# 添加如下配置,主要是在name為nginx的容器下
添加service:
$
kubectl expose deploy front-end --name=front-end-svc --port=80 --target-port=http --type=NodePort
第7題 七層負載均衡Ingress
題目:
中文解釋:
在ing-internal 命名空間下創建一個ingress,名字為pong,代理的service hi,端口為5678,配置路徑/hi。
驗證:訪問curl -kL <INTERNAL_IP>/hi會返回hi
解題:
本地可參考:https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
點擊查看代碼
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
spec:
rules:
- http:
paths:
- path: /hi
pathType: Prefix
backend:
service:
name: hi
port:
number: 5678
最后一步按題目給出的方法進行驗證即可
第8題 Deployment管理pod擴縮容
題目:
中文解釋:
擴容名字為loadbalancer的deployment的副本數為6
解題:
點擊查看代碼
$ kubectl config use-context k8s
$ kubectl scale --replicas=6 deployment loadbalancer
或者用$ kubectl edit deployment loadbalancer 直接在線擴容也可以
第9題 pod指定節點部署
題目:
中文解釋:
創建一個Pod,名字為nginx-kusc00401,鏡像地址是nginx,調度到具有disk=spinning標簽的節點上,該題可以參考鏈接:
https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-pods-nodes/
解題:
點擊查看代碼
$ vim pod-ns.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
labels:
role: nginx-kusc00401
spec:
nodeSelector:
disk: spinning
containers:
- name: nginx
image: nginx
$ kubectl create -f pod-ns.yaml
第10題 檢查Node節點的健康狀態
題目:
中文解釋:
檢查集群中有多少節點為Ready狀態,並且去除包含NoSchedule污點的節點。之后將數字寫到/opt/KUSC00402/kusc00402.txt
解題:
點擊查看代碼
$ kubectl config use-context k8s
$ kubectl get node | grep -i ready # 記錄總數為A
$ kubectl describe node | grep Taint | grep NoSchedule # 記錄總數為B
# 將A減B的值x導入到/opt/KUSC00402/kusc00402.txt
$ echo x >> /opt/KUSC00402/kusc00402.txt
grep -i: 忽略字符大小寫的差別。
第11題 一個Pod封裝多個容器
題目:
中文解釋:
創建一個Pod,名字為kucc1,這個Pod可能包含1-4容器,該題為四個:nginx+redis+memcached+consul
解題:
點擊查看代碼
apiVersion: v1
kind: Pod
metadata:
name: kucc1
spec:
containers:
- image: nginx
name: nginx
- image: redis
name: redis
- image: memchached
name: memcached
- image: consul
name: consul
第12題 持久化存儲卷Persistent、Volume
題目:
中文解釋:
創建一個pv,名字為app-config,大小為2Gi,訪問權限為ReadWriteMany。Volume的類型為hostPath,路徑為/srv/app-config
解題:
參考:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
點擊查看代碼
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
labels:
type: local
spec:
storageClassName: manual #可以寫也可以不寫
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/srv/app-config"
第13題 PersistentVolumeClaim
題目:
中文文檔:
創建一個名字為pv-volume的pvc,指定storageClass為csi-hostpath-sc,大小為10Mi
然后創建一個Pod,名字為web-server,鏡像為nginx,並且掛載該PVC至/usr/share/nginx/html,掛載的權限為ReadWriteOnce。之后通過kubectl edit或者kubectl path將pvc改成70Mi,並且記錄修改記錄。
解題:
參考:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
點擊查看代碼
創建PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
storageClassName: csi-hostpath-sc
創建Pod:
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pv-volume
volumes:
- name: pv-volume
persistentVolumeClaim:
claimName: pv-volume
擴容:
方式一Patch命令:
kubectl patch pvc pv-volume -p '{"spec":{"resources":{"requests":{"storage": "70Mi"}}}}' --record
方式二edit:
kubectl edit pvc pv-volume
第14題 監控Pod日志
題目:
中文解釋:
監控名為foobar的Pod的日志,並過濾出具有unable-access-website 信息的行,然后將寫入到 /opt/KUTR00101/foobar
解題:
點擊查看代碼
$ kubectl config use-context k8s
$ kubectl logs foobar | grep unable-access-website > /opt/KUTR00101/foobar
第15題 Sidecar代理
題目:
中文解釋:
添加一個名為busybox且鏡像為busybox的sidecar到一個已經存在的名為legacy-app的Pod上,這個sidecar的啟動命令為/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-app.log'。
並且這個sidecar和原有的鏡像掛載一個名為logs的volume,掛載的目錄為/var/log/
解題:
本題答案:https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/
首先將legacy-app的Pod的yaml導出,大致如下:
點擊查看代碼
$ kubectl get po legacy-app -oyaml > c-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$(date) INFO $i" >> /var/log/legacy-ap.log;
i=$((i+1));
sleep 1;
done
再此yaml中添加sidecar和volume
$ vim c-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$(date) INFO $i" >> /var/log/legacy-ap.log;
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: logs
mountPath: /var/log
- name: busybox
image: busybox
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-ap.log']
volumeMounts:
- name: logs
mountPath: /var/log
volumes:
- name: logs
emptyDir: {}
$ kubectl delete -f c-sidecar.yaml ; kubectl create -f c-sidecar.yaml
第16題 監控Pod度量指標
題目:
中文解釋:
找出具有name=cpu-user的Pod,並過濾出使用CPU最高的Pod,然后把它的名字寫在已經存在的/opt/KUTR00401/KUTR00401.txt文件里(注意他沒有說指定namespace。所以需要使用-A指定所以namespace)
解題:
點擊查看代碼
$ kubectl config use-context k8s
$ kubectl top po -A -l name=cpu-user
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system coredns-54d67798b7-hl8xc 7m 8Mi
kube-system coredns-54d67798b7-m4m2q 6m 8Mi
# 注意這里的pod名字以實際名字為准,按照CPU那一列進行選擇一個最大的Pod,另外如果CPU的數值是1 2 3這樣的。是大於帶m這樣的,因為1顆CPU等於1000m,注意要用>>而不是>
$ echo "coredns-54d67798b7-hl8xc" >> /opt/KUTR00401/KUTR00401.txt
第17題 集群故障排查 – kubelet故障
題目:
中文解釋:
一個名為wk8s-node-0的節點狀態為NotReady,讓其他恢復至正常狀態,並確認所有的更改開機自動完成
解題:
點擊查看代碼
$ ssh wk8s-node-0
$ sudo -i
# systemctl status kubelet
# systemctl start kubelet
# systemctl enable kubelet
主節點故障排查:--之前的考試題,現在考試應該沒有這個題了。
https://kubernetes.io/zh/docs/tasks/configure-pod-container/static-pod/