1. 程式人生 > 其它 >kubernetes CKA題庫(附答案)

kubernetes CKA題庫(附答案)

第一題 RBAC授權
問題權重: 4%

設定配置環境:
[student@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 。

解題

kubectl config use-context k8s
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets
kubectl create ns app-team1
kubectl create serviceaccount cicd-token -n app-team1
kubectl create rolebinding cicd-token --serviceaccount=app-team1:cicd-token --clusterrole=deployment-clusterrole -n app-team1
#驗證
kubectl --as=system:serviceaccount:app-team1:cicd-token get pods -n app-team1
1
2
3
4
5
6
7
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第二題 節點設定不可用
設定配置環境:
[studentinode-1] $ kubectl config use-context ek8s

問題權重: 4%
Task
將名カek8s-node.1 的node沒置カ不可用,並重新凋度該node上所有執行的pods

解題

kubectl config use-context ek8s
kubectl drain k8s21-worker01 --ignore-daemonsets
1
2
注:如果執行drain提示錯誤,根據提示再加上選項,例如–delete-local-data–force

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第三題 升級K8s版本
問題權重: 7%
設定配置環境:
[student@node-1] $ kubectl config use- context mk8s
Task
現有的Kubernetes叢集正在執行版本1.20.0。僅將主節點上的所
有Kubernetes控制平面和節點元件升級到版本1.20.1。
確保在升級之前drain主節點,並在升級後uncordon主節點。

可使用以下命令通過ssh 連線到主節點:
[student@node-1] $| ssh mk8s-master-0
可使用以下命令在該主節點上獲取更高許可權:
[student@mk8s-master-0] $ sudo -i
另外,在主節點升級kubelet和kubectl。

kubectl config use-context mk8s
kubectl drain mk8s-master-0 --ignore-daemonsets
ssh mk8s-master-0
sudo -i
apt install kubeadm-1.20.1-00 -y
kubeadm upgrade plan
kubeadm upgrade apply v1.20.1 --etcd-upgrade=false # 題目要求不升級etcd
# 升級 kubelet 和 kubectl
apt install kubelet-l.20.1-00 kubectl-l.20.1-00 -y
systemctl restart kubelet
#設定為可排程
kubectl uncordon mk8s-master-0
# 檢視升級結果
kubectl get node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第四題 etcd備份與恢復
問題權重: 7%
此專案無需更改配置環境。但是,在執行此專案之前,請確保您已返回初始點:
[student@nk85- master-0] $ exit
Task
首先,為執行在https://127.0.0.1:2379上的現有etcd 例項建立快照並將快照儲存到/data/backup/etcd-snapshot.db
為給定例項建立快照預計能在幾秒鐘內完成。如果該操i作似乎掛起,則命令可能有問題。用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

答題:

# 備份
ETCDCTL_API=3 etcdctl snapshot save /data/backup/etcd-snap.db --cacert=/opt/KUIN00601/ca.crt --cert=/opt/KUIN00601/etcd-client.crt --key=/opt/KUIN00601/etcd-client.key --endpoints=https://127.0.0.1:2379
# 恢復
systemctl stop etcd
systemctl cat etcd # 確認下資料目錄(--data-dir 值)
mv /var/lib/etcd /var/lib/etcd.bak
ETCDCTL_API=3 etcdctl snapshot restore /data/backup/etcd-snapshot-previous.db --
data-dir=/var/lib/etcd
chown -R etcd:etcd /var/lib/etcd
systemctl start etcd
1
2
3
4
5
6
7
8
9
10
https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第五題 網路策略
問題權重: 7%

設定配置環境:
[studentinode-1] $ kubectl config use-context hk8s

Task

在現有的namespace my-app中建立一個名為allow-port-from-namespace 的新NetworkPolicy 。

確保新的NetworkPolicy 允許namespace my-app 中的Pods來連 接到namespace big-corp 中的埠8080 。

進一步確保新的 NetworkPolicy : 不允許對沒有在監聽埠8080的Pods的訪問 不允午不來自namespace my-app中的Pods的訪問

解題:

kubectl config use-context hk8s
#給名稱空間打標籤:
kubectl label namespace big-corp name=big-corp

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: my-app
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: big-corp
ports:
- protocol: TCP
port: 8080

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
參考文件:https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第六題 SVC 暴露應用
問題權重: 7%
設定配置環境:
[student@node-1] $| kubectl config use- context k8s

Task
請重新配置現有的部署front-end以及新增名為http的埠規範來公開現有容器nginx 的埠80/tcp。
建立一個名為front-end-svc的新服務,以公開容器埠http。
配置此服務,以通過在排定的節點上的NodePort來公開各個Pods

kubectl config use-context k8s
kubectl create deployment --image=nginx --port=80 front-end
kubectl edit deployment front-end修改port的名字
.....
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
name: http
protocol: TCP
.......
kubectl expose deployment front-end --port=80 --target-port=80 --type="NodePort" --name=front-end-svc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第七題:Ingress
問題權重: 7%
設定配置環境:
[student@mnode-1] $ kubectl config use-context k8s

Task
如下建立一個新的nginx Ingress 資源:

名稱: pong
Namespace: ing-internal使用服務埠5678 在路徑/hello. 上公開服務hello

可以使用以下命令檢查服務hello 的可用性,該命令應返回hello :
[student@node-1] $| curl -kL <INTERNAL_ IP>/hello

# 以下考試無需要操作
kubectl create ns ing-internal
kubectl create deployment hello --image=nginx --port=80 --namespace=ing-internal
kubectl expose deployment hello --port=5678 --target-port=80 --name=hello --namespace=ing-internal
kubectl exec -it hello-8fd7d4d77-2kdv9 -- /bin/bash -n ing-internal
echo "hello" > /usr/share/nginx/html/index.html
# 以下考試操作
cat 7.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
curl -kL <INTERNAL_ IP>/hello

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第八題 擴容 Pod 數量
問題權重: 4%
設定配置環境:
[student@node-1] $ kubeotl corfig use- context k8s
Task
將deployment 從loadbalancer 擴充套件至 5 pods

解題:

#以下考試不需要操作
kubectl create deployment loadbalancer --image=nginx --replicas=1
#以下考試操作
kubectl config use-context k8s
kubectl scale deployment loadbalancer --replicas=5
1
2
3
4
5
本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第九題 nodeSelector
問題權重: 4%
設定配置環境:
[student@node-1] $ kubectl config use-context k8s
Task
按如下要求排程一個 cod:
名稱: nginx-kusc00401
Image: nginx
Node selector: disk=ssd

解題:

# 以下考試無需要操作
kubectl label node k8s21-worker02 disk=ssd
# 以下考試操作
kubectl config use-context k8s

cat 9.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disk: ssd
kubectl apply -f 9.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第十題統計準備就緒節點數量
問題權重: 4%
設定配置環境:
[student@node-1] $ kubectl config use-context k8s

Task
檢查有多少worker nodes已準備就緒(不包括被打上Taint:
NoSchedule的節點),並將數量寫入
/opt/KUSC00402/kusc00402.txt

解題:

kubectl config use-context k8s
kubectl describe nodes $(kubectl get nodes | grep Ready| awk '{print $1}') | grep Tain | grep -vc NoSchedule > /opt/KUSC00402/kusc00402.txt
1
2
本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第十一題 Pod 配置多容器
問題權重: 4%
設定配置環境:
[student@node-1] $ kubectl config use-context k8s
Task
建立一個名為kucc4 的pod, 在pod裡面分別為以下每個images單獨執行一個app container (可能會有1-4個images) :
nginx + redis + memcached

解題:

kubectl config use-context k8s
cat 11.yaml
kind: Pod
apiVersion: v1
metadata:
name: kubcc4
spec:
containers:
- name: nginx
image: nginx
- name: redis
image: redis
- name: memcached
image: memcached

kubectl apply -f 11.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第十二題 建立 PV
問題權重: 4%
設定配置環境:
[student@node-1] $| kubectl config use-context hk8s
Task
建立名為app-data 的persistent volume,容量為2Gi,訪問模式為ReadWriteOnce 。volume 型別為hostPath, 位於/srv/app-data

答題:

kubectl config use-context hk8s
cat 12.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-data
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/srv/app-data"

kubectl apply -f 12.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第十三題 Pod 使用 PVC
問題權重: 7%
設定配置環境:
[student@node-1] $ kubectl config use- context ok8s
Task
建立一個新的PersistentVolumeClaim ;
名稱: pv-volume
Class: csi-hostpath-sc
容量: 10Mi
建立一個新的Pod, 此Pod將作為volume掛載到
PersistentVolumeClaim :
名稱: web-server
Image: nginx
掛載路徑: /usr/share/nginx/html

配置新的pod,以對volume具有ReadWriteOnce許可權。

最後,使用kubectl edit 或kubectl patch將PersistentVolumeClaim的容量擴充套件為70Mi,並記錄此更改。

kubectl config use- context ok8s
# cat 12.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: nfs-server
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
---
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: pv-volume
containers:
- name: web-server
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
kubectl apply -f 12.yaml
# 擴容 PVC 容量
kubectl edit pvc pv-volume --save-config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第十四題 獲取 Pod 錯誤日誌
問題權重: 5%

設定配置環境:
[student@node-1] $ kubectl config use-context k8s

Task
監控pod bar的日誌並:
提取與錯誤file-not-found 相對應的日誌行
將這些日誌行寫入/opt/KUTR00101/bar

kubectl logs bar | grep file-not-found > /opt/KUTR00101/bar
1
https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第十五題 給 Pod 增加一個容器(邊車)
問題權重: 7%
設定配置環境:
[studentnode-1] $ kubectl config use- context k8s
Context
將一個現有的Pod整合到Kubernetes的內建日誌記錄體系結構中(例如kubectl logs) 。新增streaning sidecar容器是實現此要求的一種好方法。
Task
使用busybox Image來將名為sidecar的sidecar容器新增到現有的Pod legacy-app 中。新的sidecar容器必須執行以下命令:
/bin/sh -c tail -n+1 -f /var/1og/legacy-app . log
使用安裝在/var/log的Volume,使日誌檔案legacy-app.log可用於sidecar容器。
除了新增所需的volume mount以外,請勿更改現有容器的規格。

kubectl config use-context k8s
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/legacy-app.log;
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
volumes: # volumes 塊在匯出的 yaml 下面已經有了,在已有的新增下面兩行即可
- name: varlog
emptyDir: {}

kubectl get pod legacy-app -o yaml > legacy-app.yaml # 匯出後修改檔案
kubectl delete pod legacy-app
kubectl apply -f legacy-app.yaml


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/

本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第十六題 統計使用 CPU 最高的 Pod
問題權重: 5%

設定配置環境:
[student@node-1] $ kubectl config use- context k8s

Task
通過pod label name=cpu-utilizer,找到執行時佔用大量CPU的
pod,並將佔用CPU最高的pod名稱寫入檔案
/opt/KUTR00401/KUTR00401.txt (已存在)

答題:

kubectl config use-context k8s
kubectl top pod -l name=cpu-utilizer --sort-by="cpu" –A # 然後將第一個 Pod 名稱寫到檔案
echo "<podname>" > /opt/KUR00401.txt
1
2
3
本部落格相關視訊連結: https://www.ixigua.com/7080166741921235492?id=7151713414783042085

第十七題 節點 NotReady 處理
問題權重: 13%

設定配置環境:
[student@node-1] $ kubectl config use-context wk8s

Task
名為wk8s-node-0 的Kubernetes worker node處於NotReady狀態。調查發生這種情況的原因,並採取相應措施將node恢復為Ready 狀態,確保所做的任何更改永久有效。

注意:

可使用以下命令通過ssh 連線到故障node:
[student@node-1] $ ssh wk8s-node-0
可使用以下命令在該node上獲取更高許可權:
[student@w8ks-node-0] $ sudo -i
1
2
3
4
答題:

kubectl config use-context wk8s
kubectl get node
ssh wk8s-node-0
sudo -i
systemctl status kubelet
systemctl start kubelet
systemctl enable kubelet