以下都是一個97分匿名大佬分享的CKA考試前的練習記錄,分享給大家供大家參考,練習題與考試題不一定一致,但符合考試大綱,供大家平常聯系使用,練習環境配置點擊前往
一:RBAC權限授權題
- 創建名稱 deployment-clusterrole 的 ClusterRole
- 該角色具備創建 Deployment、Statefulset、Daemonset 的權限
- 在命名空間 app-team1 中創建名稱為 cicd-token 的 ServiceAccount
- 系結 ClusterRole 到 ServiceAccount,且限定命名空間為 app-team1
習題答案
# 先創建ns,clusterrole,serviceaccount
kubectl -n app-team1 create clusterrole deployment-clusterrole --verb=create --resource=deployment,statefulset,daemonset
kubectl -n app-team1 create serviceaccount cicd-token
# 將剛剛創建的ClusterRole與ServiceAccount相互系結,因題目沒有說所以我們自己命名為 “cicd-clusterrole”,因權限控制在命名空間級別的所以我們使用 rolebinding
kubectl -n app-team1 create rolebinding cicd-clusterrole --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
二:設定節點不可用并驅除pods
- 設定 ek8s-node-1 節點為不可用
- 重新調度該節點上的所有 pod
習題答案
kubectl cordon ek8s-node-1
kubectl drain ek8s-node-1 --ignore-daemonsets --delete-emptydir-data --force
# 完成后一定要通過 get nodes 加以確認
# 需要加上 --ignore-daemonsets 引數否則可能無法驅逐pod,
三:master升級k8s版本
- 升級 master 節點為1.21.0
- 升級前確保drain master 節點
- 不要升級worker node 、容器 manager、 etcd、 CNI插件、DNS 等內容
習題答案
# 需要先遠程到master節點上操作哦
kubectl cordon mk8s-master-0
kubectl drain mk8s-master-0 --ignore-daemonsets
apt-get update && apt-get install -y kubeadm=1.20.1-00 kubelet=1.20.1-00 kubectl=1.20.1-00
kubeadm upgrade plan
kubeadm upgrade apply v1.20.1 --etcd-upgrade=false
# 回退一下coredns版本,也可不會退,因為etcd并不一定隨著集群的升級升級etcd
// kubectl rollout undo deployment coredns -n kube-system
kubectl uncordon mk8s-master-0
四:備份還原etcd
- 備份 https://127.0.0.1:2379 上的 etcd 資料到 /var/lib/backup/etcd-snapshot.db
- 使用之前的檔案 /data/backup/etcd-snapshot-previous.db 還原 etcd(因是練習環境所以就直接使用剛剛備份到那個檔案還原就行了)
- 使用指定的 ca.crt 、 server.key 、server.crt
備份還原命令區別不大就是路徑不同,還一個就是一個save,一個是restore,其他都一樣的哈,在練習的時候如果沒有
etcdctl命令的可以通過docker cp d2ba65a64ae1:/usr/local/bin/etcdctl /usr/local/bin/etcdctl復制docker內部命令到宿主機安裝一下,
習題答案
注意??: 不要遠程任何機器,比方你剛剛升級到時候是遠程到了master機器上的,那么做這一步之前 退出來,退回你剛做題的那臺機器,
# 備份
ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key --cacert=/etc/kubernetes/pki/etcd/ca.crt snapshot save etcd-snapshot.db /var/lib/backup/etcd-snapshot.db
#還原
##1.停止etcd
systemctl stop etcd
##2.然后也備份一下原來etcd的檔案夾
mv /var/lib/etcd /var/lib/etcd.bak
##3.恢復資料
ETCDCTL_API=3 etcdctl snapshot restore /data/backup/etcd-snapshot.db --data-dir=/var/lib/etcd
##4.修改檔案權限
chown -R etcd:etcd /var/lib/etcd
#4. 啟動etcd
systemctl start etcd
官網檔案
五:配置網路策略 NetworkPolicy
這題的操作有待討論,但考試的換就照著題的順序來就是了,題目讓你在什么命名空間下創建那就在指定命名空間創建就行了,練習yaml如下:
真題一:
- 在命名空間 fubar 中創建網路策略 allow-port-from-namespace
- 只允許 ns my-app 中的 pod 連上 fubar 中 pod 的 80 埠
注意: 這里有 2 個 ns ,一個為 fubar(目標pod的ns),另外一個為 my-app(訪問源pod的ns)
習題答案
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: fubar
spec:
podSelector:
#選擇所有pod,這里是目的地址
matchLabels: {}
policyTypes:
- Ingress
ingress:
- from:
# from是源,源地址訪問??上面的目標地址做的一個訪問策略
- namespaceSelector:
# 注意考試時這里需要看一下ns的標簽,根據考試時的標簽來決定,如果沒有標簽就自己在命名空間上打一個標簽
matchLabels:
my-app-key: my-app-value
podSelector: # 此處podSelector前不要加 - ,加了則表示furbar 中的pod都可以訪問furbar的80埠
matchLabels: {}
ports:
- protocol: TCP
port: 80
注意:
據說考試的時候可能是同一命名空間也可能是不通命名空間,所以建議兩種都會,yaml檔案中會使用到標簽,所以需要查看命名的labels,然后在 namespaceSelector 中添加對應的labels;很多考過的小伙伴反應實際考試的時候沒有label,因此建議實際考試的時候加一個label;查看標簽命令則為kubectl get ns --show-label
真題二:
創建一個名為allow-port-from-namespace的新 NetworkPolicy,以允許現有namespace internal 中的 Pods連接到同— namespace 中其他Pods的埠 8080,
確保新的NetworkPolicy :
- 不允許對沒有在監聽埠8080 的Pods的訪問
- 不允許不來自 namespace internal 的Pods 的訪問
習題答案
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: internal
spec:
podSelector:
matchLabels: {}
policyTypes:
- Ingress
ingress:
- from:
# 允許當前ns下的所有pod訪問當前ns下的pod的8080埠
- podSelector: {}
ports:
- protocol: TCP
port: 8080
官網檔案
六:創建 service
- 重新配置已有的 deployment front-end,添加一個名稱為 http 的埠,暴露80/TCP
- 創建名稱為 front-end-svc 的 service,暴露容器的 http 埠
- 配置service 的類別為NodePort
習題答案
kubectl edit deployment front-end
……………………………………
containers:
- image: nginx:1.18.0
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
name: http
protocol: TCP
# 2)expose 對應埠,創建完后注意一下標簽選擇是否正確,可使用curl測驗一下是否能通
kubectl expose deployment front-end --type=NodePort --port=80 --target-port=80 --name=front-end-svc
這題答案有待考證,據考97分的大佬匿名提示可能就是這題錯了,因為題干是說暴露容器http埠,但考試時,寫的則是80所不符合題干,考試的時候可以嘗試一下,命令如下:
kubectl expose deployment front-end --type=NodePort --port=80 --target-port=http --name=front-end-svc
官網檔案
七:要求創建 Ingress 資源
- 創建一個新的 Ingress 資源,名稱 ping,命名空間 ing-internal
- 使用 /hello 路徑暴露服務 hello 的 5678 埠
習題答案
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ping
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
# 創建成功后, 通過get ingress 查看ingress的內外IP,然后通過提供的 curl 測驗 ingress 是否正確,正常情況下是會輸出 hello 的 (考試未出現ip,有待考證,應該是沒問題的,97分匿名大佬也是這么考的)
官網檔案
八:擴容 deployment
- 擴容 deployment guestbook 為 6個pod
習題答案
# 切換 context
kubectl scale deployment --replicas=6 guestbook
官網檔案
九:調度 pod 到指定節點
- 創建 pod 名稱 nginx-kusc0041,鏡像 nginx
- 調度該 pod 到 disk=ssd 的節點上
習題答案
#切換 context
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc0041
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disk: ssd
官網檔案
十:統計 ready 狀態節點數量
- 統計ready狀態節點
- 要求不包括 NoSchedule 的節點
習題答案
#切換 context
kubectl get nodes
kubectl describe nodes | grep -i taint | grep NoSchedule
#兩者資料相減,echo number > /path/file
官網檔案
十一:創建多容器的 pod
- 創建名稱為 kucc1 的 pod
- pod 中運行 nginx 和 redis 兩個示例
習題答案
apiVersion: v1
kind: Pod
metadata:
name: kucc1
spec:
containers:
- name: nginx
image: nginx
- name: redis
image: redis
官網檔案
十二:按要求創建 PV
- 創建一個名為 app-config 的PV,PV的容量為2Gi,訪問模式為 ReadWriteMany,volume 的型別為 hostPath
- pv 映射的 hostPath 為 /srv/app-config 目錄
習題答案
# 切換 context
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: /srv/app-config
官網檔案
十三:創建和使用 PVC
- 使用指定 storageclass csi-hostpath-sc 創建一個名稱為 pv-volume 的 pvc,容量為 10Mi
- 創建名稱為 web-server 的pod,將 nginx 容器的 /usr/share/nginx/html 目錄使用該 pvc 掛載
- 將上述 pvc 的大小從 10Mi 更新為 70Mi,并記錄本次變更
習題答案
# 切換 context
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
storageClassName: csi-hostpath-sc
vim 13.2.yaml
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: mypv
volumes:
- name: mypv
persistentVolumeClaim:
claimName: pv-volume
# 13.3
kubectl edit pvc pv-volume --record
更改 spec.resources.requests.storage 10Mi 為 70Mi,最下面的那個10Mi就不用改
# 保存后并不會立即生效,先不用管,等做完了再回來確認一下即可
十四:監控 pod 的日志
- 監控 foobar pod 中的日志
- 獲取包含 unable-to-access-website 的日志,并將日志寫入到 /opt/KUTR00101/foobar
# 切換 context
kubectl logs foobar | grep unable-to-access-website > /opt/KUTR00101/foobar
官網檔案
十五:添加 sidecar 容器并輸出日志
- 添加一個 sidecar 容器(使用busybox 鏡像)到已有的 pod 11-factor-app 中
- 確保 sidecar 容器能夠輸出 /var/log/11-factor-app.log 的資訊
- 使用 volume 掛載 /var/log 目錄,確保 sidecar 能訪問 11-factor-app.log 檔案
# 相對應的欄位下添加內容,洗掉重復欄位即可,
volumeMounts: ##這個欄位是重復的
- name: varlog
mountPath: /var/log
- name: busybox
image: busybox
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/11-factor-app.log']
volumeMounts:
- name: varlog
mountPath: /var/log
volumes: ##這個欄位是重復的
- name: varlog
emptyDir: {}
下面是一個匿名大佬提供的考試時的步驟,大家將就看下吧,沒截全,volumes欄位在下面看不到的

