0


2024年K8S管理员认证(CKA)考题

1、权限控制 RBAC(权重4%)

设置配置环境:
kubectl config use-context k8s
Context
为部署流水线创建一个新的 ClusterRole 并将其绑定到范围为特定的 namespace 的特定 ServiceAccount。
Task
创建一个名为 deployment-clusterrole 且仅允许创建以下资源类型的新 ClusterRole:
Deployment
StatefulSet
DaemonSet
在现有的 namespace app-team1 中创建一个名为 cicd-token 的新 ServiceAccount。
限于 namespace app-team1 中,将新的 ClusterRole deployment-clusterrole 绑定到新的 ServiceAccount cicd-token。

  1. # 切换答题环境(考试环境有多个,每道题要在对应的环境中作答)
  2. kubectl config use-context k8s
  3. # 创建ClusterRole
  4. kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
  5. # 创建ServiceAccount
  6. kubectl create serviceaccount cicd-token -n app-team1
  7. # 绑定ClusterRole与ServiceAccount
  8. kubectl create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -n app-team1
  9. # 检查
  10. kubectl -n app-team1 describe rolebinding cicd-token

2、查看 pod 的 CPU(权重5%)

设置配置环境:
kubectl config use-context k8s
Task
通过 pod label name=cpu-loader,找到运行时占用大量 CPU 的 pod,
并将占用 CPU 最高的 pod 名称写入文件 /opt/KUTR000401/KUTR00401.txt(已存在)。

  1. # 切换答题环境(考试环境有多个,每道题要在对应的环境中作答)
  2. kubectl config use-context k8s
  3. # 查找CPU使用率最高的Pod。
  4. kubectl top pod -l name=cpu-loader --sort-by=cpu -A
  5. # 将查到Pod名称输出到指定文件
  6. echo "podename" > /opt/KUTR000401/KUTR00401.txt

3、配置网络策略 NetworkPolicy(权重7%)

设置配置环境:
kubectl config use-context hk8s
Task
在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。
确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的 Pods 的 9000 端口。
进一步确保新的 NetworkPolicy:
不允许对没有在监听 端口 9000 的 Pods 的访问
不允许非来自 namespace echo 中的 Pods 的访问

  1. # 切换答题环境(考试环境有多个,每道题要在对应的环境中作答)
  2. kubectl config use-context k8s
  3. # 查看所有 ns 的标签 label
  4. kubectl get ns --show-labels
  5. # 给my-app命名空间打一个标签
  6. kubectl label ns my-app project=echo
  7. # 编写一个 yaml 文件
  8. vim networkpolicy.yaml
  9. apiVersion: networking.k8s.io/v1
  10. kind: NetworkPolicy
  11. metadata:
  12. name: allow-port-from-namespace #题目的名字
  13. namespace: my-app #被访问者的命名空间
  14. spec:
  15. podSelector: {}
  16. policyTypes:
  17. - Ingress #策略影响入栈流量
  18. ingress:
  19. - from: #允许流量的来源
  20. - namespaceSelector:
  21. matchLabels:
  22. project: echo #访问者的命名空间的标签 label
  23. ports:
  24. - protocol: TCP
  25. port: 9000 #被访问者公开的端口
  26. # 创建
  27. kubectl apply -f networkpolicy.yaml
  28. # 检查
  29. kubectl describe networkpolicy -n my-app

参考地址:网络策略 | Kubernetes

4、暴露服务 service(权重7%)

设置配置环境:
kubectl config use-context k8s
Task
请重新配置现有的 deployment front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端口 80/tcp。
创建一个名为 front-end-svc 的新 service,以公开容器端口 http。
配置此 service,以通过各个 Pod 所在的节点上的 NodePort 来公开他们。

  1. # 切换答题环境(考试环境有多个,每道题要在对应的环境中作答)
  2. kubectl config use-context k8s
  3. # 检查 deployment 信息,并记录 SELECTOR 的 Lable 标签,这里是 app=front-end
  4. kubectl get deployment front-end -o wide
  5. # 配置deployment暴露端口,添加如下图配置
  6. kubectl edit deployment front-end

  1. # 暴露对应端口
  2. kubectl expose deployment front-end --type=NodePort --port=80 --target-port=80 --name=front-end-svc
  3. # 注意考试中需要创建的是 NodePort,还是 ClusterIP。如果是 ClusterIP,则应为--type=ClusterIP
  4. # --port 是 service 的端口号,--target-port 是 deployment 里 pod 的容器的端口号。
  5. # 暴露服务后,检查一下 service 的 selector 标签是否正确,这个要与 deployment 的 selector 标签一致的。
  6. # 检查
  7. kubectl get svc front-end-svc -o wide
  8. kubectl get deployment front-end -o wide
  9. # 如果你 kubectl expose 暴露服务后,发现 service 的 selector 标签是空的<none>,或者不是 deployment 的标签则需要编辑此 service,手动添加标签。
  10. kubectl edit svc front-end-svc
  11. # 在 ports 这一小段下面添加 selector 标签
  12. selector:
  13. app: front-end #注意 yaml 里是写冒号,而不是等号,不是 app=front-end。

