cka考題總結2021年12月

CKA考試題目

截止到12月11日發現以下所有考試題型沒有變化,無非就是換些名稱而已。及格爲66分

第1題: 基於角色的訪問控制-RBAC

題目:
image
中文解釋:
創建一個名爲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節點不可用

題目:
image

中文解釋:
將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)
image

翻譯:
現有的 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數據庫備份恢復

題目:
image

中文解釋:
針對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

題目:
image

中文解釋:
創建一個名字爲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

題目:
image

中文解釋:
重新配置一個已經存在的deployment front-end,在名字爲nginx的容器裏面添加一個端口配置,名字爲http,暴露端口號爲80,然後創建一個service,名字爲front-end-svc,暴露該deployment的http端口,並且service的類型爲NodePort。
解題:
本題可以參考:https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/
image

點擊查看代碼
$ 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

題目:
image

中文解釋:
在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擴縮容

題目:
image

中文解釋:
擴容名字爲loadbalancer的deployment的副本數爲6
解題:

點擊查看代碼
$ kubectl config use-context k8s

$ kubectl scale --replicas=6 deployment loadbalancer

或者用$ kubectl edit deployment loadbalancer 直接在線擴容也可以

第9題 pod指定節點部署

題目:
image

中文解釋:
創建一個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節點的健康狀態

題目:
image

中文解釋:
檢查集羣中有多少節點爲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封裝多個容器

題目:
image

中文解釋:
創建一個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

題目:
image

中文解釋:
創建一個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

題目:
image

中文文檔:
創建一個名字爲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日誌

題目:
image

中文解釋:
監控名爲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代理

題目:
image

中文解釋:
添加一個名爲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度量指標

題目:
image

中文解釋:
找出具有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故障

題目:
image

中文解釋:
一個名爲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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章