CKA考题[k8s1.24]
文章目錄
- 第一題 權限控制 RBAC
- 第二題 查看 pod 的 CPU
- 第三題 配置網絡策略 NetworkPolicy
- 第四題 暴露服務 Service
- 第五題 創建 Ingress
- 第六題 擴容 deployment 副本數
- 第七題 調度 pod 到指定節點
- 第八題 查看可用node數量
- 第九題 創建多容器的pod
- 第十題 創建 PV
- 第十一題 創建 PVC
- 第十二題 查看 pod 日志
- 第十三題 使用 sidecar 代理容器日志
- 第十四題 升級集群
- 第十五題 備份還原 etcd
- 第十六題 排查集群中故障節點
- 第十七題 節點維護
相關鏈接:
Containerd【輕量級容器管理工具】:https://blog.csdn.net/qq_41822345/article/details/126677121
從0開始安裝k8s1.25:https://blog.csdn.net/qq_41822345/article/details/126679925
CKA考題[k8s1.21]:https://blog.csdn.net/qq_41822345/article/details/127038941
【摘要】 (CKA)認證Kubernetes管理員,由Linux基金會和云原生計算基金會(CNCF)推出,是關于kubernetes技術的官方認證。當前考題考試環境kubernetes1.24。考試共計17道題,線上考試,2小時之內完成。
注意,官方的 CKA 考試環境是有多套的,考試時,不一定抽到哪套。不同考試環境里面部分題目的內容有很小的變化,但題干都是一樣的。另外,每道題都是有步驟分的,不要全空不寫。
《題庫》跟《真題》的題干是一樣的,區別在于里面的一些 pod、deployment、namespace、ServiceAccount 等參數可能不同而已,因為在真實考試中,也是會時常變換里面的這些變量參數的。注意理解這些變量的含義,而不要死記硬背答案。
考試時,可以打開考試環境 Ubuntu 20.04 桌面上的火狐瀏覽器,訪問 K8S 官網 https://kubernetes.io/
kubectl 備忘單:https://kubernetes.io/zh-cn/docs/reference/kubectl/cheatsheet/
第一題 權限控制 RBAC
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Context
為部署流水線創建一個新的 ClusterRole 并將其綁定到范圍為特定的 namespace 的特定 ServiceAccount。
Task
創建一個名為 deployment-clusterrole 且僅允許創建以下資源類型的新 ClusterRole: Deployment 、StatefulSet 、DaemonSet。
在現有的 namespace app-team1 中創建一個名為 cicd-token 的新 ServiceAccount。
限于 namespace app-team1 中,將新的 ClusterRole deployment-clusterrole 綁定到新的 ServiceAccount cicd-token。
- 考點
k8s RBAC 授權模型。
kubectl create clusterrole -h
kubectl create rolebinding -h
- 解答
切換到kubectl config use-context k8s。
kubectl create clusterrole deployment-clusterrole--verb=create--resource=Deployment,StatefulSet,DaemonSetkubectl -n app-team1 create serviceaccourt cicd-tokenkubectl create rolebinding cicd-token --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --namespace=app-team1- 驗證
第二題 查看 pod 的 CPU
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Task
通過 pod label name=cpu-loader,找到運行時占用大量 CPU 的 pod,
并將占用 CPU 最高的 pod 名稱寫入文件 /opt/KUTR000401/KUTR00401.txt(已存在)。
- 考點
kubectl top pod -h
- 解答
切換到kubectl config use-context ek8s。
kubectl top pod -l name=cpu-loader --sort-by=cpu -A echo "查出來的 Pod Name" > /opt/KUTR000401/KUTR00401.txt- 驗證
第三題 配置網絡策略 NetworkPolicy
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context hk8s
Task
在現有的 namespace my-app 中創建一個名為 allow-port-from-namespace 的新 NetworkPolicy。
確保新的 NetworkPolicy 允許 namespace echo 中的 Pods 連接到 namespace my-app 中的 Pods 的 9000 端口。
進一步確保新的 NetworkPolicy:
不允許對沒有在監聽 端口 9000 的 Pods 的訪問。
不允許非來自 namespace echo 中的 Pods 的訪問。
- 考點
NetworkPolicy 的創建:
https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
- 解答
切換到kubectl config use-context mk8s
vim networkpolicy.yaml cat networkpolicy.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata:name: allow-port-from-namespacenamespace: my-app #被訪問者的命名空間 spec:podSelector: #這兩行必須要寫,或者也可以寫成一行為 podSelector: {}matchLabels: {} # 注意 matchLabels:與{}之間有一個空格policyTypes:- Ingress #策略影響入棧流量ingress:- from: #允許流量的來源- namespaceSelector:matchLabels:project: echo #訪問者的命名空間的標簽 label#- podSelector: {} #注意,這個不寫。如果 ingress 里也寫了- podSelector: {},則會導致 my-app 中的 pod 可以訪問 my-app 中 pod 的 9000 了,這樣不滿足題目要求不允許非來自 namespace echo 中的 Pods 的訪問。ports:- protocol: TCPport: 9000 #被訪問者公開的端口- 驗證
第四題 暴露服務 Service
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Task
請重新配置現有的 deployment front-end 以及添加名為 http 的端口規范來公開現有容器 nginx 的端口 80/tcp。
創建一個名為 front-end-svc 的新 service,以公開容器端口 http。
配置此 service,以通過各個 Pod 所在的節點上的 NodePort 來公開他們。
- 考點
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
- 解答
切換到kubectl config use-context mk8s
vim deploy-nginx.yaml cat deploy-nginx.yaml apiVersion: apps/v1 kind: Deployment metadata:name: front-end spec:selector:matchLabels:app: nginxreplicas: 3 # 告知 Deployment 運行 3 個與該模板匹配的 Podtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80name: http # 端口名為 httpprotocol: TCP創建 deployment 并暴露端口
kubectl expose deployment front-end --type=NodePort --port=80 --target-port=80 --name=front-end-svc- 驗證
第五題 創建 Ingress
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Task
如下創建一個新的 nginx Ingress 資源:
名稱: ping
Namespace: ing-internal
使用服務端口 5678 在路徑 /hello 上公開服務 hello
可以使用以下命令檢查服務 hello 的可用性,該命令應返回 hello:
curl -kL <INTERNAL_IP>/hello
- 考點
Ingress 的創建:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
- 解答
切換到kubectl config use-context hk8s。
vim ingress-min.yaml cat ingress-min.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata:name: pingnamespace: ing-internal#annotations:#kubernetes.io/ingress.class: "nginx"#nginx.ingress.kubernetes.io/rewrite-target: / spec:rules:- http:paths:- path: /hellopathType: Prefixbackend:service:name: helloport:number: 5678創建ingress:
kubectl apply -f ingress-min.yaml- 驗證
第六題 擴容 deployment 副本數
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Task
將 deployment presentation 擴展至 4 個 pods
- 考點
kubectl scale deployment -h
- 解答
切換到kubectl config use-context k8s。
kubectl scale deployment presentation --replicas=4- 驗證
第七題 調度 pod 到指定節點
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Task
按如下要求調度一個 pod:
名稱:nginx-kusc00401
Image:nginx
Node selector:disk=ssd
- 考點
nodeSelect 屬性的使用。
- 解答
切換到kubectl config use-context k8s。
Vim node-selector.yaml cat node-selector.yaml apiVersion: v1 kind: Pod metadata:name: nginx-kusc00401 spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresent #這句的意思是,如果此 image 已經有了,則不重新下載。考試時寫不寫這個都是可以的。nodeSelector:disk: ssd- 驗證
第八題 查看可用node數量
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Task
檢查有多少 nodes 已準備就緒(不包括被打上 Taint:NoSchedule 的節點),
并將數量寫入 /opt/KUSC00402/kusc00402.txt
- 考點
kubectl -h
- 解答
切換到kubectl config use-context k8s。
# grep 的-i 是忽略大小寫,grep -v 是排除在外,grep -c 是統計查出來的條數。 kubectl describe nodes | grep -i Taints | grep -vc NoSchedule echo "查出來的數字" > /opt/KUSC00402/kusc00402.txt- 驗證
第九題 創建多容器的pod
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Task
創建一個名字為kucc8的pod,里面包含2個容器redis和consul。
- 考點
pod 概念
- 解答
切換到kubectl config use-context k8s。
vim pod-two-containers.yaml cat pod-two-containers.yaml apiVersion: v1 kind: Pod metadata:name: kucc8 spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresent- name: consulimage: consulimagePullPolicy: IfNotPresent- 驗證
第十題 創建 PV
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context hk8s
Task
創建名為 app-config 的 persistent volume,容量為 1Gi,訪問模式為 ReadWriteMany。
volume 類型為 hostPath,位于 /srv/app-config
- 考點
PV創建:
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
- 解答
切換到kubectl config use-context k8s。
vim pv.yaml cat pv.yaml apiVersion: v1 kind: PersistentVolume metadata:name: app-config#labels: #不需要寫#type: local spec:capacity:storage: 1GiaccessModes:- ReadWriteMany # 注意,考試時的訪問模式可能有 ReadWriteMany 和 ReadOnlyMany 和 ReadWriteOnce,根據題目要求寫。hostPath:path: "/srv/app-config"- 驗證
第十一題 創建 PVC
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context ok8s
Task
創建一個新的 PersistentVolumeClaim:
名稱: pv-volume
Class: csi-hostpath-sc
容量: 10Mi
創建一個新的 Pod,來將 PersistentVolumeClaim 作為 volume 進行掛載:
名稱:web-server
Image:nginx:1.16
掛載路徑:/usr/share/nginx/html
配置新的 Pod,以對 volume 具有 ReadWriteOnce 權限。
最后,使用 kubectl edit 或 kubectl patch 將 PersistentVolumeClaim 的容量擴展為 70Mi,并記錄此更改。
- 考點
PVC與pod掛載:
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
- 解答
切換到kubectl config use-context k8s。
Vim pvc.yaml cat pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata:name: pv-volume #pvc 名字 spec:storageClassName: csi-hostpath-scaccessModes:- ReadWriteOnce # 注意,考試時訪問模式可能有 ReadWriteMany 和 ReadOnlyMany 和 ReadWriteOnce,根據題目要求寫。resources:requests:storage: 10Mi創建pvc
kubectl apply -f pvc.yaml創建pod,綁定pvc
vim pvc-pod.yaml cat pvc-pod.yaml apiVersion: v1 kind: Pod metadata:name: web-server spec:volumes:- name: task-pv-storagepersistentVolumeClaim:claimName: pv-volume #這個要使用上面創建的 pvc 名字containers:- name: nginximage: nginx:1.16volumeMounts:- mountPath: "/usr/share/nginx/html"name: task-pv-storage #要與volumes的name一樣。- 驗證
第十二題 查看 pod 日志
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Task
監控 pod foo 的日志并:
提取與錯誤 RLIMIT_NOFILE 相對應的日志行
將這些日志行寫入 /opt/KUTR00101/foo
- 考點
pod日志輸出
- 解答
切換到kubectl config use-context hk8s。
kubectl logs foo | grep "RLIMIT_NOFILE" > /opt/KUTR00101/foo- 驗證
第十三題 使用 sidecar 代理容器日志
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context k8s
Context
將一個現有的 Pod 集成到 Kubernetes 的內置日志記錄體系結構中(例如 kubectl logs)。
添加 streaming sidecar 容器是實現此要求的一種好方法。
Task
使用 busybox Image 來將名為 sidecar 的 sidecar 容器添加到現有的 Pod 11-factor-app 中。
新的 sidecar 容器必須運行以下命令:
/bin/sh -c tail -n+1 -f /var/log/11-factor-app.log
使用掛載在/var/log 的 Volume,使日志文件 11-factor-app.log 可用于 sidecar 容器。
除了添加所需要的 volume mount 以外,請勿更改現有容器的規格。
- 考點
pod 兩個容器共享存儲卷
- 解答
切換到kubectl config use-context k8s。
# (輸出其yaml文件) kubectl get pod 11-factor-app -o yaml > app.yaml # (先備份一份,刪除managed部分,刪除status部分,不刪會有問題。) vim app.yaml # 在container下添加: containers:- name: sidecar #新加內容,注意 name 別寫錯了image: busybox #新加內容args: [/bin/sh, -c, 'tail -n+1 -f /var/log/11-factor-app.log'] #新加內容,注意文件名別寫錯了。另外是用逗號分隔的,而題目里是空格。volumeMounts: #新加內容- name: varlog #新加內容mountPath: /var/log #新加內容# 在原容器下添加:volumeMounts:- name: varlog #新加內容mountPath: /var/log #新加內容#注意:在pod的volumes為emptyDir。volumes:- name: varlogemptyDir: {}重新創建pod應用
kubectl delete pod 11-factor-app kubectl apply -f app.yaml kubectl logs 11-factor-app sidecar- 驗證
第十四題 升級集群
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context mk8s
Task
現有的 Kubernetes 集群正在運行版本 1.24.2。僅將 master 節點上的所有 Kubernetes 控制平面和節點組件升級到版本 1.24.3。
確保在升級之前 drain master 節點,并在升級后 uncordon master 節點。
可以使用以下命令,通過 ssh 連接到 master 節點:
ssh master01
可以使用以下命令,在該 master 節點上獲取更高權限:
sudo -i
另外,在主節點上升級 kubelet 和 kubectl。
請不要升級工作節點,etcd,container 管理器,CNI 插件, DNS 服務或任何其他插件。
- 考點
如何離線主機,并升級控制面板和升級節點
- 解答
切換到kubectl config use-context k8s。
kubectl get nodes kubectl cordon master01 kubectl drain master01 --ignore-daemonsetsapt-cache show kubeadm|grep 1.24.3 apt-get update apt-get install kubeadm=1.24.3-00# 檢查 kubeadm 升級后的版本 kubeadm version # 驗證升級計劃 kubeadm upgrade plan # 排除 etcd,升級其他的,提示時,輸入 y。 kubeadm upgrade apply v1.24.3 --etcd-upgrade=false# 升級 kubelet apt-get install kubelet=1.24.3-00 kubelet --version# 升級 kubectl apt-get install kubectl=1.24.3-00 kubectl version# 恢復 master01 調度 kubectl uncordon master01 #檢查 master01 是否為 Ready kubectl get node第十五題 備份還原 etcd
- 考題
設置配置環境
此項目無需更改配置環境。但是,在執行此項目之前,請確保您已返回初始節點。
[candidate@master01] $ exit #注意,這個之前是在 master01 上,所以要 exit 退到 node01,如果已經是 node01 了,就不要再 exit 了。
Task
首先,為運行在 https://11.0.1.111:2379 上的現有 etcd 實例創建快照并將快照保存到 /var/lib/backup/etcd-snapshot.db
(注意,真實考試中,這里寫的是 https://127.0.0.1:2379)
為給定實例創建快照預計能在幾秒鐘內完成。 如果該操作似乎掛起,則命令可能有問題。用 CTRL + C 來取消操作,然后重試。
然后還原位于/data/backup/etcd-snapshot-previous.db 的現有先前快照。
提供了以下 TLS 證書和密鑰,以通過 etcdctl 連接到服務器。
CA 證書: /opt/KUIN00601/ca.crt
客戶端證書: /opt/KUIN00601/etcd-client.crt
客戶端密鑰: /opt/KUIN00601/etcd-client.key
- 考點
etcd 的備份和恢復
- 解答
切換到kubectl config use-context k8s。
# 備份: # 如果不使用 export ETCDCTL_API=3,而使用 ETCDCTL_API=3,則下面每條 etcdctl 命令前都要加 ETCDCTL_API=3。 # 如果執行時,提示 permission denied,則是權限不夠,命令最前面加 sudo 即可。 export ETCDCTL_API=3 etcdctl --endpoints=https://11.0.1.111:2379 --cacert="/opt/KUIN00601/ca.crt" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot save /var/lib/backup/etcd-snapshot.db# 檢查:(考試時,這些檢查動作,都可以不做) etcdctl snapshot status /var/lib/backup/etcd-snapshot.db -wtable# 恢復 # 不加 sudo 會報錯 permission denied sudo ETCDCTL_API=3 etcdctl --endpoints=https://11.0.1.111:2379 --cacert="/opt/KUIN00601/ca.crt" --cert="/opt/KUIN00601/etcd-client.crt" -- key="/opt/KUIN00601/etcd-client.key" snapshot restore /data/backup/etcd-snapshot-previous.db第十六題 排查集群中故障節點
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context wk8s
Task
名為 node02 的 Kubernetes worker node 處于 NotReady 狀態。
調查發生這種情況的原因,并采取相應的措施將 node 恢復為 Ready 狀態,確保所做的任何更改永久生效。
可以使用以下命令,通過 ssh 連接到 node02 節點:
ssh node02
可以使用以下命令,在該節點上獲取更高權限:
sudo -i
- 考點
控制面組件故障排查【api-server、etcd、scheduler、controller、kubelet、docker等】
- 解答
切換到kubectl config use-context k8s。
# (查看kubelet為啥沒起來,按需修復) systemctl status kubelet systemctl start kubelt systemctl enable kubelet- 驗證
第十七題 節點維護
- 考題
設置配置環境:
[candidate@node-1] $ kubectl config use-context ek8s
Task
將名為 node02 的 node 設置為不可用,并重新調度該 node 上所有運行的 pods。
- 考點
cordon 和 drain 命令的使用
- 解答
切換到kubectl config use-context k8s。
kubectl get node kubectl cordon node02 kubectl get node kubectl drain node02 --ignore-daemonsets # 注意,還有一個參數--delete-emptydir-data --force,這個考試時不用加,就可以正常 draini node02 的。 # 但如果執行后,有跟測試環境一樣的報錯(如下截圖),則需要加上--delete-emptydir-data --force,會強制將 pod 移除。 # kubectl drain node02 --ignore-daemonsets --delete-emptydir-data --force- 驗證
總結
以上是生活随笔為你收集整理的CKA考题[k8s1.24]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 你的背后有阳光
- 下一篇: 内部收益率(二分法)