官網檔案
十六:查看 cpu 使用率最高的 pod
- 查找 label 為
name=cpu-user的 pod - 篩選出 cpu 負載最高的那個 pod,并將名稱 追加 到 /opt/KUTR00401/KUTR00401.txt
如果是你自己部署的k8s那么是沒有
top這個子命令的,需要安裝,步驟如下:
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.1/components.yaml
# 修改yaml檔案
…………………………
kind: Deployment
……………………………………
containers:
# 在原來的基礎上添加下面的配置
- args:
- /metrics-server
- --cert-dir=/tmp
- --secure-port=443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
- --kubelet-insecure-tls
image: registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.5.1
# 修改apiyaml檔案
vim /etc/kubernetes/manifests/kube-apiserver.yaml
......
spec:
containers:
- command
# 在原來的基礎上添加配置
- --enable-aggregator-routing=true
# 部署
kubectl apply -f components.yaml
習題答案
kubectl top pod -l name=cpu-user --sort-by=cpu | awk '(NR==2){print $1}' >> /opt/KUTR00401/KUTR00401.txt
十七:排查集群中故障節點
- 節點 wk8s-node-0 狀態為 NotReady,查看原因并恢復其狀態為 Ready
- 確保操作為持久的
ssh wk8s-node-0
systemctl start kubelet
systemctl enable kubelet
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/379099.html
標籤:其他