service:

5、创建 Ingress(权重7%)

设置配置环境:
kubectl config use-context k8s
Task
如下创建一个新的 nginx Ingress 资源:
名称: ping
Namespace: ing-internal
使用服务端口 5678 在路径 /hello 上公开服务 hello
可以使用以下命令检查服务 hello 的可用性,该命令应返回 hello:
curl -kL <INTERNAL_IP>/hello

  1. # 切换答题环境(考试环境有多个,每道题要在对应的环境中作答)
  2. kubectl config use-context k8s
  3. # 创建 ingressclass 的 yaml
  4. vim ingressclass.yaml
  5. apiVersion: networking.k8s.io/v1
  6. kind: IngressClass
  7. metadata:
  8. labels:
  9. app.kubernetes.io/component: controller
  10. name: nginx #考试时没有 ingressClassName,所以需要先手动建一个 ingressClassName,命名就为 nginx。官网页面里是 ingress-example,记得修改下。
  11. annotations:
  12. ingressclass.kubernetes.io/is-default-class: "true"
  13. spec:
  14. controller: k8s.io/ingress-nginx
  15. # 执行yaml文件
  16. kubectl apply -f ingressclass.yaml
  17. #创建ingress的yaml文件
  18. vim ingress.yaml
  19. apiVersion: networking.k8s.io/v1
  20. kind: Ingress
  21. metadata:
  22. name: pong
  23. namespaceing-internal
  24. spec:
  25. ingressClassName: nginx
  26. rules:
  27. - http:
  28. paths:
  29. - path: /hello
  30. pathType: Prefix
  31. backend:
  32. service:
  33. name: hello
  34. port:
  35. number: 5678
  36. #创建
  37. kubectl apply -f ingress.yaml
  38. #检查
  39. kubectl get ingress -n ing-internal
  40. curl ingress ip 地址/hello

ingressclass.yaml

ingress.yaml


参考地址:Ingress | Kubernetes

