随着 Kubernetes 的发展,如今各大企业对于能在 Kubernetes 上构建应用程序的开发人员的需求也在不断增长。2018 年 5 月,CNCF 曾推出 CKAD 考试,旨在考察工程师是否具备在 Kubernetes 上设计、构建、配置和公开云原生应用程序的能力。
由于这是一个考验个人技术能力的考试,工程师仅知道概念是远远不够的,他们需要在考试前进行大量练习。2019 年即将步入尾声,面对新一年的各种机遇的挑战,K8sMeetup 中国社区在此提供了 50 道练习题,帮助开发者测试自己的技术熟练程度。
核心概念
请根据以下概念进行练习:了解 Kubernetes API 原语,创建和配置基本 Pod。
1.列出集群中的所有命名空间
kubectl get namespaces
kubectl get ns
2.列出所有命名空间中的所有 Pod
kubectl get po --all-namespaces
3.列出特定命名空间中的所有 Pod
kubectl get po -n <namespace name>
4.列出特定命名空间中的所有 Service
kubectl get svc -n <namespace name>
5.用 json 路径表达式列出所有显示名称和命名空间的 Pod
kubectl get pods -o=jsonpath="{.items[*]['metadata.name', 'metadata.namespace']}"
6.在默认命名空间中创建一个 Nginx Pod,并验证 Pod 是否正在运行
// creating a pod
kubectl run nginx --image=nginx --restart=Never
// List the pod
kubectl get po
7.使用 yaml 文件创建相同的 Nginx Pod
// get the yaml file with --dry-run flag
kubectl run nginx --image=nginx --restart=Never --dry-run -o yaml > nginx-pod.yaml
// cat nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Never
status: {}
// create a pod
kubectl create -f nginx-pod.yaml
8.输出刚创建的 Pod 的 yaml 文件
kubectl get po nginx -o yaml
9.输出刚创建的 Pod 的 yaml 文件,并且其中不包含特定于集群的信息
kubectl get po nginx -o yaml --export
10.获取刚刚创建的 Pod 的完整详细信息
kubectl describe pod nginx
11.删除刚创建的 Pod
kubectl delete po nginx
kubectl delete -f nginx-pod.yaml
12.强制删除刚创建的 Pod
kubectl delete po nginx --grace-period=0 --force
13.创建版本为 1.17.4 的 Nginx Pod,并将其暴露在端口 80 上
kubectl run nginx --image=nginx:1.17.4 --restart=Never --port=80
14.将刚创建的容器的镜像更改为 1.15-alpine,并验证该镜像是否已更新
kubectl set image pod/nginx nginx=nginx:1.15-alpine
kubectl describe po nginx
// another way it will open vi editor and change the version
kubeclt edit po nginx
kubectl describe po nginx
15.对于刚刚更新的 Pod,将镜像版本改回 1.17.1,并观察变化
kubectl set image pod/nginx nginx=nginx:1.17.1
kubectl describe po nginx
kubectl get po nginx -w # watch it
16.在不使用 describe 命令的情况下检查镜像版本
kubectl get po nginx -o jsonpath='{.spec.containers[].image}{"\n"}'
17.创建 Nginx Pod 并在 Pod 上执行简单的 shell
// creating a pod
kubectl run nginx --image=nginx --restart=Never
// exec into the pod
kubectl exec -it nginx /bin/sh
18.获取刚刚创建的 Pod 的 IP 地址
kubectl get po nginx -o wide
19.创建一个 busybox Pod,在创建它时运行命令 ls 并检查日志
kubectl run busybox --image=busybox --restart=Never -- ls
kubectl logs busybox
20.如果 Pod 崩溃了,请检查 Pod 的先前日志
kubectl logs busybox -p
21.使用命令 sleep 3600 创建一个 busybox Pod
kubectl run busybox --image=busybox --restart=Never -- /bin/sh -c "sleep 3600"
22.检查 busybox Pod 中 Nginx Pod 的连接
kubectl get po nginx -o wide
// check the connection
kubectl exec -it busybox -- wget -o- <IP Address>
23.创建一个能回显消息“How are you”的 busybox Pod,并手动将其删除
kubectl run busybox --image=nginx --restart=Never -it -- echo "How are you"
kubectl delete po busybox
24.创建一个能回显消息“How are you”的 busybox Pod,并手动将其删除
// notice the --rm flag
kubectl run busybox --image=nginx --restart=Never -it --rm -- echo "How are you"
25.创建一个 Nginx Pod 并列出具有不同复杂度(verbosity)的 Pod
// create a pod
kubectl run nginx --image=nginx --restart=Never --port=80
// List the pod with different verbosity
kubectl get po nginx --v=7
kubectl get po nginx --v=8
kubectl get po nginx --v=9
26.使用自定义列 PODNAME 和 PODSTATUS 列出 Nginx Pod
kubectl get po -o=custom-columns="POD_NAME:.metadata.name, POD_STATUS:.status.containerStatuses[].state"
27.列出所有按名称排序的 Pod
kubectl get pods --sort-by=.metadata.name
28.列出所有按创建时间排序的 Pod
kubectl get pods--sort-by=.metadata.creationTimestamp
多容器 Pod
请根据以下概念进行练习:了解多容器 Pod 的设计模式(例:ambassador、adaptor、sidecar)。
29.用“ls; sleep 3600;”“echo Hello World; sleep 3600;”及“echo this is the third container; sleep 3600”三个命令创建一个包含三个 busybox 容器的 Pod,并观察其状态
// first create single container pod with dry run flag
kubectl run busybox --image=busybox --restart=Never --dry-run -o yaml -- bin/sh -c "sleep 3600; ls" > multi-container.yaml
// edit the pod to following yaml and create it
kubectl create -f multi-container.yaml
kubectl get po busybox
30.检查刚创建的每个容器的日志
kubectl logs busybox -c busybox1
kubectl logs busybox -c busybox2
kubectl logs busybox -c busybox3
31.检查第二个容器 busybox2 的先前日志(如果有)
kubectl logs busybox -c busybox2 --previous
32.在上述容器的第三个容器 busybox3 中运行命令 ls
kubectl exec busybox -c busybox3 -- ls
33.显示以上容器的 metrics,将其放入 file.log 中并进行验证
kubectl top pod busybox --containers
// putting them into file
kubectl top pod busybox --containers > file.log
cat file.log
34.用主容器 busybox 创建一个 Pod,并执行“while true; do echo ‘Hi I am from Main container’ >> /var/log/index.html; sleep 5; done”,并带有暴露在端口 80 上的 Nginx 镜像的 sidecar 容器。用 emptyDir Volume 将该卷安装在 /var/log 路径(用于 busybox)和 /usr/share/nginx/html 路径(用于nginx容器)。验证两个容器都在运行
// create an initial yaml file with this
kubectl run multi-cont-pod --image=busbox --restart=Never --dry-run -o yaml > multi-container.yaml
// edit the yml as below and create it
kubectl create -f multi-container.yaml
kubectl get po multi-cont-pod
35.进入两个容器并验证 main.txt 是否存在,并用 curl localhost
从 sidecar 容器中查询 main.txt
// exec into main container
kubectl exec -it multi-cont-pod -c main-container -- sh
cat /var/log/main.txt
// exec into sidecar container
kubectl exec -it multi-cont-pod -c sidecar-container -- sh
cat /usr/share/nginx/html/index.html
// install curl and get default page
kubectl exec -it multi-cont-pod -c sidecar-container -- sh
# apt-get update && apt-get install -y curl
# curl localhost
Pod 设计
请根据以下概念进行练习:了解如何使用 Labels、Selectors 和 Annotations,了解部署以及如何执行滚动更新,了解部署以及如何执行回滚,了解 Jobs 和 CronJobs.
36.获取带有标签信息的 Pod
kubectl get pods --show-labels
37.创建 5 个 Nginx Pod,其中两个标签为 env = prod,另外三个标签为 env = dev
kubectl run nginx-dev1 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-dev2 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-dev3 --image=nginx --restart=Never --labels=env=dev
kubectl run nginx-prod1 --image=nginx --restart=Never --labels=env=prod
kubectl run nginx-prod2 --image=nginx --restart=Never --labels=env=prod
38.确认所有 Pod 都使用正确的标签创建
kubeclt get pods --show-labels
39.获得带有标签 env = dev 的 Pod
kubectl get pods -l env=dev
40.获得带有标签 env = dev 的 Pod,并输出标签
kubectl get pods -l env=dev --show-labels
41.获得带有标签 env = prod 的 Pod
kubectl get pods -l env=prod
42.获得带有标签 env = prod 的 Pod,并输出标签
kubectl get pods -l env=prod --show-labels
43.获取带有标签 env 的 Pod
kubectl get pods -L env
44.获得带有标签 env = dev 和 env = prod 的 Pod
kubectl get pods -l 'env in (dev,prod)'
45.获取带有标签 env = dev 和 env = prod 的 Pod 并输出标签
kubectl get pods -l 'env in (dev,prod)' --show-labels
46.将其中一个容器的标签更改为 env = uat 并列出所有要验证的容器
kubectl label pod/nginx-dev3 env=uat --overwrite
kubectl get pods --show-labels
47.删除刚才创建的 Pod 标签,并确认所有标签均已删除
kubectl label pod nginx-dev{1..3} env-
kubectl label pod nginx-prod{1..2} env-
kubectl get po --show-labels
48.为所有 Pod 添加标签 app = nginx 并验证
kubectl label pod nginx-dev{1..3} app=nginx
kubectl label pod nginx-prod{1..2} app=nginx
kubectl get po --show-labels
49.获取所有带有标签的节点(如果使用 minikube,则只会获得主节点)
kubectl get nodes --show-labels
50.标记节点(如果正在使用,则为 minikube)nodeName = nginxnode
kubectl label node minikube nodeName=nginxnode
51.建一个标签为 nodeName = nginxnode 的 Pod 并将其部署在此节点上
kubectl run nginx --image=nginx --restart=Never --dry-run -o yaml > pod.yaml
// add the nodeSelector like below and create the pod
kubectl create -f pod.yaml
原文地址:medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam