随着 Kubernetes 的发展,如今各大企业对于能在 Kubernetes 上构建应用程序的开发人员的需求也在不断增长。2018 年 5 月,CNCF 曾推出 CKAD 考试,旨在考察工程师是否具备在 Kubernetes 上设计、构建、配置和公开云原生应用程序的能力

上周,K8sMeetup 中国社区发布了 CKAD 模拟训练的前 50 道考题,社区反响热烈。

众所周知,CKAD 考试内容分为:

  • 核心概念(13%)
  • 多容器 Pod(10%)
  • Pod 设计(20%)
  • 状态持久性(8%)
  • 配置(18%)
  • 可观察性(18%)
  • 服务和网络(13%)

今天,社区将围绕 Pod 设计和状态持久性提供后续五十个新问题,以飨读者。

Pod 设计(二)

请根据以下概念进行练习:了解如何使用 Labels、Selectors 和 Annotations,了解部署以及如何执行滚动更新,了解部署以及如何执行回滚,了解 Jobs 和 CronJobs
注:此部分考题需结合上周题目一起做。

52.使用节点选择器验证已调度的 Pod

kubectl describe po nginx | grep Node-Selectors

53.验证我们刚刚创建的 Pod Nginx 是否具有 nodeName=nginxnode 这个标签

kubectl describe po nginx | grep Labels

54.用 name=webapp 注释 Pod

kubectl annotate pod nginx-dev{1..3} name=webapp
kubectl annotate pod nginx-prod{1..2} name=webapp

55.验证已正确注释的 Pod

kubectl describe po nginx-dev{1..3} | grep -i annotations
kubectl describe po nginx-prod{1..2} | grep -i annotations

56.删除 Pod 上的注释并验证

kubectl annotate pod nginx-dev{1..3} name-
kubectl annotate pod nginx-prod{1..2} name-
kubectl describe po nginx-dev{1..3} | grep -i annotations
kubectl describe po nginx-prod{1..2} | grep -i annotations

57.删除到目前为止我们创建的所有 Pod

kubectl delete po --all

58.创建一个名为 webapp 的 Deployment,它带有 5 个副本的镜像 Nginx

kubectl create deploy webapp --image=nginx --dry-run -o yaml > webapp.yaml
// change the replicas to 5 in the yaml and create it
kubectl create -f webapp.yaml

59.用标签获取我们刚刚创建的 Deployment

kubectl get deploy webapp --show-labels

60.导出该 Deployment 的 yaml 文件

kubectl get deploy webapp -o yaml

61.获取该 Deployment 的 Pod

// get the label of the deployment
kubectl get deploy --show-labels
// get the pods with that label
kubectl get pods -l app=webapp

62.将该 Deployment 从 5 个副本扩展到 20 个副本并验证

kubectl scale deploy webapp --replicas=20
kubectl get po -l app=webapp

63.获取该 Deployment 的 rollout 状态

kubectl rollout status deploy webapp

64.获取使用该 Deployment 创建的副本集

kubectl get rs -l app=webapp

65.获取该 Deployment 的副本集和 Pod 的 yaml

kubectl get rs -l app=webapp -o yaml
kubectl get po -l app=webapp -o yaml

66.删除刚创建的 Deployment,并查看所有 Pod 是否已被删除

kubectl delete deploy webapp
kubectl get po -l app=webapp -w

67.使用镜像 nginx:1.17.1 和容器端口 80 创建 webapp Deployment,并验证镜像版本

kubectl create deploy webapp --image=nginx:1.17.1 --dry-run -o yaml > webapp.yaml
// add the port section and create the deployment
kubectl create -f webapp.yaml
// verify
kubectl describe deploy webapp | grep Image

68.使用镜像版本 1.17.4 更新 Deployment 并验证

kubectl set image deploy/webapp nginx=nginx:1.17.4
kubectl describe deploy webapp | grep Image

