我是在2021年2月份通过linux foundation中文网购买的考试券,当时花了2088元人民币,支持微信/支付宝,考试卷有效期为1年,1年内核销考试都有效。现在涨价了,2498元,涨了410元,早买还占到便宜了。我在知乎上看某些博主在美国网站购买,黑色星期五,好像有折人民币1000多买到的。
买完考试券,大概拖了半年,到7月末正式开始学习kubernetes,线上看了学习课程,也买了kubernetes权威指南(第四版),现在应该推出到第五版了。然后就准备考试了。
关于考试前准备:需要提前在英文官网注册报名,核销中文网购买的采购卷,核销后可以预约考试。预约的界面如下,因为我已经考过了,所以可以看到考试状态为通过,95分,66分及格。
注意check System Requirements这部分,考试是线上的,使用Google浏览器,需要在Google商店下载考试插件,由于国内互联网政策,我们无法访问Google的资源。我琢磨了好久,在华为云的香港节点创建了1台按需的windows云主机,在这台云主机google浏览器下载了考试插件,并导出转存到本地电脑,并安装到我笔记本的Google浏览器上,并通过了checklist。
提前1-2天预约考试即可,准备好了,就可以考试。我约的是当日的凌晨0:00-02:00。
关于考试当天的准备:监考考试会要求通过摄像头检查考试环境,转动摄像头或者笔记本电脑;检查护照,要求离摄像头很近,能看到名字。检查房间,是不是只有1个人。检查桌面,最好桌子上什么都没有。(我放了鼠标垫,让我把鼠标垫拿起来,看看有没有违禁物品)监考官会通过聊天窗口文字沟通,全程中文。检查合格后开始考试。 关于考试题目:CKA1.21考试
注意事项
只允许打开2个table页面,1个是考试页面,另一个是kubernetes官网文档。每道题都切换到对应的集群节点上,直接复制即可。如 kubectl config use-context k8s。考试题蓝色部分是可以复制粘贴的。 第一题任务:
使用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,DaemonSetKubectl -n app-team1 create serviceaccourt cicd-tokenKubectl create rolobinding cicd-token --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --namespace=app-team1验证:
Kubectl descript -n app-team1 rolobindings cicd-bind
第二题任务:
使用kubectl config use-context ek8s。
名字为ek8s-node-0的节点,设置为不可用。答案:
切换到kubectl config use-context ek8s。
kubectl drain ek8s-node-0 --ignore-daemonsets --force验证:
Kubectl descript ek8s-node-0
第三题任务:
使用kubectl config use-context mk8s。
Master节点使用Kubeadm将升级至1.21.1。升级前master设置drain,升级后回复uncordon。Kubelet和kubectl同样升级,但是etcd不升级。答案:
切换到kubectl config use-context mk8s
kubectl get nodes(确定哪个node是master )kubectl drain ek8s-node-0--ignore-daemonsets --forcessh master节点,并sudo -i 提权apt-get install -y kubeadm=1.21.1-00Kubeadm upgrade plan (验证)Kubeadm upgrade apply v1.21.1 --etcd-upgrade=falseApt-get install -y kubelet=1.21.1-00 kubectl=1.21.1-00systemctl daemon-reloadsystemctl restart kubeletExit(返回到mk8s)kubectl uncordon ek8s-node-0验证:
Kubectl descript ek8s-node-0(查看状态是否非unschedule)
第四题任务:
对etcd进行备份。用/srv/data/etcd-snapshot-previous.db恢复etcd。(这题我还原的时候没还原上,所以扣了5分,但是步骤肯定是正确的)答案:
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。
Kubectl get ns --show-labels(查看internal的标签)Vim NetworkPolicy.yamlapiVersion: 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。
kubectl get deployment.app front-end -o yaml(查看front-end)kubectl edit deployment.app front-end在name=nginx下面插入ports:
- name: http
containerPort: 80
kubectl descript deployment.app front-end(看到已经增加的http和80端口,则代表更改完成)kubectl expose deployment.app frond-end --port=80 --target-port=http --type=NodePort --name=front-end-svc验证
Kubectl get svc(看到有front-end-svc)Kubectl descript svc front-end-svc (看到http和80端口的映射状态,代表成功) 第七题任务:
使用kubectl config use-context k8s。
创建名字为pong的ingress,服务名hi路径/hi,服务端口5678。答案:
切换到kubectl config use-context k8s。
Vim ingress,yamlapiVersion: 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 /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.yamlapiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disk: spinning
Kubectl apply -f nginx.yamlKubectl get pod nginx-kusc00401 第十题任务:
使用kubectl config use-context k8s。
查看当前状态为ready的node,统计ready的node,taint=none,并将统计的数量输出到/opt/KUSC00402/kusc00402.txt。答案:
Kubectl get nodes(查看共有几个状态为ready的node)Kubectl describe nodes | grep -i taint(,taints:,每一个node都查看以下,统计数量)echo 4>/opt/KUSC00402/kusc00402.txt 第十一题任务:
使用kubectl config use-context k8s。
创建一个名字为kucc8的pod,里面包含2个容器redis和consul。答案:
Vim kucc8.yamlapiVersion: v1
kind: Pod
metadata:
name: kucc8
spec:
containers:
- name: redis
image: redis
- name: consul
image: consul
Kubectl apply -f kucc8.yamlKubectl get pod 第十二题
任务:
使用kubectl config use-context hk8s。
创建一个名字为app-config,大小2G,redawritenany,类型为host path,path路径为/srv/app-config的卷。答案:
使用kubectl config use-context hk8s。
Vim app-config.yamlapiVersion: 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.yamlapiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-vloume
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
storageClassName: csi-hostpath-sc
Kubectl apply -f pv-volume.yamlVim web-server.yamlapiVersion: 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
Kubectl descript pod web-serverKubectl edit pvc pv-volume(将10Mi改成70Mi,保存即可) 第十四题任务:
使用kubectl config use-context k8s。
导出po'd名为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。答案:
kubectl get pod 11-factor-app -o yaml > app.yaml(输出其yaml文件)vim app.yaml(先备份一份,删除managed部分,删除status部分,不删会有问题。)在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: {}
kubectl delete pod 11-factor-appkubectl 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。
Kubectl top pod -l name=cpu-utilizer (查看哪个pod的CPU使用率最高,如pod名为websvr)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-0sudo -isystemctl status kubelet(查看kubelet为啥没起来)systemctl start kubeltsystemctl enable kubeletexit验证:
kubectl get node(状态为Ready)
最后祝大家都能顺利通过考试,并可以学以致用。推荐华为开发者空间发布
让每位开发者拥有一台云主机
插件.rar45.82KB下载次数:14次附件下载
插件.rar45.82KB下载次数:14次【版权