CKA考题 [k8s1.21]
文章目录
- 第一题
- 第二题
- 第三题
- 第四题
- 第五题
- 第六题
- 第七题
- 第八题
- 第九题
- 第十题
- 第十一题
- 第十二题
- 第十三题
- 第十四题
- 第十五题
- 第十六题
- 第十七题
【摘要】 (CKA)认证Kubernetes管理员,由Linux基金会和云原生计算基金会(CNCF)推出,是关于kubernetes技术的官方认证。考试环境kubernetes1.21。考试共计17道题,线上考试,2小时之内完成。
题目来自 华为云社区 :https://bbs.huaweicloud.com/blogs/301628
第一题
任务:
使用kubectl config use-context k8s。
- 创建 名字为deployment-cluserrole的ClusterRole,可以创建Deployment,StatefulSet,DaemonSet。
- 在namespace名字为app-team1下创建名字为cicd-token的ServiceAccount。
- 将创建好的ClusterRole和cicd-token进行绑定。
答案:
切换到kubectl config use-context k8s。
kubectl create clusterrole deployment-clusterrole--verb=create--resource=Deployment,StatefulSet,DaemonSet
kubectl -n app-team1 create serviceaccourt cicd-token
kubectl create rolebinding cicd-token --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --namespace=app-team1
- 验证
kubectl describe -n app-team1 rolebindings cicd-bind
第二题
任务:
使用kubectl config use-context ek8s。
- 名字为ek8s-node-0的节点,设置为不可用。
答案:
切换到kubectl config use-context ek8s。
kubectl drain ek8s-node-0 --ignore-daemonsets --force
- 验证
kubectl describe ek8s-node-0
第三题
任务:
使用kubectl config use-context mk8s。
- Master节点使用Kubeadm将升级至1.21.1。升级前master设置drain,升级后恢复uncordon。
- Kubelet和kubectl同样升级,但是etcd不升级。
答案:
切换到kubectl config use-context mk8s
# (确定哪个node是master )
kubectl get nodes
kubectl drain ek8s-node-0--ignore-daemonsets --force
# 登录节点,并sudo -i 授权
ssh master
apt-get install -y kubeadm=1.21.1-00
# (验证)
Kubeadm upgrade plan
Kubeadm upgrade apply v1.21.1 --etcd-upgrade=false
Apt-get install -y kubelet=1.21.1-00 kubectl=1.21.1-00
systemctl daemon-reload
systemctl restart kubelet
#Exit(返回到mk8s)
kubectl uncordon ek8s-node-0
- 验证
#(查看状态是否非unschedule)
kubectl describe ek8s-node-0
第四题
任务:
- 对etcd进行备份。
- 用/srv/data/etcd-snapshot-previous.db恢复etcd。
答案:
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert=/opt/KUIN00601/ca.crt --cert= --key=/opt/KUIN00601/etcd-client.crt \ --key=/opt/KUIN00601/etcd-client.key snapshot save /data/backup/etcd-snapshot.db
ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 snapshot restore /srv/data/etcd-snapshot-previous.db
第五题
任务:
使用kubectl config use-context hk8s。
- 创建一个名字为allow-port-from-namespace的NetworkPolicy,只允许NS为internal的pod允许通过80端口访问NS为fubar的pod。
答案:
切换到kubectl config use-context hk8s。
# (查看internal的标签)
Kubectl get ns --show-labels
Vim NetworkPolicy.yaml
# 如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: fubar
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
label1: internal
ports:
- protocol: TCP
port: 80
创建网络策略:
kubectl apply -f NetworkPolicy.yaml
第六题
任务:
使用kubectl config use-context k8s。
- 通过一个已经存在的名字为front-end的deployment增加一个特殊的配置:
容器为nginx,名字为http端口为80。 - 通过修改后front-end这个deployment导出一个名字为front-end-svc,并且该SVC可以启用新修改的配置。
答案:
切换到kubectl config use-context k8s。
#(查看front-end)
kubectl get deployment.app front-end -o yaml
kubectl edit deployment.app front-end
在name=nginx下面插入:
ports:
- name: http
containerPort: 80
# (看到已经增加的http和80端口,则代表更改完成)
kubectl descript deployment.app front-end
kubectl expose deployment.app frond-end --port=80 --target-port=http --type=NodePort --name=front-end-svc
验证:
# (看到有front-end-svc)
Kubectl get svc
# (看到http和80端口的映射状态,代表成功)
Kubectl descript svc front-end-svc
第七题
任务:
使用kubectl config use-context k8s。
- 创建名字为pong的ingress,服务名hi,路径/hi,服务端口5678。
答案:
切换到kubectl config use-context k8s。
Vim ingress.yaml
# 如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minimal-ingress
namespace: ing-internal
spec:
rules:
- http:
paths:
- path: /hi
pathType: Prefix
backend:
service:
name: hi
port:
number: 5678
- 验证
Curl -kL <internal_ip> /hi
第八题
任务:
使用kubectl config use-context k8s。
- 将guestbook的deployment内pod数量更改为6。
答案:
切换到kubectl config use-context k8s。
kubectl scale deployment guestbook --replicas=6
- 验证
kubectl get deployment guestbook
第九题
任务:
使用kubectl config use-context k8s。
- 创建一个pod,名字为nginx-kusc00401,镜像为nginx,nodeSelector为disk:spinning。
答案:
Vim nginx.yaml
# 如下:
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disk: spinning
创建pod应用
kubectl apply -f nginx.yaml
kubectl get pod nginx-kusc00401
第十题
任务:
使用kubectl config use-context k8s。
- 查看当前状态为ready的node,统计ready的node,taint=none,并将统计的数量输出到/opt/KUSC00402/kusc00402.txt。
答案:
# (查看共有几个状态为ready的node)
kubectl get nodes
# (taints:<none>,每一个node都查看一下,统计数量)
kubectl describe nodes <node name> | grep -i taint
# (将结果输入)
echo 4>/opt/KUSC00402/kusc00402.txt
第十一题
任务:
使用kubectl config use-context k8s。
- 创建一个名字为kucc8的pod,里面包含2个容器redis和consul。
答案:
Vim kucc8.yaml
# 如下:
apiVersion: v1
kind: Pod
metadata:
name: kucc8
spec:
containers:
- name: redis
image: redis
- name: consul
image: consul
创建应用
kubectl apply -f kucc8.yaml
kubectl get pod
第十二题
任务:
使用kubectl config use-context hk8s。
- 创建一个名字为app-config,大小2G,readwritenany,类型为host path,path路径为/srv/app-config的卷。
答案:
使用kubectl config use-context hk8s。
Vim app-config.yaml
# 如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: /srv/app-config
- 验证
Kubectl get pv
第十三题
任务:
- 创建一个名字为pv-volume,类型为csi-hostpath-sc,大小为10M的pvc。
- 创建一个pod,使用第一步创建的pvc,挂在地址是/usr/share/nginx/html。
- 将第一步创建的pv-volume大小更改为70M。
答案:
Vim pv-volume.yaml
# 如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-vloume
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
storageClassName: csi-hostpath-sc
创建pvc
kubectl apply -f pv-volume.yaml
创建pod,绑定pvc
vim web-server.yaml
# 如下:
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: /usr/share/nginx.html
name: mypd
volumes:
- name: mypd
persistentVolumeClaim:
claimName: pv-volume
创建pod并验证
kubectl apply -f web-server.yaml
kubectl descript pod web-server
# (将10Mi改成70Mi,保存即可)
kubectl edit pvc pv-volume
第十四题
任务:
使用kubectl config use-context k8s。
- 导出pod名为foobar的日志,查找其中包含file-not-found的错误,并写入到/opt/KUTR00101/foobar。
答案:
切换到kubectl config use-context k8s。
kubectl logs foobar | grep file-not-found > /opt/KUTR00101/foobar
第十五题
任务:
使用kubectl config use-context k8s。
已经有一个pod,用于存储记录kubectl的logs。
- 已有的名字为11-factor-app的pod,添加一个容器sidicar,使用busybox镜像,命令为/binsh -c “tail -n+1 f /var/log/11-factor-app.log”。
- 将新容器(看数据)和老容器(写数据),都挂在存储到/var/log。
答案:
# (输出其yaml文件)
kubectl get pod 11-factor-app -o yaml > app.yaml
# (先备份一份,删除managed部分,删除status部分,不删会有问题。)
vim app.yaml
# 在container下添加:
containers:
- name: sidecar
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: varlog
emptyDir: {}
重新创建pod应用
kubectl delete pod 11-factor-app
kubectl apply -f app.yaml
第十六题
任务:
使用kubectl config use-context k8s。
- 查找label标签name=cpu-utilizer的pod,查看他们的CPU使用率,将使用率最高的pod,写到/opt/KUTR00401/KUTR00401.txt。
答案:
切换到kubectl config use-context k8s。
# (查看哪个pod的CPU使用率最高,如pod名为websvr)
kubectl top pod -l name=cpu-utilizer
echo websvr >/opt/KUTR00401/KUTR00401.txt
第十七题
任务:
使用kubectl config use-context wk8s。
- 名字叫做wk8s-node-0的node状态为NotReady,查找原因,并让其状态变为ready。
答案:
切换到kubectl config use-context wk8s。
ssh wk8s-node-0
sudo -i
# (查看kubelet为啥没起来)
systemctl status kubelet
systemctl start kubelt
systemctl enable kubelet
exit
验证:
# (状态为Ready)
kubectl get node