CKA考试心得
考前須知:
1、一共16題,100分66分及格,考試有兩次機會
考試準備:
1、護照或或者包含英文名字證件
2、要選擇工作日的早上或者晚上考試,千萬不要選擇周末去考,否則卡到懷疑人生,影響考試結果
3、提前1小時等待考試,關閉VM,webex、teams等服務就花了30分鐘。
題目:
1、RBAC 4%
題目:
為部署管道創建一個新的ClusterRole并將其綁定特定的namespace的特定的ServiceAccount
Task?
創建一個名為deployment-clusterrole且僅允許創建以下類型的新Clusrerrole
Deployment
Statefulset
Damonset
在現有的namespace app-team1中創建一 個名為cicd-token的新serviceaccount
限于namespace app-team1, 將新的Clusterrole? deployment-clusterrole綁定到新的serviceaccount cicd-token
?答題:
創建clusterrole
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,damemonsets
創建sa
kubectl? -n app-team1 create? serviceaccount cicd-token
創建rolebinding?? 【如果題目中沒有指定名稱空間,則創建的是 cluster-rolebonding,如果有namespace 則創建的是 rolebonding】
kubectl? -n? app-team1 create rolebinding? cicd-token-binding? --clusterrole=deployment-clusterrole? --serviceaccount=app-team1: cicd-token
檢查:
$ kubectl auth can-i create deployment -n app-team1--as=system:serviceaccount: app-team1: cicd-token
YES
2、驅逐節點
將名為k8s-node-t 的節點設置為不可用,且重新調度到其他運行的所有pod
答題:
Kubectl?? drain? slave1? --delete-emptydir-data ?--igon
ore-daemonsets? --force
3、集群升級
現有的kubenets集群正在運行版本為1.18.8僅將主節點上的所有kubenets控制平臺和節點組件升級版本至1.19.0
另外在主節點上升級kubectl的kubelet
確認在升級之前drain主節點,且在升級后uncorder主節點,請不要升級工作節點,etcd,constainer控制器,CNI組件,DNS服務或者其他任何組件
答題:
1、登陸root的 master
2、source <{}kubectl complction bash>? \\這個考試環境不需要執行
3、kubectl drain master-1 --ingore-damensets?? 這個考試環境不需要--delete-emptydir-data ?
4、apt-cache? show kubeadm | grep 1.19.0
5、apt-get install kubeadm=1.19.0-00
6、kubeadm? version???
7、kubeadm upgrade apply 1.19.0? --etcd-upgrade=false??? 并選擇y
8、apt-get install? kubelet=1.19.0-00???????????? &&? kubelet --version
9、kubectl? get nodes? 發現master 不可調度??? &&?? kubectl? uncordcn? master-1
4、ETCD備份還原
首先,為運行在http://127.0.0.1:2379上的etcd實例創建快照,并保存到指定路徑? /var/lib/backup/etcd-snapshot.db
然后還原于 /var/www/etcd/xxxx.db
服務提供了以下TLS證書和秘鑰,以通過etcdctl鏈接到服務器
CA證書: 客戶端證書;? 客戶端秘鑰
答案: ??//考試環境在node1上執行 不需要切換環境
1、指定etcdctl版本為v3????? export ETCDCTL_API=3
2、備份命令:etcdctl? --endpoints=https://127.0.0.1:2379? --cacert="/opt/Kuxxxx/ca.crt"? --cert="/opt/Kuxxxx/server.crt" --key="/opt/Kuxxxx/server.key" snapshot? save?? /var/lib/backup/etcd-snapshot.db
檢查命令: etcdctl? --endpoints=https://127.0.0.1:2379? --cacert="/opt/Kuxxxx/ca.crt"? --cert="/opt/Kuxxxx/server.crt" --key="/opt/Kuxxxx/server.key" stapshot? status? /var/lib/backup/etcd-snapshot.db -wtable
3、還原?? etcdctl? snapshot restore? /var/lib/backup/etcd-snapshot.db cacert="/opt/Kuxxxx/ca.crt"? --cert="/opt/Kuxxxx/server.crt" --key="/opt/Kuxxxx/server.key" stapshot?
檢查命令:? etcdctl? snapshot? status? /var/lib/backup/etcd-snapshot.db -wtable
5、網絡策略
在已有的namespace forbar中創建一個名為allow-port? from namespace的新Network policy ,以允許namespace corp-bar訪問其端口9200
不同namespace的情況下:
//需要給namespace? corp-bar打標 ??project: corp-bar
kubectl label namespace? corp-bar project:corpbar
Vim? 5.yml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
? name: allow-port? from namespace
? namespace: forbar
spec:
? podSelector:
??? {}
? policyTypes:
??? - Ingress
? ingress:
??? - from:
??????? - namespaceSelector:
??????????? matchLabels:
????????????? project: corp-bar
?????? ports:
???????? - protocol: TCP
?????????? port: 9200
相同namespace的情況下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
? name: allow-port? from namespace
? namespace: forbar
spec:
? podSelector:{}
? policyTypes:
??? - Ingress
? ingress:
??? - from:
??????? - podSelector: {}?????
?????? ports:
???????? - protocol: TCP
?????????? port: 9200
Kubectl apply -f? 5.yml
6、SVC
重新配置現有的deployment frond-end? 并添加名為http的端口規范,以暴露現有容器nginx的端口80/TCP
創建一個名為plant-end-svc的新服務,以暴露容器端口HTTP
配置新服務以通過調度它們的節點上的Node? port暴露各個pod
解答:
1、kubectl? get deployment.apps
2、kubectl? edit deployment.apps
在name: nginx下增加
????????? ports:
- containerPort: 80
? name:? http
3、創建svc?
Kubectl? create? svc? nodeport? front-end-svc --tcp=80:80
修改標簽??? 與deployment的pod標簽一致
查看標簽: kubectl? get? svc front-end-svc? --show-labels
修改app: front-end
//必須要改 否則不通,需要登陸到 master節點 去 curl? svc的ip地址 ?為 nginx就可以了
kubectl? edit? svc front-end-svc?
修改app: front-end-svc? 為app: front-end
7、ingress
創建一個名為nginx的ingress并遵守以下規則:
Name? pong
Namespace? ing-internal
Exposing service hello on? path/test 使用端口5678
驗證: curl -Kl?? <INTERNAL_IP>/hello
//這個需要把要把原有的service 從 nodeport改成clusterip
?Kubectl? edit? service hello 修改 ?type nodeport改成clusterip
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
8、擴容
將deployment?? web-server擴容到4個
Kubectl? get? delolyments.apss
Kubectl scale? deployment web-server? --replicas=4
9、通過node標簽調度pod
按以下規則調度pod:
Name? nginx.kusc004001
Image? nginx
Node? selector : disk ssd
解答:
1、kubectl? get nodes? --show-labels
2、kubectl run? nginx.kusc004001 --image=nginx --dry-run=client -oyaml > 9.yaml
3、編輯yaml文件,在resource下 添加
nodeSelector:?
???? disk: ssd
10、節點數量
檢查并查看有多少節點準備就緒(不包括不可調度的節點)并將其寫入/opt/1.txt
Kubectl describe? node|grep? Taint?
None 有2個
echo 2 > /opt/1.txt
11、創建多容器
創建一個名為kucc3的pod,并且使用以下鏡像(可能包含了1到4個鏡像)
Nginx+redis+memached+coocsal
解答:
kubectl run? nginx.kusc004001kucc3 --image=nginx --dry-run=client -oyaml > 11.yaml
增加另外三個image
12、PV
創建一個名為app.config的pv、1G大小、權限為ReadOnlyMany使用hostpath類型掛載到本地位置priveage-config
apiVersion: v1
kind: PersistentVolume
metadata:
? name: app.config
? labels:
??? type: local
spec:
??? capacity:
??? storage: 1Gi
? accessModes:
??? - ReadWriteOnce
? hostPath:
??? path: "/mnt/data"
13、PVC
創建一個pvc滿足以下要求:
name: pv-volume
class: cni-hostpath-vc
Cagcity:?? 10Mi
創建一個pod并掛載pvc
name: test
image: nginx
Mount path? /usr/share/nginx/
編輯pod volume權限為readonlyOnce
最后,使用kubectl? edit或者kubectl patch將pvc大小改為70Mi
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
? name: pv-volume
spec:
? storageClassName: ?cni-hostpath-vc
? accessModes:
??? - ReadWriteOnce
? resources:
??? requests:
????? storage: 10Mi
apiVersion: v1
kind: Pod
metadata:
? name: test
spec:
? volumes:
??? - name: pv-volume
????? persistentVolumeClaim:
??????? claimName: pv-volume
? containers:
??? - name: nginx
????? image: nginx
????? ports:
??????? - containerPort: 80
????????? name: "http-server"
????? volumeMounts:
??????? - mountPath: "/usr/share/nginx/html"
????????? name: pv-volume
14、輸出日志
監控pod的日志
并將error字段的日志輸出到/var/log/1.txt
Kubectl run bar --image=nginx
Kubectl? logs?? bar?? |grep ‘題目的關鍵字’ > /var/log/1,txt
15、sidecar
在pod? big-corp-app中增加一個busybox的sitecar。新的sidecar容器使用以下命令:
/bin/sh < tailf? -n+1 /var/log/app.log
掛載一個logs卷并確保 /var/log/app.log文件在 sidecar中可達
不要修改已經存在的容器
不要修改日志路徑與文件
解答:
1、kubectl? get pod? big-corp-app -oyaml > 15.yaml
2、在15.yaml中編輯
??? volumeMounts:下面增加
??? - name: logs
????? mountPath: /var/log
? - name: busybox
??? image: busybox:1.28
??? args: [/bin/sh, -c, 'tail -n+1 -F /var/log/app.log']
??? volumeMounts:
??? - name: logs
????? mountPath: /var/log
? volumes:增加
? - name: logs
??? emptyDir: {}
16 top
從pod標簽為name-cpu-loader中找到CPU負載最大的pod名稱,并輸出到 log、中
解答:
Kubectl? top? pod? -A? -l? app=fannel? --sort-by='cpu'
echo? 'cpu使用最大的pod的名字'? > log
17 kubelet
名為k8s-node-C的工作節點狀態為Notready,找到并解決問題
解答:
Ssh?? k8s-node-C節點上
Systemctl? start kubelet
Systemctl? enable kubelet
總結
- 上一篇: 【bzoj4972】小Q的方格纸 前缀
- 下一篇: 使用svn报错之An error occ