帝国cms门户网站模板,今天发生了什么重大新闻,网站制作在哪里的,网站分哪几种2023年CKA考试真题及注意事项 注意事项考试题目原题解析1.RBAC2.节点维护3.K8S组件升级 1.28.0升级到1.28.14.Etcd备份与恢复5.NetworkPolicy6.Service7.Ingress8.指定节点部署9.检查Node节点健康状态10.一个Pod多个容器11.监控Pod度量指标12.监控Pod日志13.PersistentVolumeCl… 2023年CKA考试真题及注意事项 注意事项考试题目原题解析1.RBAC2.节点维护3.K8S组件升级 1.28.0升级到1.28.14.Etcd备份与恢复5.NetworkPolicy6.Service7.Ingress8.指定节点部署9.检查Node节点健康状态10.一个Pod多个容器11.监控Pod度量指标12.监控Pod日志13.PersistentVolumeClaim14.Sidecar15.集群故障排查——kubelet故障 注意事项
1.黑色星期五或Cyber Monday时购买考试是全年价格最低的时候推荐预算充足的同学购买CKACKS性价比最高相关课程不推荐买video和课件都是纯英语对英语一般的人不够友好买后用处不大。 2.规定的是考试购买后1个月内需要兑换考试券我超过1个月后兑换的虽然也成功了但不建议卡时间。 3.考试时间的选择最好选择凌晨和清晨比如早上6点左右亲测网络不会卡顿。本人亲测在凌晨5-7点网络不卡。
4.浏览器和PSI插件按照指南说明准备考前最好多测试多运行几次确保系统环境一定没问题比如我考时windows系统不能用win10企业版所以需要重装系统或换个电脑。 5.关于网络不建议在办公室等有公司防火墙的WiFi环境考试很可能会看不到题目可以选择在家或酒店或者自己手机开热点这些方式。
考试题目
原题解析
1.RBAC 中文解释 创建一个名为deployment-clusterrole的clusterrole该clusterrole只允许创建Deployment、Daemonset、Statefulset的create操作 在名字为app-team1的namespace下创建一个名为cicd-token的serviceAccount并且将上一步创建clusterrole的权限绑定到该serviceAccount
参考
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-service-account/解题
# 创建clusterrole
kubectl create clusterrole deployment-clusterrole --verbcreate --resourcedeployments,statefulsets,daemonsets# 或者
[rootk8s-master01 ~]# cat dp-clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: deployment-clusterrole
rules:
- apiGroups: [extensions, apps]resources: [deployments,statefulsets,daemonsets]verbs: [create]
[rootk8s-master01 ~]# kubectl create -f dp-clusterrole.yaml
clusterrole.rbac.authorization.k8s.io/deployment-clusterrole created# 创建serviceAccount
kubectl create sa cicd-token -n app-team1
serviceaccount/cicd-token created# 绑定权限推荐节省时间
kubectl create rolebinding deployment-rolebinding --clusterroledeployment-clusterrole --serviceaccountapp-team1:cicd-token -n app-team1或者
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: deployment-rolebindingnamespace: app-team1
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: deployment-clusterrole
subjects:
- kind: ServiceAccountname: cicd-tokennamespace: app-team1# 验证
[rootk8smaster /opt/cka]# kubectl auth can-i create deployment --as system:serviceaccount:app-team1:cicd-token -n app-team1
yes
[rootk8smaster /opt/cka]# kubectl auth can-i create daemonset --as system:serviceaccount:app-team1:cicd-token -n app-team1
yes
[rootk8smaster /opt/cka]# kubectl auth can-i create statefulset --as system:serviceaccount:app-team1:cicd-token -n app-team1
yes
[rootk8smaster /opt/cka]# kubectl auth can-i create pod --as system:serviceaccount:app-team1:cicd-token -n app-team1
no
2.节点维护 中文解释 将ek8s-node-1节点设置为不可用然后重新调度该节点上的所有Pod
参考
https://kubernetes.io/zh/docs/tasks/configure-pod-container/
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#drain解题
kubectl config use-context ek8s
kubectl cordon ek8s-node-1
# 测试执行
kubectl drain ek8s-node-1 --delete-emptydir-data --ignore-daemonsets --force --dry-runserver
# 腾空节点
kubectl drain ek8s-node-1 --delete-emptydir-data --ignore-daemonsets --force3.K8S组件升级 1.28.0升级到1.28.1
参考
https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/解题
首先腾空节点
# 设置为维护状态
kubectl cordon k8s-master
# 驱逐Pod
kubectl drain k8s-master --delete-emptydir-data --ignore-daemonsets --force
# 之后需要按照题目提示ssh到一个master节点
apt update
apt-cache policy kubeadm | grep 1.28.1
# 注意版本的差异有可能并非1.20.1升级到1.28.1
apt-get install kubeadm1.28.1-00
# 验证升级计划
kubeadm upgrade plan
# 看到如下信息可升级到指定版本# 开始升级Master节点注意看题需不需要升级etcd
kubeadm upgrade apply v1.28.1 --etcd-upgradefalse -f# 升级kubectl和kubelet
apt-get install -y kubelet1.28.1-00 kubectl1.28.1-00
systemctl daemon-reload
systemctl restart kubelet
# 恢复master可调度
kubectl uncordon k8s-master
node/k8s-master uncordonedkubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 11d v1.28.1
k8s-node01 Ready none 8d v1.28.0
k8s-node02 Ready none 11d v1.28.04.Etcd备份与恢复 中文解释 针对etcd实例https://127.0.0.1:2379创建一个快照保存到 /srv/data/etcd-snapshot.db。在创建快照的过程中如果卡住了就键入ctrlc终止然后重试。 然后恢复一个已经存在的快照/var/lib/backup/etcd-snapshot-previous.db 执行etcdctl命令的证书存放在 ca证书/opt/KUIN00601/ca.crt 客户端证书/opt/KUIN00601/etcd-client.crt 客户端密钥/opt/KUIN00601/etcd-client.key
参考
https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/解题
kubernetes的所有数据记录在etcd中对etcd进行备份就是对集群进行备份。连接etcd需要证书证书可以从apiserver获取因为apiserver可以去连etcd。新版本的apiserver都是以static pod方式运行证书通过volume挂载到pod中。
具体的证书路径和备份到的路径按题目要求设置。ssh到master节点很快长时间没连上可以中断重连。
恢复部分据说很容易卡住不要花太多时间。# 路径不存在的话要提前建出来
export ETCDCTL_API3
etcdctl --endpointshttps://127.0.0.1:2379 --cacert/opt/KUIN000601/ca.crt --cert/opt/KUIN000601/etcd-client.crt --key/opt/KUIN000601/etcd-client.key snapshot save /srv/data/etcd-snapshot.db# 还原
还原前最好关掉etcd服务还原后重新开启etcd服务
还原后etcd的状态可能有问题最好不要去赌失分可能性很大。
systemctl stop etcdmkdir /opt/backup/ -p
cd /etc/kubernetes/manifests
mv kube-* /opt/backupexport ETCDCTL_API3
etcdctl --endpointshttps://127.0.0.1:2379 --cacert/opt/KUIN000601/ca.crt --cert/opt/KUIN000601/etcd-client.crt --key/opt/KUIN000601/etcd-client.key snapshot restore /var/lib/backup/etcd-snapshot-previous.db --data-dir/var/lib/etcd-restorevim /etc/kubernetes/manifests/etcd.yaml
# 将volume配置的path: /var/lib/etcd改成/var/lib/etcd-restorevolumes:- hostPath:path: /etc/kubernetes/pki/etcdtype: DirectoryOrCreatename: etcd-certs- hostPath:path: /var/lib/etcd-restore# 修改数据目录权限
chown -R etcd.etcd /var/lib/etcd-restore# 还原k8s组件
mv /opt/backup/* /etc/kubernetes/manifests
systemctl restart kubeletsystemctl start etcd# 其他答案
# 不需要进行集群的切换etcdctl 工具主机上已存在无需进行安装
ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 --cacert/opt/KUIN00601/ca.crt --cert/opt/KUIN00601/etcd-client.crt --key/opt/KUIN00601/etcd-client.key snapshot save /var/lib/backup/etcd-snapshot.db
ETCDCTL_API3 etcdctl --endpointshttps://127.0.0.1:2379 --cacert/opt/KUIN00601/ca.crt --cert/opt/KUIN00601/etcd-client.crt --key/opt/KUIN00601/etcd-client.key snapshot restore /var/lib/backup/etcd-snapshot-previous.db 注意 如果是二进制安装的etcd考试环境的etcd可能并非root用户启动的所以可以先切换到root用户sudo su - 然后使用ps aux | grep etcd查看启动用户是谁和启动的配置文件是谁config-file字段指定假设用户是etcd。所以如果是二进制安装的etcd执行恢复时需要root权限所以在恢复数据时可以使用root用户恢复之后更改恢复目录的权限sudo chown -R etcd.etcd /var/lib/etcd-restore 然后通过systemctl status etcd或者ps aux | grep etcd找到它的配置文件 如果没有配置文件就可以直接在etcd的service 通过systemctl status etcd即可看到文件中找到data-dir的配置然后更改data-dir配置后执行systemctl daemon-reload最后使用etcd用户systemctl restart etcd即可。
5.NetworkPolicy 中文解释 创建一个名字为allow-port-from-namespace的NetworkPolicy这个NetworkPolicy允许internal命名空间下的Pod访问该命名空间下的9000端口。 并且不允许不是internal命令空间的下的Pod访问 不允许访问没有监听9000端口的Pod。 参考
https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/解题
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: allow-port-from-namespacenamespace: internal
spec:ingress:- from:- podSelector: {}ports:- port: 9000protocol: TCPpodSelector: {}policyTypes:- Ingress6.Service 中文解释 重新配置一个已经存在的deployment front-end在名字为nginx的容器里面添加一个端口配置名字为http暴露端口号为80/TCP然后创建一个service名字为front-end-svc暴露该deployment的http端口并且service的类型为NodePort。
解题
kubectl edit deploy front-endspec:containers:- name: nginximage: nginx# 需要加这四行ports:- name: httpcontainerPort: 80protocol: TCP# 或者命令行添加service
kubectl expose deploy front-end --namefront-end-svc --port80 --target-porthttp --typeNodePort# 或者通过文件方式创建service
apiVersion: v1
kind: Service
metadata:name: front-end-svclabels:app: front-end
spec:type: NodePortselector:app: front-end # label需要匹配否则访问不到。ports:- name: httpprotocol: TCPport: 80targetPort: 80
7.Ingress 中文解释 在ing-internal 命名空间下创建一个ingress名字为pong代理的service hi端口为5678配置路径/hi。 验证访问curl -kL INTERNAL_IP/hi会返回hi。
解题
# ingressClassName需指定为nginx
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: pongnamespace: ing-internal
spec:ingressClassName: nginxrules:- http:paths:- path: /hipathType: Prefixbackend:service:name: hiport:number: 5678kubectl get ingress -n ing-internal 获取ip后curl验证# 如果考试环境没出ip需要在annotations下加一行
cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: pongnamespace: ing-internalannotations:nginx.ingress.kubernetes.ionginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- http:paths:- path: /hipathType: Prefixbackend:service:name: hiport:number: 5678ingressclassname如果不指定则会使用集群默认的指定的ingress。
Deployment扩缩容(4分 解题
kubectl config use-context k8s
kubectl scale --replicas6 deployment loadbalancer
kubectl edit deploy loadbalancer8.指定节点部署 解题
vim pod-ns.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-kusc00401labels:role: nginx-kusc00401
spec:nodeSelector:disk: spinningcontainers:- name: nginximage: nginxkubectl create -f pod-ns.yaml# 省时
kubectl run nginx-kusc00401 --imagenginx --dry-runclient -o yaml 9.yaml9.检查Node节点健康状态 解题;
kubectl config use-context k8s
# 记录总数为A
kubectl get node|grep -i ready|wc -l
# 记录总数为B
kubectl describe node|grep Taints|grep NoSchedule|wc -l
# 将A减B的值x导入到/opt/KUSC00402/kusc00402.txt
echo x /opt/KUSC00402/kusc00402.txt# 切换到指定集群
kubectl config use-context [NAME]
# Ready 状态的节点数减去 NoSchedule 状态的节点数
kubectl get node |grep -i ready
kubectl describe node |grep -i taints
echo 2 /opt/KUSC00402/kusc00402.txt10.一个Pod多个容器 中文解释 创建一个Pod名字为kucc1这个Pod可能包含1-4容器该题为四个nginxredismemcachedconsul 解题
apiVersion: v1
kind: Pod
metadata:name: kucc1
spec:containers:- image: nginxname: nginx- image: redisname: redis- image: memchachedname: memcached- image: consulname: consul# 或者用dry-runclient的命令快速生成yaml模板修改yaml加入新容器进去
kubectl run kucc1 --imagenginx --dry-runclient -o yaml 11.yaml
apiVersion: v1
kind: Pod
metadata:labels:run: kucc1name: kucc1
spec:containers:- image: nginxname: nginx- image: redisname: redis- image: memcachedname: memcached- image: consulname: consuldnsPolicy: ClusterFirstrestartPolicy: AlwaysPersistentVolume(4分 中文解释 创建一个pv名字为app-config大小为2Gi访问权限为ReadWriteMany。Volume的类型为hostPath路径为/srv/app-config
apiVersion: v1
kind: PersistentVolume
metadata:name: app-configlabels:type: local
spec:storageClassName: manual # 需要有这一项吗题目没有要求可以不写volumeMode: Filesystemcapacity:storage: 2GiaccessModes:- ReadWriteManyhostPath:path: /srv/app-configkubectl get pv app-config11.监控Pod度量指标 中文解释 找出具有namecpu-user的Pod并过滤出使用CPU最高的Pod然后把它的名字写在已经存在的 /opt/KUTR00401/KUTR00401.txt文件里注意他没有说指定namespace。所以需要使用-A指定所以namespace 解题
kubectl config use-context k8s
kubectl top pod -A -l namecpu-user
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system coredns-54d67798b7-hl8xc 7m 8Mi
kube-system coredns-54d67798b7-m4m2q 6m 8Mi# 注意这里的pod名字以实际名字为准按照CPU那一列进行选择一个最大的Pod另外如果CPU的数值是1 2 3这样的。是大于带m这样的因为1颗CPU等于1000m
注意要用而不是
echo coredns-54d67798b7-hl8xc /opt/KUTR00401/KUTR00401.txt# 其他解法
kubectl get pods -A --show-labels
kubectl top pods -A -l namecpu-user --sort-bycpu
echo [podname] /opt/KUTR00401/KUTR00401.txt
12.监控Pod日志 中文解释 监控名为foobar的Pod的日志并过滤出具有unable-access-website信息的行然后将写入到 /opt/KUTR00101/foobar 解题
kubectl config use-context k8s
kubectl logs foobar|grep unable-access-website /opt/KUTR00101/foobar13.PersistentVolumeClaim 中文翻译 创建一个名字为pv-volume的pvc指定storageClass为csi-hostpath-sc大小为10Mi 然后创建一个Pod名字为web-server镜像为nginx并且挂载该PVC至/usr/share/nginx/html挂载的权限为ReadWriteOnce。之后通过 kubectl edit或者 kubectl path将pvc改成70Mi并且记录修改记录。 解题
# 创建PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pv-volume
spec:accessModes:- ReadWriteOncevolumeMode: Filesystemresources:requests:storage: 10MistorageClassName: csi-hostpath-sc# 创建Pod
apiVersion: v1
kind: Pod
metadata:name: web-server
spec:containers:- name: nginximage: nginxvolumeMounts:- mountPath: /usr/share/nginx/htmlname: pv-volume # 名字不是必须和pvc一直也可以为my-volumevolumes:- name: pv-volume # 名字不是必须和pvc一直也可以为my-volumepersistentVolumeClaim:claimName: pv-volume# 扩容
# 方式一patch命令
kubectl patch pvc pv-volume -p {spec:{resources:{requests:{storage: 70Mi}}}} --record# 方式二edit
kubectl edit pvc pv-volume
# 记录修改记录需要加--record参数或--save-config
kubectl edit pvc pv-volume --record
kubectl edit pvc pv-volume --save-config
将两处10Mi都改为70Mi如果是nfs会因为不支持动态扩容而失败。
edit完需要稍等一会儿容量才会变为70Mi14.Sidecar 添加一个名为busybox且镜像为busybox的sidecar到一个已经存在的名为legacy-app的Pod上这个sidecar的启动命令为 /bin/sh, -c, ‘tail -n1 -f /var/log/legacy-app.log’。 并且这个sidecar和原有的镜像挂载一个名为logs的volume挂载的目录为/var/log/。
解题
kubectl get pod legacy-app -o yaml c-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:name: legacy-app
spec:containers:- name: countimage: busyboxargs:- /bin/sh- -c- i0;while true;doecho $(date) INFO $i /var/log/legacy-ap.log;i$((i1));sleep 1;done # 在此yaml中添加sidecar和volume
vim c-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:name: legacy-app
spec:containers:- name: countimage: busyboxargs:- /bin/sh- -c- i0;while true;doecho $(date) INFO $i /var/log/legacy-ap.log;i$((i1));sleep 1;done # 加上下面部分volumeMounts:- name: logsmountPath: /var/log- name: busyboximage: busyboxargs: [/bin/sh, -c, tail -n1 -f /var/log/legacy-ap.log]volumeMounts:- name: logsmountPath: /var/logvolumes:- name: logsemptyDir: {}kubectl delete -f c-sidecar.yaml
kubectl create -f c-sidecar.yaml# 检查
[rootk8smaster /opt/cka]# kubectl logs legacy-app -c busybox
15.集群故障排查——kubelet故障 中文解释 一个名为wk8s-node-0的节点状态为NotReady让其他恢复至正常状态并确认所有的更改开机自动完成 解题
# 检查wk8s-node-0 kubelet服务状态
ssh wk8s-node-0
sudo su -
systemctl status kubelet
systemctl start kubelet
systemctl enable kubelet其实这题没这么简单一般启动kubelet后大概率是启动失败的
可能的原因
1.kubelet二进制文件路径不对which kubelet后和服务启动文件kubelet systemd service做个对比看是否是这个原因
2.service文件路径和它启动的路径不一致在启动目录下找不到service文件可以全局搜下并做个软链接。
3.其他原因。# 再次检查wk8s-node-0是否在ready
ssh master01
kubectl get nodes