1.RBAC 4%
Task
創(chuàng)建一個名為deployment-clusterrole
且僅允許創(chuàng)建
以下資源類型的新ClusterRole
:
Deployment
StatefulSet
DaemonSet
在現(xiàn)有的namespace app-team1
中創(chuàng)建一個名為cicd-token
的新ServiceAccount
限于namespace app-team1
,將新的ClusterRole deployment-clusterrole綁定
到新的ServiceAccount cicd-token
Answer
# 創(chuàng)建clusterrole
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
# 創(chuàng)建serviceaccount
kubectl create serviceaccount cicd-token -n app-team1
# 創(chuàng)建rolebinding
kubectl -n app-team1 create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
# 查看rolebinding
kubectl describe rolebinding cicd-token-binding -n app-team1
知識點
1漫试、CluserRole庶诡、ServiceAccount舱权、RoleBinding
2.kubectl create clusterrole
3.kubectl create serviceaccount
4.kubectl create rolebinding
2.驅(qū)逐節(jié)點 4%
Task
將名為ek8s-node-1
的節(jié)點設(shè)置為不可用祥诽,并重新調(diào)度在其上運行的所有pod
Answer
kubectl drain ek8s-node-1 -- ingore-daemonsets --force
知識點
1.kubectl cordon
2.kubectl drain
3.kubectl delete
4.kubectl uncordon
3. 集群升級 7%
Task
現(xiàn)有的Kubernetes集群正在運行版本1.18.8.僅將主節(jié)點上的所有Kubernetes控制平面和節(jié)點組件升級到版本1.19.0
另外锥余,在主節(jié)點上升級Kubelet和Kubectl
確定在升級之前drain主節(jié)點饼煞,便在升級后uncordon主節(jié)點源葫。請不要升級工作節(jié)點、etcd砖瞧、container管理器息堂、cni插件、dns服務(wù)或者任何其他插件块促。
Answer
注意:需要ssh到master節(jié)點上執(zhí)行荣堰,即在k8s集群內(nèi)操作
# ssh到master節(jié)點
ssh master-1
# 切換到root
sudo -i
# ubantu環(huán)境補充kubectl命令
source <(kubectl completion bash)
#
kubectl drain master-1 -- ingore-daemonsets
#
apt-cache show kubeadm | grep 1.19.0
#
apt-get install kubeadm=1.19.0-00
#
kubeadm --version
#
kubeadm upgrade apply 1.19.0 --etcd-upgrade=false
#
apt-get install kubelet=1.19.0-00
#
kubelet --version
# 會看到兩個版本,客戶端版本和服務(wù)器版本都是1.19.0才是成功
kubectl --version
# 把master恢復(fù)調(diào)度竭翠,由“Ready振坚,SchedulingDisabled”變成“Ready”
kubectl uncordon master-1
# 回到student視圖下
exit
exit
知識點
kubectl upgrade
4.ETCD備份恢復(fù) 7%
Task
首先,為運行在https://127.0.0.1:2379
上的現(xiàn)有etcd實例創(chuàng)建快照并將快照保存到/var/lib/backup/etcd-snapshot.db
然后還原位于/var/lib/bakup/etcd-snapshot-previous.db
提供了以下TLS證書與密鑰斋扰,以通過etcdctl連接到服務(wù)器
CA證書:/opt/KUIN00601/ca.cert
客戶端證書:/opt/KUIN00601/etcd-client.crt
客戶端密鑰:/opt/KUIN00601/etcd-client.key
Answer
注意:需要ssh到master節(jié)點上執(zhí)行屡拨,即在k8s集群內(nèi)操作
# ssh到master節(jié)點
ssh master-1
# 必須指定etcdctl的版本是3
export ETCDCTL_API=3
# 創(chuàng)建etcd快照
ectdctl --endpoints=https://127.0.0.1:2379 --cacert="/opt/KUIN00601/ca.cert" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot save /var/lib/backup/etcd-snapshot.db
# 查看保存快照的狀態(tài)
ectdctl --endpoints=https://127.0.0.1:2379 --cacert="/opt/KUIN00601/ca.cert" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot status /var/lib/backup/etcd-snapshot.db -wtable
# 恢復(fù)etcd快照
etcdctl snapshot restore /var/lib/bakup/etcd-snapshot-previous.db
# 查看恢復(fù)快照的狀態(tài)
etcdctl snapshot status /var/lib/bakup/etcd-snapshot-previous.db -wtable
# 回到student視圖下
exit
exit
知識點
1.必須指定etcdctl的版本是3
2.kubectl snapshot save
3.kubectl snapshotrestore
4.kubectl snapshotstatus
5.網(wǎng)絡(luò)策略 4%
Task
在已有的namespace foobar
中創(chuàng)建一個名為allow-port-from-namespace
的新NetworkPolicy
,以允許namespace corp-bar
訪問其Pods的端口9200
Answer
從官方文檔粘貼networkpolicy的樣例到本地yaml文件中褥实,再根據(jù)考試內(nèi)容修改呀狼。
粘貼時候注意格式,在vim
編輯器中损离,先用:set paste
哥艇,然后再粘貼。
vi nw.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: foobar
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: corp-bar
ports:
- protocol: TCP
port: 9200
kubectl apply -f nw.yaml
kubectl get neworkpolicies -n foobar allow-port-from-namespace
知識點
6.SVC 4%
Task
重新配置現(xiàn)有的deployment front-end僻澎,并添加名為HTTP的端口規(guī)范貌踏,以暴露現(xiàn)有容器nginx的端口80/tcp。
創(chuàng)建一個名為front-end-svc的新服務(wù)窟勃,以暴露容器端口HTTP祖乳。
配置新服務(wù)以通過調(diào)度它們的節(jié)點上的NodePort暴露各個Pod。
Answer
# 修改deployment
kubectl edit deployments front-end
在template.spec.containers的name下面增加ports
name: nginx
ports:
- containerPort: 80
name: http
# 創(chuàng)建svc
kubectl create svc nodeport front-end-svc --tcp=80:80
# 測試(不通的話可能depoyment和svc標簽不一致)秉氧,建議在集群內(nèi)節(jié)點執(zhí)行
curl <CLUSTER_IP>
# 查看標簽
kubectl get svc front-end-svc --show-labels
或者最直接方式
kubectl expose deployment front-end --port=80 --target-port=80 --protocol=TCP --type=NodePort --name=front-end-svc
知識點
1.kubectl create svc
2.kubectl expose
7.Ingress 7%
Task
創(chuàng)建一個名為nginx的Ingress并遵守以下規(guī)則
Name:pong
Namespace: ing-internal
Exposing service hello on path /hello 使用端口5678
驗證
curl -kL <INTERNAL_IP>/hello
Answer
從官網(wǎng)粘貼ingress的實例眷昆,并進行修改。
vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
kubectl apply -f ingress.yaml
kubectl get ingress pong -n ing-internal
知識點
8.擴容 4%
Task
將deployment web-service
擴容到4個pods
Answer
kubectl scale deployment web-service --replicas=4
知識點
9.通過node標簽調(diào)度pod 4%
Task
按以下規(guī)則調(diào)度pod:
name:nginx-kusc00401
image:nginx
Node selector:disk=ssd
Answer
kubectl run nginx-kusc00401 --image=nginx --dry-run=client -o yaml > 9.yaml
vi 9.yaml
增加NodeSelector
containers:
- image: nginx
name:
resources: {}
nodeSelector:
disk: ssd
...
kubectl apply -f 9.yaml
知識點
1.kubectr run
2.標簽選擇器(節(jié)點標簽選擇器)
10.節(jié)點數(shù)量 4%
Task
檢查并查看有多少個節(jié)點準備就緒(不包括已獲得Noschedule的節(jié)點)并將其寫入 /opt/KUSC00402/kusc00402.txt
Answer
kubectl get node | grep Taint
echo 2 > /opt/KUSC00402/kusc00402.txt
知識點
11.創(chuàng)建多容器pod 4%
Task
創(chuàng)建一個名為kucc8
的pod,并且使用以下鏡像(可能指定了1至4個鏡像)
nginx+redis+memcached+consul
Answer
kubectl run kucc8 --image=nginx --dry-run=client -o yaml > 11.yaml
vi 11.yaml
containers:
- name: nginx
image: nginx
- name: redis
image: redis
- name: memcached
image: memcached
- name: consul
image: consul
kubectl apply -f 11.yaml
kubectl get pod
知識點
1個pod啟多個不同鏡像容器
12.pv 4%
Task
創(chuàng)建一個名為app-confi
g的pv
亚斋,1Gi
大小作媚,權(quán)限為ReadOnlyMany
使用hostPath
類型掛載到本地位置為/srv/app-config
Answer
從官網(wǎng)粘貼pv的yaml創(chuàng)建示例,并進行修改帅刊。
vi pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/srv/app-config"
kubectl apply -f pv.yaml
kubectl get pv
知識點
13.pvc 7%
Task
創(chuàng)建一個pvc
滿足以下要求:
Name: pv-volume
Class: csi-hostpath-sc
Capcity: 10Mi
創(chuàng)建一個pod并掛載PVC:
name: test
image: nginx
Mount path: /usr/share/nginx/html
編輯pod vulume權(quán)限為ReadWriteOnce
最后纸泡,使用kubectl edit 或者kubectl patch講pvc大小改為70Mi
Answer
從官網(wǎng)粘貼pvc的yaml創(chuàng)建示例,并進行修改赖瞒。
vi pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: csi-hostpath-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
kubectl apply -f pvc.yaml
# 查看pvc狀態(tài)女揭,應(yīng)該是Bound?栏饮?田绑?
kubectl get pvc
vi pod-pvc.yaml
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
kubectl apply -f pod-pvc.yaml
kubectl get pod
kubectl get pvc
# 英文要求注意加上--record,可以在history看到
kubectl edit pvc pv-volume --record
知識點
14.輸出日志 5%
Task
監(jiān)控bar的日志
并將error字段內(nèi)容輸出到/opt/KUTR00101/bar
Answer
pod為bar的日志
kubectl logs bar | grep error >> /opt/KUTR00101/bar
知識點
kubectl logs
15.sidecar 13%
Task
在pod big-corp-app中增加一個busybox的sidecar抡爹,新的sidecar容器使用以下命令:
/bin/sh -c tail -n+1 -f /var/log/big-corp-app.log
掛載一個卷的名字叫做logs并確保/var/log/big-corp-app.log文件在sidecar中可達
不要修改已經(jīng)存在的容器
不要修改日志路徑與文件
Answer
kubectl get pod big-corp-app -o yaml > 15.yaml
vi 15.yaml 增加如下內(nèi)容(按照文件內(nèi)容分條增加文件中):
volumeMounts:
- name: logs
mountPath: /var/log
- name: busybox
image: busybox
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/big-corp-app.log']
volumeMounts:
- name: logs
mountPath: /var/log
volumes:
- name: logs
emptyDir: {}
# 不要修改已經(jīng)存在的容器
kubectl delete -f 15.yaml
kubectl apply -f 15.yaml
# 驗證新加的容器
kubectl logs big-corp-app busy-box
kubectl exec big-corp-app -c busybox -- tail -f /var/log/big-corp-app.log
# 驗證原來的容器(考試中的)
kubectl exec big-corp-app -c count -- tail -f /var/log/big-corp-app.log
知識點
16.top 13%
Task
從pod標簽
為name=cpu-loader
中找到CPU負載最大
的pod名稱
掩驱,并輸出到/opt/KUTR00401/KUTR00401.txt
(該文件已經(jīng)存在)
此題中文翻譯有問題,文件名中文是3個連續(xù)0冬竟,英文是2個連續(xù)0
Answer
kubectl top pod -A -l name=cpu-loader --sort-by='cpu'
echo <pod名稱> >> /opt/KUTR00401/KUTR00401.txt
知識點
17.kubelet 13%
Task
名為wk8s-node-0的工作節(jié)點狀態(tài)為NotReady欧穴,找到并解決此問題
Answer
需要ssh到wk8s-node-0上執(zhí)行命令
# 查看kubelet狀態(tài)
systemctl status kubelet
# 啟動kubelet
systemctl start kubelet
# 使kubelet服務(wù)開機開啟
systemctl enable kubelet
# 查看kubelet狀態(tài)
system status kubelet
# 驗證node節(jié)點狀態(tài)是Ready
kubectl get nodes
知識點
其它
1.考試環(huán)境ubantu,因此需要先進行命令補全
source <(kubectl completion bash)
原視頻如下:
1.Certified Kubernetes Administrator CKA 2020年12月題庫講解(上)
2.Certified Kubernetes Administrator CKA 2020年12月題庫講解(下)