6、扩容 deployment 副本数量(权重4%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
将名为test的deployment资源的Pod的副本数扩容为6个。

  1. # 切换答题环境(考试环境有多个,每道题要在对应的环境中作答)
  2. kubectl config use-context k8s
  3. # 使用命令进行扩容
  4. kubectl scale deployment test --replicas=6
  5. # 检查
  6. kubectl get deployments test -o wide

7、调度 pod 到指定节点(权重4%)

设置配置环境:
kubectl config use-context k8s
Task
按如下要求调度一个 pod:
名称:nginx-kusc00401
Image:nginx
Node selector:disk=ssd

  1. # 切换答题环境(考试环境有多个,每道题要在对应的环境中作答)
  2. kubectl config use-context k8s
  3. # 确保 node 有这个 labels。
  4. kubectl get nodes --show-labels|grep 'disk=ssd'
  5. # 如果没有设置,则使用命令来手动自己设置。
  6. kubectl label nodes node01 disk=ssd
  7. # 编辑yaml文件
  8. vim pod-disk-ssd.yaml
  9. apiVersion: v1
  10. kind: Pod
  11. metadata:
  12. name: nginx-kusc00401
  13. spec:
  14. containers:
  15. - name: nginx
  16. image: nginx
  17. nodeSelector:
  18. disk: ssd
  19. # 执行yaml文件
  20. kubectl apply -f pod-disk-ssd.yaml

参考地址:将 Pod 分配给节点 | Kubernetes

8、查看可用节点数量(权重4%)

设置配置环境:
kubectl config use-context k8s
Task
检查有多少 nodes 已准备就绪(不包括被打上 Taint:NoSchedule 的节点),
并将数量写入 /opt/KUSC00402/kusc00402.txt

  1. # 切换集群
  2. kubectl config use-context k8s
  3. # grep 的-i 是忽略大小写,grep -v 是排除在外,grep -c 是统计查出来的条数。
  4. kubectl describe nodes | grep -i Taints | grep -vc NoSchedule
  5. echo "查出来的数字" > /opt/KUSC00402/kusc00402.txt

9、创建多容器的 pod(权重4%)

设置配置环境:
kubectl config use-context k8s
Task
按如下要求调度一个 Pod:
名称:kucc8
app containers: 2
container 名称/images:

  • nginx
  • consu
  1. # 切换集群
  2. kubectl config use-context k8s
  3. # 开始操作
  4. vim pod-kucc.yaml
  5. apiVersion: v1
  6. kind: Pod
  7. metadata:
  8. name: kucc8
  9. spec:
  10. containers:
  11. - name: nginx
  12. image: nginx
  13. imagePullPolicy: IfNotPresent
  14. - name: consul
  15. image: consul
  16. imagePullPolicy: IfNotPresent
  17. kubectl apply -f pod-kucc.yaml
  18. # 检查
  19. kubectl get pod kucc8

参考地址:Pod | Kubernetes

10、创建 PV(权重4%)

设置配置环境:
kubectl config use-context hk8s
Task
创建名为 app-config 的 persistent volume,容量为 1Gi,访问模式为 ReadWriteMany。
volume 类型为 hostPath,位于 /srv/app-config

  1. # 切换集群
  2. kubectl config use-context k8s
  3. # 开始操作
  4. vim pv.yaml
  5. apiVersion: v1
  6. kind: PersistentVolume
  7. metadata:
  8. name: app-config
  9. spec:
  10. capacity:
  11. storage: 1Gi
  12. accessModes:
  13. - ReadWriteMany # 注意,根据题目要求写。
  14. hostPath:
  15. path: "/srv/app-config"
  16. # 创建
  17. kubectl apply -f pv.yaml

参考地址:配置 Pod 以使用 PersistentVolume 作为存储 | Kubernetes

11、创建 PVC(权重7%)

设置配置环境:
kubectl config use-context ok8s
Task
创建一个新的 PersistentVolumeClaim:
名称: pv-volume
Class: csi-hostpath-sc
容量: 10Mi
创建一个新的 Pod,来将 PersistentVolumeClaim 作为 volume 进行挂载:
名称:web-server
Image:nginx:1.16
挂载路径:/usr/share/nginx/html
配置新的 Pod,以对 volume 具有 ReadWriteOnce 权限。
最后,使用 kubectl edit 或 kubectl patch 将 PersistentVolumeClaim 的容量扩展为 70Mi,并记录此更改。

  1. # 切换集群
  2. kubectl config use-context k8s
  3. # 开始操作
  4. vim pvc.yaml
  5. apiVersion: v1
  6. kind: PersistentVolumeClaim
  7. metadata:
  8. name: pv-volume #pvc 名字
  9. spec:
  10. storageClassName: csi-hostpath-sc
  11. accessModes:
  12. - ReadWriteOnce # 注意,根据题目要求写。
  13. resources:
  14. requests:
  15. storage: 10Mi
  16. # 创建 PVC
  17. kubectl apply -f pvc.yaml
  18. vim pvc-pod.yaml
  19. apiVersion: v1
  20. kind: Pod
  21. metadata:
  22. name: web-server
  23. spec:
  24. volumes:
  25. - name: task-pv-storage #与下面volumeMounts的name保持一致
  26. persistentVolumeClaim:
  27. claimName: pv-volume #这个要使用上面创建的 pvc 名字
  28. containers:
  29. - name: nginx
  30. image: nginx:1.16
  31. volumeMounts:
  32. - mountPath: "/usr/share/nginx/html"
  33. name: task-pv-storage #与上面volumes的name保持一致
  34. # 创建
  35. kubectl apply -f pvc-pod.yaml
  36. # 检查
  37. kubectl get pod web-server
  38. # 修改容量
  39. kubectl edit pvc pvvolume --save-config
  40. # 把pvc.yaml(图一)中10Mi改成70Mi即可,

vim pvc.yaml

vim pvc-pod.yaml

参考地址:配置 Pod 以使用 PersistentVolume 作为存储 | Kubernetes

12、查看 pod 日志(权重5%)

设置配置环境:
kubectl config use-context k8s
Task
监控 pod foo 的日志并:
提取与错误 RLIMIT_NOFILE 相对应的日志行
将这些日志行写入 /opt/KUTR00101/foo

  1. # 切换集群
  2. kubectl config use-context k8s
  3. # 开始操作
  4. kubectl logs foo | grep "RLIMIT_NOFILE" > /opt/KUTR00101/foo
  5. # 检查
  6. cat /opt/KUTR00101/foo

13、使用 sidecar 代理容器日志(权重7%)

设置配置环境:
kubectl config use-context k8s
Context
将一个现有的 Pod 集成到 Kubernetes 的内置日志记录体系结构中(例如 kubectl logs)。
添加 streaming sidecar 容器是实现此要求的一种好方法。
Task
使用 busybox Image 来将名为 sidecar 的 sidecar 容器添加到现有的 Pod 11-factor-app 中。
新的 sidecar 容器必须运行以下命令:
/bin/sh -c tail -n+1 -f /var/log/11-factor-app.log
使用挂载在/var/log 的 Volume,使日志文件 11-factor-app.log 可用于 sidecar 容器。
除了添加所需要的 volume mount 以外,请勿更改现有容器的规格。

  1. # 切换集群
  2. kubectl config use-context k8s
  3. # 开始操作
  4. kubectl get pod 11-factor-app -o yaml > varlog.yaml
  5. # 备份 yaml 文件,防止改错了,回退。
  6. cp varlog.yaml varlog-bak.yaml
  7. # 修改 varlog.yaml 文件
  8. vim varlog.yaml
  9. spec:
  10. volumeMounts:
  11. - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
  12. name: default-token-4l6w8
  13. readOnly: true
  14. - name: varlog
  15. mountPath: /var/log
  16. - name: sidecar #新加内容,注意 name 别写错了
  17. image: busybox #新加内容
  18. args: [/bin/sh, -c, 'tail -n+1 -f /var/log/11-factor-app.log'] #新加内容
  19. volumeMounts: #新加内容
  20. - name: varlog #新加内容
  21. mountPath: /var/log #新加内容
  22. dnsPolicy: ClusterFirst
  23. enableServiceLinks: true
  24. volumes:
  25. - name: kube-api-access-kcjc2
  26. projected:
  27. defaultMode: 420
  28. sources:
  29. - serviceAccountToken:
  30. expirationSeconds: 3607
  31. path: token
  32. - configMap:
  33. items:
  34. - key: ca.crt
  35. path: ca.crt
  36. name: kube-root-ca.crt
  37. - downwardAPI:
  38. items:
  39. - fieldRef:
  40. apiVersion: v1
  41. fieldPath: metadata.namespace
  42. path: namespace
  43. - name: varlog #新加内容,注意找好位置。
  44. emptyDir: {} #新加内容
  45. # 删除原先的 pod
  46. kubectl delete pod 11-factor-app
  47. kubectl get pod 11-factor-app
  48. # 新建这个 pod
  49. kubectl apply -f varlog.yaml

参考地址:日志架构 | Kubernetes

14、升级集群(权重7%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context mk8s
Task
现有的 Kubernetes 集群正在运行版本 1.28.0。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.28.1。
确保在升级之前 drain master 节点,并在升级后 uncordon master 节点。
可以使用以下命令,通过 ssh 连接到 master 节点:
ssh master01
可以使用以下命令,在该 master 节点上获取更高权限:
sudo -i
另外,在主节点上升级 kubelet 和 kubectl。
请不要升级工作节点,etcd,container 管理器,CNI 插件, DNS 服务或任何其他插件。

  1. # 切换集群
  2. kubectl config use-context k8s
  3. kubectl get nodes
  4. # 打污点,强制驱逐node节点的pod
  5. kubectl cordon master01
  6. kubectl drain master01 --ignore-daemonsets=false
  7. ssh master01
  8. sudo -i
  9. apt-get update
  10. apt-cache show kubeadm|grep 1.28.1
  11. apt-get install kubeadm=1.28.1-00
  12. # 检查
  13. kubeadm version
  14. # 验证升级计划,会显示很多可升级的版本,我们关注题目要求升级到的那个版本。
  15. kubeadm upgrade plan
  16. # 排除 etcd,升级其他的,提示时,输入 y。大约要等 5 分钟。
  17. kubeadm upgrade apply v1.28.1 --etcd-upgrade=false
  18. # 升级 kubelet
  19. apt-get install kubelet=1.28.1-00
  20. systemctl restart kubelet
  21. kubelet --version
  22. # 恢复 master01 调度
  23. kubectl uncordon master01
  24. kubectl get nodes

参考地址:升级 kubeadm 集群 | Kubernetes

15、备份还原 etcd(权重7%

设置配置环境
此项目无需更改配置环境。但是,在执行此项目之前,请确保您已返回初始节点。
注意,这个之前是在 master01 上,所以要 exit 退到 node01,如果已经是 node01 了,就不要再 exit 了。
Task
首先,为运行在 https://11.0.1.111:2379 上的现有 etcd 实例创建快照并将快照保存到 /var/lib/backup/etcd-snapshot.db
(注意,真实考试中,这里写的是 https://127.0.0.1:2379)
为给定实例创建快照预计能在几秒钟内完成。 如果该操作似乎挂起,则命令可能有问题。用 CTRL + C 来取消操作,然后重试。
然后还原位于/data/backup/etcd-snapshot-previous.db 的现有先前快照。
提供了以下 TLS 证书和密钥,以通过 etcdctl 连接到服务器。
CA 证书: /opt/KUIN00601/ca.crt
客户端证书: /opt/KUIN00601/etcd-client.crt
客户端密钥: /opt/KUIN00601/etcd-client.key

  1. #切换集群#
  2. kubectl config use-context k8s
  3. 备份:
  4. # 如果不使用 export ETCDCTL_API=3,而使用 ETCDCTL_API=3,则下面每条 etcdctl 命令前都要加 ETCDCTL_API=3。
  5. # 如果执行时,提示 permission denied,则是权限不够,命令最前面加 sudo 即可。
  6. export ETCDCTL_API=3
  7. etcdctl --endpoints=https://127.0.0.1:2379 --cacert="/opt/KUIN00601/ca.crt" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key"
  8. snapshot save /var/lib/backup/etcd-snapshot.db
  9. 检查
  10. etcdctl snapshot status /var/lib/backup/etcd-snapshot.db -wtable
  11. 1、先检查一下考试环境,使用的 etcd 是服务还是容器。
  12. kubectl get pod -A
  13. sudo systemctl status etcd
  14. 如果是 systemd 服务,则继续往下操作。
  15. 2、确认 etcd 数据目录(--data-dir 值)
  16. ps -ef |grep etcd
  17. 一般默认为/var/lib/etcd
  18. 3、停止 etcd 服务
  19. sudo systemctl stop etcd
  20. 4、先移动备份 etcd 原目录
  21. sudo mv /var/lib/etcd /var/lib/etcd.bak
  22. 5、开始还原(还原时,可以不加证书和秘钥)
  23. sudo ETCDCTL_API=3 etcdctl --data-dir=/var/lib/etcd snapshot restore /data/backup/etcd-snapshot-previous.db
  24. 6、更改文件属主
  25. sudo chown -R etcd:etcd /var/lib/etcd
  26. 7、启动 etcd 服务
  27. sudo systemctl start etcd

参考地址:操作 Kubernetes 中的 etcd 集群 | Kubernetes

16、排查集群中故障节点 (权重13%)

设置配置环境:
kubectl config use-context wk8s
Task
名为 node02 的 Kubernetes worker node 处于 NotReady 状态。
调查发生这种情况的原因,并采取相应的措施将 node 恢复为 Ready 状态,确保所做的任何更改永久生效。可以使用以下命令,通过 ssh 连接到 node02 节点:
ssh node02
可以使用以下命令,在该节点上获取更高权限:
sudo -i

  1. #切换集群
  2. kubectl config use-context k8s
  3. ssh node2
  4. sudo -i
  5. systemctl status kubelet
  6. systemctl enable kubelet
  7. systemctl start kubelet
  8. #检查
  9. kubectl get nodes

17、节点维护(权重4%)

设置配置环境:
kubectl config use-context ek8s
Task
将名为 node02 的 node 设置为不可用,并重新调度该 node 上所有运行的 pods。

  1. #切换集群
  2. kubectl config use-context k8s
  3. kubectl crodon node02
  4. kubectl drain node02 --ignore-daemonsets
  5. # 注意,还有一个参数--delete-emptydir-data --force,这个考试时不用加,就可以正常 draini node02 的。
  6. # 但如果执行后,有跟测试环境一样的报错,则需要加上--delete-emptydir-data --force,会强制将 pod 移除。
  7. # kubectl drain node02 --ignore-daemonsets --delete-emptydir-data --force
标签: docker php kubernetes

本文转载自: https://blog.csdn.net/weixin_53851491/article/details/137040823
版权归原作者 想养八只猫 所有, 如有侵权,请联系我们删除。

“2024年K8S管理员认证(CKA)考题”的评论:

还没有评论