Skip to content

CKA

互联网最全cka真题解析-2022.9.9

目录

[toc]

我的CKA证书

1、CKA真题解析

kubectl自动补全及帮助信息

bash
1、配置kubectl自动补全aptinstallbash-completionsource<(kubectlcompletion bash)2、kubectlexplans帮助信息3、kubectl命令-h帮助信息4、官网https:kubectlconfiguse-contextkubernetes2、配置kubectlcreateclusterroledeployment-clusterrole--verb=create--resource=deployments,daemonsets,statefulsetskubectlcreateserviceaccountcicd-token-napp-team1# 题目中写了“限于 namespace app-team1 中”,则创建 rolebinding。没有写的话,则创建 clusterrolebinding。kubectlcreaterolebindingcicd-token-rolebinding--serviceaccount=app-team1:cicd-token--clusterrole=deployment-clusterrole-napp-team1# rolebinding 后面的名字 cicd-token-rolebinding 随便起的,因为题目中没有要求,如果题目中有要求,就不能随便起了。3、验证#稍微验证下kubectldescriberolebindingcicd-token-rolebinding-napp-team1

注意:我们可以用describle命令看下刚才新建的rolebinding来验证下:

  • 答题技巧
bash
#说明:解题三步骤:1.创建clusterrole2.创建serviceaccount3.将新的clusterrole绑定到新的serviceaccount:rolebinding1.之前我们是通过yaml文件进行创建的,这次通过命令行进行创建;(直接强制记忆就好;)2.从书签链接可以找到一些命令,但是尽量建议熟悉记忆上面3条命令,直接敲出来即可;(直接搜索`一些命令行工具`关键字即可)此题注意事项:一般来水,如下是对应绑定的:(但是也可以rolebinding和clusterrole对应)role-->rolebinding有ns之说clusterrole-->clusterrolebinding无ns之说serviceaccount有ns之说

第2题 统计使用 CPU 最高的 Pod(强制记忆,送分题

考点:kubectl top -l 命令的使用

考题

参考链接

没必要参考网址,使用-h 帮助更方便。

kubectl top pod -h

https:kubectlconfiguse-contextkubernetes2、配置kubectltoppod-lname=cpu-utilizer--sort-by="cpu"-A#-A是所有namespace 不要忘记写哦,-l也要记得写哦。。。echo"<podname>">/opt/KUR00401.txt# 将第一个 Pod 名称写到文件#写完后记得检查下那个保存结果的文件3、验证cat/opt/KUR00401.txt

第3题 网络策略(拷贝yaml)📍(注意yaml位置)

(考题知识点:kubernetes安全章节/网络策略)7'

考题

双重否定就是肯定,所以最后两句话的意思就是: 仅允许端口为 8080 的 pod 访问。 仅允许 my-app命名空间中的 pod 访问。

码的,这个翻译起来真的有点别扭。。。。。

参考链接

解答

  • 原课件答案

yaml
1、切换环境kubectl config use-context hk8s2、配置#如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用。给命名空间打标签:kubectl label namespace big-corp name=big-corp编写一个 yaml 文件vim networkpolicy.yaml#注意 :set paste,防止 yaml 文件空格错序。apiVersion:networking.kubernetes.io/v1kind:NetworkPolicymetadata:name:allow-port-from-namespacenamespace:my-app#被访问者的命名空间spec:podSelector:{}policyTypes:- Ingressingress:- from:- namespaceSelector:matchLabels:name:big-corp#访问者的命名空间的标签ports:- protocol:TCPport:8080#被访问者公开的端口kubectl apply -f networkpolicy.yaml3、验证kubectl get networkpolicy -nmy-app
  • 答题技巧
bash
这个题也是争议比较大,这个题目翻译后比较模糊,先按照下面答案来做就行。这个题一直也没变过;直接从官方yaml拷贝过来,删除没用的,修改为题目要求的,就好;
  • 官方yaml
yaml
apiVersion:networking.kubernetes.io/v1kind:NetworkPolicymetadata:name:test-network-policynamespace:defaultspec:podSelector:matchLabels:role:dbpolicyTypes:- Ingress- Egressingress:- from:- ipBlock:cidr:172.17.0.0/16except:- 172.17.1.0/24- namespaceSelector:matchLabels:project:myproject- podSelector:matchLabels:role:frontendports:- protocol:TCPport:6379egress:- to:- ipBlock:cidr:10.0.0.0/24ports:- protocol:TCPport:5978

删除egress,ingress里的ipBlock,podSelector部分,修改spec.podSelector后面为空。

📍 另一个版本

检查:

第4题 SVC 暴露应用(强制记忆)

考点:将现有的 deploy 暴露成 nodeport 的 service。

考题

参考链接

强制记忆即可。

解答

  • 解题
bash
1、切换环境kubectlconfiguse-contextkubernetes2、配置kubectleditdeploymentfront-endcontainers:-image:nginximagePullPolicy:Alwaysname:nginxports:-name:http#额额,这里要加一个-横杠的。。。protocol:TCP#protocol不写也是可以的,因为默认就是TCPcontainerPort:80kubectlexposedeploymentfront-end--port=80--target-port=80--type=NodePort--name=front-end-svc#注意:这里--name(不要忘记了。。。。)svc类型:NodePort/ClusterIP; --port是svc的端口号,--target-port是deployment里pod的容器的端口号#验证:(看下他们的SELECTOR标签是否一致)kubectlgetsvcfront-end-svc-owidekubectlgetdeploymentfront-end-owidecurl节点名/节点ip:NodePortcurlsvcIP:port
  • 答题技巧
bash
无链接,理解记忆即可;

📍 另一个版本(知道即可)

第5题 Ingress创建(拷贝yaml)📍(注意yaml位置)

考点:Ingress 的创建

考题

-k:跳过SSL证书检测 -L:跟随跳转,比如网站做了重定向,不加这个选项的话只会看到一个302的访问代码就结束了,加上的话会看到完整的跳转情况

参考链接

yaml路径:

参考资料:https:kubectl config use-context k8s2、配置vim ingress.yamlapiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:pongnamespace:ing-internalannotations:nginx.ingress.kubernetes.io/rewrite-target:/spec:rules:- http:paths:- path:/hellopathType:Prefixbackend:service:name:helloport:number:5678#如果测试结果没有hello输出,则可以尝试删除annotations字段内容;# 注意,如果等待5min后,这个还是出不来Ip时,可以看下那个hello服务类型是不是ClusterIP类型,如果不是,请修改为ClusterIp3、验证kubectl get ingress -ning-internalcurl -kL internal_IP/hello

注意:ingress资源还要加上一个namesapce的。

📍 另一版本

暂时忽略。。。

第6题 扩容 deployment 副本数量(强制记忆,送分题

(考题知识点:kubernetes管理应用声明周期pod)4'

考题

参考链接

没必要参考网址,使用-h 帮助更方便。

kubectl scale deployment -h

https:kubectlconfiguse-contextk8s2、配置kubectlscaledeploymentloadbalancer--replicas=53、验证kubectlgetpokubectlgetdeployment

第7题 调度 pod 到指定节点(强制记忆,送分题

考点:nodeSelect 属性的使用

考题

参考链接

解答

参考资料:https:kubectl config use-context k8s2、配置vim nodeSelector.yamlaoiVersion:v1kind:Podmetadata:name:nginx-kusc00401spec:containers:- name:nginx-kusc00401image:nginxnodeSelector:#这个是和containers同一级别的。disk:ssdkubectl apply -f nodeSelector.yaml# kubectl label node node01 disk=ssd 打标签# kubectl get node --show-lables3、验证kubectl get po -owide

📍  另一版本

第8题 查看可用节点数量(强制记忆,送分题

考点:检查节点角色标签,状态属性,污点属性的使用

考题考题

参考链接

没必要参考网址,使用-h 帮助更方便。

kubectl -hD

https:kubectlconfiguse-contextk8s2、配置kubctldescriblenodes$(kubectlgetnode|grepReady|awk'{print $1}')|grepTaints|grep-vcNoSchedule3、验证cat/opt/KUSC00402/kusc00402.txt2

bash
1、自己测试过程#统计all准备就绪的节点[root@kubernetes-master ~]#kubectl get nodes|grepReadykubernetes-masterReadycontrol-plane,master43dv1.21.2kubernetes-node1Ready<none>43dv1.21.2kubernetes-node2Ready<none>43dv1.21.2[root@kubernetes-master ~]#kubectl get nodes|grepReady|awk'{print $1}'kubernetes-masterkubernetes-node1kubernetes-node2[root@kubernetes-master ~]##统计没有打上污点的节点[root@kubernetes-master ~]#kubectl describe nodes |grepTaintTaints:node-role.kubernetes.io/master:NoScheduleTaints:<none>Taints:<none>[root@kubernetes-master ~]#kubectl describe nodes |grepTaint|grep-vNoScheduleTaints:<none>Taints:<none>[root@kubernetes-master ~]#kubectl describe nodes |grepTaint|grep-cvNoSchedule2#最终代码[root@kubernetes-master ~]#kubectl describe node $(kubectlgetnodes|grepReady|awk'{print $1}') |grepTaint|grep-vcNoSchedule2kubectldescribenode$(kubectlgetnodes|grepReady|awk'{print $1}') |grepTaint|grep-vcNoSchedule>/opt/KUSC00402/kusc00402.txt2.如果不熟悉shell的话,那么手动统计应该也可以;[root@kubernetes-master ~]#kubectl get nodeNAMESTATUSROLESAGEVERSIONkubernetes-masterReadycontrol-plane,master43dv1.21.2kubernetes-node1Ready<none>43dv1.21.2kubernetes-node2Ready<none>43dv1.21.2[root@kubernetes-master ~]#kubectl describe nodes |grepTaintTaints:node-role.kubernetes.io/master:NoScheduleTaints:<none>Taints:<none>[root@kubernetes-master ~]#3.-c代表统计个数;污点tag也不全是NoSchedule;

📍 另一版本

第9题 创建多容器的 pod(强制记忆,送分题

考点:pod 概念

考题

参考链接

答题

yaml
1、配置环境kubectl config use-context k8s2、配置vim pod.yamlapiVersion:v1kind:Podmetadata:name:kucc4spec:containers:- name:nginximage:nginx- name:redisimage:redis- name:memcachedimage:memcachedkubectl apply -f pod.yaml3、验证kuebctl get po
  • 答题技巧
bash
这道题简单,直接写就好;

📍 另一版本

第10题 创建 PV(拷贝yaml)📍(注意yaml位置)

考点:hostPath 类型的 pv

考题

参考链接

注意:官方yaml位置

官网-任务-配置Pods和容器-配置Pod以使用pv作为存储:

解答

参考资料:https:kubectl config use-context hk8s2、配置vim pv.yamlapiVersion:v1kind:PersistentVolumemetadata:name:app-dataspec:capacity:storage:2GiaccessModes:- ReadWriteOncehostPath:path:"/srv/app-data"kubectl appy -f pv.yaml3、验证kubectl get pv

📍 另一版本

第11题 创建PVC(拷贝yaml)📍(注意yaml位置)

pvc 的创建 class 属性的使用,--record 记录变更

考题

参考链接

注意:官方yaml位置

官网-任务-配置Pods和容器-配置Pod以使用pv作为存储:

解答

参考资料:https:kubectl config use-context ok8s2、配置vim pvc.yamlapiVersion:v1kind:PersistentVolumeClaimmetadata:name:pv-volumespec:storageClassName:csi-hostpath-scaccessModes:- ReadWriteOnceresources:requests:storage:10Mi---apiVersion:v1kind:Podmetadata:name:web-serverspec:volumes:- name:task-pv-storagepersistentVolumeClaim:claimName:pv-volumecontainers:- name:web-serverimage:nginxports:- containerPort:80name:"http-server"volumeMounts:- mountPath:"/usr/share/nginx/html"name:task-pv-storagekubectl apply -f pvc.yaml3、验证kubectl get pvckubectl get pvkubectl get po#kubectl edit pvc pv-volume --config-save #淦。。。。。是--save-config ,自己写错了。。。。kubectl edit pvc pv-volume --save-config#可能要等个1分钟的时间才会发生变化;# kubectl edit pvc pv-volume --record 这种方法也是可以的。。。。70Mi

📍 另一版本

第12题 获取 Pod 错误日志(强制记忆,送分题

考点:kubectl logs 命令

考题

参考链接

参考资料:https:kubectlconfiguse-contextk8s2、配置kubectllogsbar|grepfile-not-found>/opt/KUTR00101/bar3、验证cat/opt/KUTR00101/bar

bash
记住命令即可;

第13题 使用 sidecar 代理容器日志(边车)(强制记忆)要注意下:🌹

考点:pod 两个容器共享存储卷

考题

参考链接

解答

参考资料:https:kubectlconfiguse-contextk8s2、配置kubectlgetpoleagcy-app-oyaml>sidecar.yaml#由于 Pod 不能在线增加容器,可先导出 yaml 再添加最后 applykubectldeletpoleagcy-appvimsidecar.yaml……metadata:name:leagcy-appspec:volumes:-name:varlogemptyDir:{}containers:-name:xximage:xxvolumeMounts:-name:varlogmountPath:/var/log-name:sidecarimage:busyboxargs:[/bin/sh,-c,"tail -n+1 -f /var/log/legacy-app.log"]#。。。。里面是单引号。。。volumeMounts:#要注意:volumes和volumeMounts这里都是复数。。。-name:varlog#这里是有一个name的。。。mountPath:/var/logkubectlapply-fsidecar.yaml3、验证kubectllogslegacy-appkubectlexeclegacy-app-cxx--tail-f/var/log/legacy-app.logkubectlexeclegacy-app-csiecar--tail-f/var/log/legacy-app.log

解题yaml:

yaml
apiVersion:v1kind:Podmetadata:name:counterspec:containers:- name:leagcy-appimage:busyboxargs:- /bin/sh- -c- >i=0;while true;doecho "$i:$(date)">>/var/log/legacy-app.log;i=$((i+1));sleep 1;done volumeMounts:- name:varlogmountPath:/var/log- name:sidecarimage:busyboxargs:[/bin/sh,-c,'tail -n+1 -F /var/log/legacy-app.log']volumeMounts:- name:varlogmountPath:/var/logvolumes:- name:varlogemptyDir:{}
bash
这个题目也是争议比较的大一个题目,能做出来的人很少;考题中文翻译描述的问题很奇怪。。;sidecar边车容器不是作为主容器,而是辅助主容器做一些功能;注意:kubectlgetpodbig-corp-app-oyaml>big-corp-app.yaml这里面的东西一个都不要删;这个地方也容器出错;加这一块比较容易出错,加着加着,这个对齐方式找不到了;导出来,找到你的位置,然后直接粘贴过来修改即可;这一块,比较考验你的yaml能力;验证的话:1.可以查看下kubectlgetpod看刚才那个pod是否有2个容器2.用tail-f查看下边车容器是否会有日志文件持续输出;

📍 另一版本

第14题 升级集群(强制记忆)

考点:如何离线主机,并升级控制面板和升级节点

考题

题目要求不升级 etcd,这里手动补上。

参考链接

没必要参考网址,建议多练习,背过命令就行。 记不清的,可以使用 kubectl -h 来帮助。 如果非要参考,可以按照下面方法。

依次点击 Tasks → Administer a Cluster → Administration with kubeadm → Upgrading kubeadm clusters (看不懂英文的,可右上角翻译成中文) https:kubectlconfiguse-contextmk8s2、配置#升级kueadmkubectldrainmk8s-master-0--ignore=daemonsetssshmk8s-master-0sudo-iaptinstallkubeadm=1.20.1-00-ykubeadmupgradeplan#这里可以先查下的:apt-cache show|grep kubeadm#kubeadm upgrade install v1.20.1 #。。。淦,这个写错了。。。。。。。是apply,并且要加上--ectd-ugrade=false。。。。。。题目要求不升级 etcd; 注意下这2个版本号写法的区别。。。。kubeadmupgradeapplyv1.20.1--etcd-upgrade=false#升级kubeltaptinstallkubelet=1.20.1-00kubectl=1.20.1-00-ysystemctlrestartkubelet#这里要重启下kubelt的,切记。。。exitexitkubectluncordonmk8s-master-03、验证kubectlgetnode-owidekubectl--versionkubelet--version

参考资料:https:这个使用的是ubuntu操作系统;(唯一一个需要用到ubuntu命令的考题;)ubuntu使用sudo-i切换root,使用apt-get安装软件包;ununtu默认禁止root登录;因此,考试时,只有升级kubernetes这一道题需要用到ubuntu系统,其他都不需要用到;直接用sudo-i切换到root用户,再开始答题;(不需要输入密码)注意:这里切换kubernetes集群后,直接使用`kubectl drain kubernetes-master-0 --ignore-daemonsets`命令进行配置,不需要先ssh到mkubernetes-master-0节点;(这个需要注意下)确定要升级到哪个版本使用操作系统的包管理器找到最新的稳定1.21:aptupdateapt-cachepolicykubeadm# 在列表中查找最新的 1.21 版本# 它看起来应该是 1.21.x-00,其中 x 是最新的补丁版本#ubuntu和centos查看kubeadm最新版本的方法apt-cachepolicykubeadm#ubuntu查看方式1.20.5-00yumlist--showduplicateskubeadm--disableexcludes=kubernetes#centos查看方式1.21.2-0#注意如下的2种格式:ubuntu系统:1.20.5-00centos系统:1.21.2-0#注意:ubuntu中aptinstallkubeadm=1.20.1-00–y或者apt-getinstallkubeadm=1.20.1-00–y都是可以的;(我们这里使用aptinstall方式)

📍 另一版本

第15题 etcd 备份与恢复(强制记忆,2个步骤)

考点:etcd 的备份和还原命令

考题

参考链接

参 考 资 料 : https:kubectlgetnode2、配置#备份ETCDCTL_API=3etcdctlsnapshotsave/data/backup/etcd-snapshot.db--endpoints=https:#还原sudo-isystemctlstopetcdsystemctlcatetcd#。。。。。淦:注意这里是systemctl cat etcdmv/var/lib/etcd/default.etcd/var/lib/etcd/default.etcd.bak# 。。。。淦:注意这里是default.etcdexitll/data/backup/etcd-snapshot-previous.dbsudoETCDCTL_API=3etcdctlrestore/data/backup/etcd-snapshot-previous.db--data-dir=/var/lib/etcd/default.etcdchown-Retcd:etcd/var/lib/etcd#淦。。。。注意,不要忘记了。。。。syetmctlstartetcd注:执行备份命令如果提示没证书文件,exit退回上一步操作参考资料https:#备份etcdetcdctlsnapshotsave--cacert--cert--key#恢复etcd关闭etcd服务确认etcd数据目录:systemctlcatetcdetcdctlsnapshotrestore--data-dir给权限:/var/lib/etcd启动etcd恢复:这里需要给大家强调一下1.这里恢复用的是已经存在的一个备份文件,而不是说我们之前备份的那个文件;2.这里的etcd是二进制方式部署的,重启需要使用systemctlstartetcd命令;3.这个ectd的备份与恢复考题:恢复这里一直是个坑;你恢复了之后,这个etcd起不来了,这个就JJ了。。。。;4.这个题是个坑:可以直接放弃,把稳起见;(可以做个etcd备份,恢复就不需要做了。。。可以看情况)

📍 另一版本

先忽略。。。。

第16题 排查集群中故障节点(强制记忆,送分题,一定要做完这道题,分值最高,最简单)

考题

参考链接

强制记忆。

解答

bash
1、切换环境kubectlconfiguse-contextwk8s#考试时切到这道题的集群后,那个 node 就是异常的。 真实考试时,这个异常节点的 kubelet 服务没有启动导致的,就这么简单。2、配置kubectlgetnode#查看Not Ready的node节点sshwk8s-node-0sudo-isystemctlstatuskubeletsystemctlstartkubeletsystemctlenablekubeletexit#退出root用户exit#退出故障节点3、验证kubectlgetnode#jounarlctl -u kubelet 查看kubelet日志
bash
通过getnodes查看异常节点,登录节点查看kubelet等组件的status并判断原因。真实考试时,这个异常节点的kubelet服务没有启动导致的,就这么简单。考试时切到这道题的集群后,那个node就是异常的。如果systemctlstartkubelet没起来的话,就要看它的日志了;(一般是会起来的)如果kubelt的日志没起来,该如何看kubelet的日志?journalctl-ukubelet

第17题 节点维护(强制记忆,送分题

考点:cordon 和 drain 命令的使用

考题

参考链接

强制记忆就好。

解答

bash
1、切换环境kubectlconfiguse-contextek8s2、配置#kubectl coredon ek8s-node-1 #淦:我一直把这个单词拼错。。。。。;是cordon,不是coredon。。。;📍kubectlcordonek8s-node-1#设置次节点为不可调度kubectldrainek8s-node-1--ignore-daemonsets#设置次节点为不可调度,并且排空次节点#如果上面命令报错就加上一个 --delete-local-data --forcekubectldrainek8s-node-1--ignore-daemonsets--delete-local-data--forcekubectldrainek8s-node-1--ignore-daemonsets--delete-emptydir-data--force3、验证kubectlgetnode

注意下就好:

bash
注意:执行`kubectl drain ekubernetes-node-1 --ignore-daemonsets`这条命令其实就包括了上面设置为不可调度,但是考试尽量按考试题目和给出的答案来;kubectluncordonkubernetes-master#取消不可调度

2、考试注意事项

kubecctl 命令自动补全

bash
aptinstallbash-completionsource<(kubectlcompletion bash)

能复制就不要手敲代码;

能用yaml就不要手敲代码;

要善于用考试环境的记事本的;

👉 注意:不允许访问自己的浏览器书签

2022年8月28日

如何一步步找到找官网资料

  1. 打开火狐浏览器
  2. 输入k8s官网:https:

    注意,可通过kubectl get node输出的NAME字段和考题中设置配置环境的保持一致即可。

    有时可能出现要做的这道题和上一个考题的kubernetes集群是同一套,切不切都无所谓,保险起见还是建议都要且,并确认后,开始进行答题;

    要注意题干里的小细节

    答题技巧

     平时多敲多练习,熟练使用 kubectl,了解 kubernetes 资源 yaml 文件结构,把下面提供的真题练习好;

    可以事先把官方文档示例页面放到浏览器的收藏夹里,这样遇到相关的考题就可以快速打开参考;

     考试系统里有记事本,多多利用,临时存储

    考试中的终端可以使用复制黏贴,尽量避免手敲 yaml,多使用命令创建,例如 Pod、Service、Deployment;

     命令参数不记得,多查看帮助信息,例如 kubectl --help,etcdctl --help的命令,都有示例;