69.检查 rollout 历史记录,并确保更新后一切正常

kubectl rollout history deploy webapp
kubectl get deploy webapp --show-labels
kubectl get rs -l app=webapp
kubectl get po -l app=webapp

70.撤消之前使用版本 1.17.1 的 Deployment,并验证镜像是否还有老版本

kubectl rollout undo deploy webapp
kubectl describe deploy webapp | grep Image

71.使用镜像版本 1.16.1 更新 Deployment,并验证镜像、检查 rollout 历史记录

kubectl set image deploy/webapp nginx=nginx:1.16.1
kubectl describe deploy webapp | grep Image
kubectl rollout history deploy webapp

72.将 Deployment 更新到镜像 1.17.1 并确认一切正常

kubectl rollout undo deploy webapp --to-revision=3
kubectl describe deploy webapp | grep Image
kubectl rollout status deploy webapp

73.使用错误的镜像版本 1.100 更新 Deployment,并验证有问题

kubectl set image deploy/webapp nginx=nginx:1.100
kubectl rollout status deploy webapp (still pending state)
kubectl get pods (ImagePullErr)

74.撤消使用先前版本的 Deployment,并确认一切正常

kubectl rollout undo deploy webapp
kubectl rollout status deploy webapp
kubectl get pods

75.检查该 Deployment 的特定修订版本的历史记录

kubectl rollout history deploy webapp --revision=7

76.暂停 Deployment rollout

kubectl rollout pause deploy webapp

77.用最新版本的镜像更新 Deployment,并检查历史记录

kubectl set image deploy/webapp nginx=nginx:latest
kubectl rollout history deploy webapp (No new revision)

78.恢复 Deployment rollout

kubectl rollout resume deploy webapp

79.检查 rollout 历史记录,确保是最新版本

kubectl rollout history deploy webapp
kubectl rollout history deploy webapp --revision=9

80.将自动伸缩应用到该 Deployment 中,最少副本数为 10,最大副本数为 20,目标 CPU 利用率 85%,并验证 hpa 已创建,将副本数从 1 个增加到 10 个

kubectl autoscale deploy webapp --min=10 --max=20 --cpu-percent=85
kubectl get hpa
kubectl get pod -l app=webapp

81.通过删除刚刚创建的 Deployment 和 hpa 来清理集群

kubectl delete deploy webapp
kubectl delete hpa webapp

82.用镜像 node 创建一个 Job,并验证是否有对应的 Pod 创建

kubectl create job nodeversion --image=node -- node -v
kubectl get job -w
kubectl get pod

83.获取刚刚创建的 Job 的日志

kubectl logs <pod name> // created from the job

84.用镜像 busybox 输出 Job 的 yaml 文件,并回显“Hello I am from job”

kubectl create job hello-job --image=busybox --dry-run -o yaml -- echo "Hello I am from job"

85.将上面的 yaml 文件复制到 hello-job.yaml 文件并创建 Job

kubectl create job hello-job --image=busybox --dry-run -o yaml -- echo "Hello I am from job" > hello-job.yaml
kubectl create -f hello-job.yaml

86.验证 Job 并创建关联的容器,检查日志

kubectl get job
kubectl get po
kubectl logs hello-job-*

87.删除我们刚刚创建的 Job

kubectl delete job hello-job

88.创建一个相同的 Job,并使它一个接一个地运行 10 次

kubectl create job hello-job --image=busybox --dry-run -o yaml -- echo "Hello I am from job" > hello-job.yaml
// edit the yaml file to add completions: 10
kubectl create -f hello-job.yaml

89.运行 10 次,确认已创建 10 个 Pod,并在完成后删除它们

kubectl get job -w
kubectl get po
kubectl delete job hello-job

90.创建相同的 Job 并使它并行运行 10 次

kubectl create job hello-job --image=busybox --dry-run -o yaml -- echo "Hello I am from job" > hello-job.yaml
// edit the yaml file to add parallelism: 10
kubectl create -f hello-job.yaml

91.并行运行 10 次,确认已创建 10 个 Pod,并在完成后将其删除

kubectl get job -w
kubectl get po
kubectl delete job hello-job

92.创建一个带有 busybox 镜像的 Cronjob,每分钟打印一次来自 Kubernetes 集群消息的日期和 hello

kubectl create cronjob date-job --image=busybox --schedule="*/1 * * * *" -- bin/sh -c "date; echo Hello from kubernetes cluster"

93.输出上述 cronjob 的 yaml 文件

kubectl get cj date-job -o yaml

94.验证 cronJob 为每分钟运行创建一个单独的 Job 和 Pod,并验证 Pod 的日志

kubectl get job
kubectl get po
kubectl logs date-job-<jobid>-<pod>

95.删除 cronJob,并验证所有关联的 Job 和 Pod 也都被删除

kubectl delete cj date-job
// verify pods and jobs
kubectl get po
kubectl get job
状态持久性

根据概念练习问题:了解存储的持久卷声明

96.列出集群中的持久卷

kubectl get pv

97.创建一个名为 task-pv-volume 的 PersistentVolume,其 storgeClassName 为 manual,storage 为 10Gi,accessModes 为 ReadWriteOnce,hostPath 为 /mnt/data

kubectl create -f task-pv-volume.yaml
kubectl get pv

98.创建一个存储至少 3Gi、访问模式为 ReadWriteOnce 的 PersistentVolumeClaim,并确认它的状态是否是绑定的

kubectl create -f task-pv-claim.yaml
kubectl get pvc

99.删除我们刚刚创建的持久卷和 PersistentVolumeClaim

kubectl delete pvc task-pv-claim
kubectl delete pv task-pv-volume

100.使用镜像 Redis 创建 Pod,并配置一个在 Pod 生命周期内可持续使用的卷

// emptyDir is the volume that lasts for the life of the pod
kubectl create -f redis-storage.yaml

101.在上面的 Pod 中执行操作,并在 /data/redis 路径中创建一个名为 file.txt 的文件,其文本为“This is the file”,然后打开另一个选项卡,再次使用同一 Pod 执行,并验证文件是否在同一路径中

// first terminal
kubectl exec -it redis-storage /bin/sh
cd /data/redis
echo 'This is called the file' > file.txt
//open another tab
kubectl exec -it redis-storage /bin/sh
cat /data/redis/file.txt

102.删除上面的 Pod,然后从相同的 yaml 文件再次创建,并验证路径 /data/redis 中是否没有 file.txt

kubectl delete pod redis
kubectl create -f redis-storage.yaml
kubectl exec -it redis-storage /bin/sh
cat /data/redis/file.txt // file doesn't exist

103.创建一个名为 task-pv-volume 的 PersistentVolume,其 storgeClassName 为 manual,storage 为 10Gi,accessModes 为 ReadWriteOnce,hostPath 为 /mnt/data;并创建一个存储至少 3Gi、访问模式为 ReadWriteOnce 的 PersistentVolumeClaim,并确认它的状态是否是绑定的

kubectl create -f task-pv-volume.yaml
kubectl create -f task-pv-claim.yaml
kubectl get pv
kubectl get pvc

104.用容器端口 80 和 PersistentVolumeClaim task-pv-claim 创建一个 Nginx 容器,且具有路径“/usr/share/nginx/html”

kubectl create -f task-pv-pod.yaml

原文地址:https://mp.weixin.qq.com/s?__biz=Mzg3ODAzMTMyNQ==&mid=2247485488&idx=1&sn=dc142b5dacfee62609966d0231e0751a&chksm=cf18b082f86f3994d1bb16edff85ec7010e4b6c39a1f571e931bd1cf3c4a9aac8557809a6bbc&token=1017947735&lang=zh_CN#rd

参考文献:medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam