目录
10、考核知识:检查可用节点数量
题目内容
题目内容中文解释
做题解答
11、考核知识:一个 Pod 封装多个容器
题目内容
题目内容中文解释
官方文档搜索关键字:pod
编辑做题解答
12、考核知识:持久卷 PersistentVolume
题目内容
题目内容中文解释
官方文档搜索关键字:pv
做题解答
13、考核知识:PersistentVolumeClaims
题目内容
题目内容中文解释
官方文档搜索关键字:pvc
做题解答
14、考核知识:查看 Pod 日志
题目内容
题目内容中文解释
官方文档搜索关键字:kubectl logs
做题解答
15、考核知识:Sidecar 代理
题目内容
题目内容中文解释
官方文档搜索关键字:logging
做题解答
16、考核知识:查看 Pod 的 cpu
题目内容
题目内容中文解释
官方文档搜索关键字:kubectl top pod
做题解答
17、考核知识:集群故障排查 - kubectl 故障
题目内容
题目内容中文解释
做题解答
提示:
- 在模拟环境中练习时最好是每做一道题就打一个快照,做完之后再恢复!(一共 17 道题)
- 考试环境的系统是 Ubuntu
- 文件资料下载:https://download.csdn.net/download/weixin_46560589/87364476
10、考核知识:检查可用节点数量
题目内容
题目内容中文解释
切换 k8s 集群环境:kubectl config use-context k8s
Task
检查集群中有多少节点为 Ready 状态(不包括被打上 Taint: NoSchedule 的节点),之后将数量写到 /opt/KUSCO0402/kusc00402.txt。
做题解答
# 考试时执行,切换集群。模拟环境中不需要执行
[student@node-1] $ kubectl config use-context k8s
# 模拟环境中创建题目指定的目录,考试时不需要,已存在
root@cka-master1:~# mkdir -pv /opt/KUSCO0402
# 开始解题:
# 查看集群中状态为 Ready 的节点
root@cka-master1:~# kubectl get nodes | grep -w "Ready"
cka-master1 Ready control-plane,master 26h v1.23.1
cka-node1 Ready <none> 26h v1.23.1
# 统计 Ready 数量
root@cka-master1:~# kubectl get nodes | grep -w "Ready" | wc -l
2
# 统计具有污点 NoSchedule 的数量
root@cka-master1:~# kubectl describe nodes cka-master1 cka-node1 | grep "Taint" | grep "NoSchedule" | wc -l
1
# 把结果(2-1=1)写入题目中指定的文件
root@cka-master1:~# echo "1" > /opt/KUSCO0402/kusc00402.txt
root@cka-master1:~# cat /opt/KUSCO0402/kusc00402.txt
1
11、考核知识:一个 Pod 封装多个容器
题目内容
题目内容中文解释
切换 k8s 集群环境:kubectl config use-context k8s
Task
创建一个 Pod,名字为 kucc1,这个 Pod 包含 4 个容器,为 nginx、redis、memcached、consul。
官方文档搜索关键字:pod
使用 Pod:Pod | Kubernetes
做题解答
# 考试时执行,切换集群。模拟环境中不需要执行
[student@node-1] $ kubectl config use-context k8s
# 编写 yaml 文件
root@cka-master1:~# vim kucc1.yaml
apiVersion: v1
kind: Pod
metadata:
name: kucc1
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
- name: redis
image: redis
imagePullPolicy: IfNotPresent
- name: memcached
image: memcached
imagePullPolicy: IfNotPresent
- name: consul
image: consul
imagePullPolicy: IfNotPresent
root@cka-master1:~# kubectl apply -f kucc1.yaml
root@cka-master1:~# kubectl get pods kucc1
NAME READY STATUS RESTARTS AGE
kucc1 4/4 Running 0 3s
12、考核知识:持久卷 PersistentVolume
题目内容
题目内容中文解释
切换 k8s 集群环境:kubectl config use-context hk8s
Task
创建一个 pv,名字为 app-config,大小为 2Gi, 访问权限为 ReadWriteMany。Volume 的类型为 hostPath,路径为 /srv/app-config。
官方文档搜索关键字:pv
创建 PersistentVolume:配置 Pod 以使用 PersistentVolume 作为存储 | Kubernetes
做题解答
# 考试时执行,切换集群。模拟环境中不需要执行
[student@node-1] $ kubectl config use-context hk8s
# 创建题目中的目录,考试是不需要,已存在
root@cka-master1:~# mkdir -pv /srv/app-config
# 开始解题:
# 创建 pv
root@cka-master1:~# vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config # 题目中指定的 pv 名称
spec:
capacity:
storage: 2Gi # 题目指定的 pv 大小
accessModes:
- ReadWriteMany # 题目指定的访问模式
hostPath:
path: "/srv/app-config" # 题目指定的 url
root@cka-master1:~# kubectl apply -f pv.yaml
persistentvolume/app-config created
root@cka-master1:~# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
app-config 2Gi RWX Retain Available 6s
13、考核知识:PersistentVolumeClaims
题目内容
题目内容中文解释
切换 k8s 集群环境:kubectl config use-context ok8s
Task
创建一个名字为 pv-volume 的 pvc,指定 storageClass 为 csi-hostpath-sc,大小为 10Mi。然后创建一个 Pod,名字为 web-server,镜像为 nginx,并且挂载该 PVC 至 /usr/share/nginx/html,挂载的权限为 RedWriteOnce。之后通过 kubectl edit 或者 kubectl path 将 pvc 改成 70Mi,并且记录修改记录。
官方文档搜索关键字:pvc
创建 PersistentVolumeClaim:配置 Pod 以使用 PersistentVolume 作为存储 | Kubernetes
做题解答
# 考试时执行,切换集群。模拟环境中不需要执行
[student@node-1] $ kubectl config use-context ok8s
# 创建 pvc 和 pod
root@cka-master1:~# vim pvc-pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume # 题目指定的 pvc 名称
spec:
storageClassName: csi-hostpath-sc # 题目指定的存储类名称
accessModes:
- ReadWriteOnce # 题目指定的访问模式
resources:
requests:
storage: 10Mi # 题目指定的 pvc 大小
---
apiVersion: v1
kind: Pod
metadata:
name: web-server # 题目指定的 pod 名称
spec:
volumes:
- name: pv-volume
persistentVolumeClaim:
claimName: pv-volume # 使用的 pvc 名称
containers:
- name: nginx
image: nginx # 题目指定的镜像
volumeMounts:
- mountPath: "/usr/share/nginx/html" # 题目指定的挂载目录
name: pv-volume # 使用的 pvc 名称
root@cka-master1:~# kubectl apply -f pvc-pod.yaml
# 查看是否创建成功。之所以是 pending 状态是模拟环境中没有存储类 storageClassName: csi-hostpath-sc,考试环境中存在,无需担心
root@cka-master1:~# kubectl get pvc pv-volume
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pv-volume Pending csi-hostpath-sc 21s
root@cka-master1:~# kubectl get pods web-server
NAME READY STATUS RESTARTS AGE
web-server 0/1 Pending 0 31s
# pvc 扩容并记录。将 storage: 10Mi 修改为 70Mi
root@cka-master1:~# kubectl edit pvc pv-volume --record
······
resources:
requests:
storage: 70Mi
storageClassName: csi-hostpath-sc
······
14、考核知识:查看 Pod 日志
题目内容
题目内容中文解释
切换 k8s 集群环境:kubectl config use-context k8s
Task
监控名为 foobar 的 Pod 的日志,并过滤出具有 unable-access-website 信息的行,然后将写入到 /opt/KUTR00101/foobar。
官方文档搜索关键字:kubectl logs
示例:常用操作:命令行工具 (kubectl) | Kubernetes
做题解答
# 考试时执行,切换集群。模拟环境中不需要执行
[student@node-1] $ kubectl config use-context k8s
[student@node-1] $ kubectl logs foobar | grep unable-access-website > /opt/KUTR00101/foobar
15、考核知识:Sidecar 代理
题目内容
题目内容中文解释
Context
将一个现有的 Pod 集成到 Kubernetes 的内置日志记录体系结构中 (例如 kubectl logs)。添加 streaming sidecar 容器是实现此要求的一种好方法。
Task
使用 busybox lmage 来将名为 sidecar 的 sidecar 容器添加到现有的 Pod legacy-app 上,新的 sidecar 容器必须运行以下命令:
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log
使用 volume 挂载 /var/log/ 目录,确保 sidecar 能访问 /var/log/legacy-app.log 文件。
官方文档搜索关键字:logging
使用边车容器运行日志代理:日志架构 | Kubernetes
做题解答
# 考试时执行,切换集群。模拟环境中不需要执行
[student@node-1] $ kubectl config use-context k8s
# 在模拟环境中创建题目中提到的 pod legacy-app,考试不需要,已存在
root@cka-master1:~# vim legacy-app.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$(date) INFO $i" >> /var/log/legacy-app.log;
i=$((i+1));
sleep 1;
done
root@cka-master1:~# kubectl apply -f legacy-app.yaml
root@cka-master1:~# kubectl get pods legacy-app
NAME READY STATUS RESTARTS AGE
legacy-app 1/1 Running 0 17s
# 开始解题:
# 首先将题目中现有的 pod legacy-app 的 yaml 导出
root@cka-master1:~# kubectl get pods legacy-app -o yaml > sidecar.yaml
# 删除一些导出的内容,结果如下
root@cka-master1:~# vim sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
namespace: default
spec:
containers:
- args:
- /bin/sh
- -c
- "i=0; while true; do\n echo \"$(date) INFO $i\" >> /var/log/legacy-app.log;\n
\ i=$((i+1));\n sleep 1;\ndone \n"
image: busybox
imagePullPolicy: Always
name: count
# 在 sidecar.yaml 中添加 sidecar 容器和 volume
root@cka-master1:~# vim sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
namespace: default
spec:
containers:
- args:
- /bin/sh
- -c
- "i=0; while true; do\n echo \"$(date) INFO $i\" >> /var/log/legacy-app.log;\n
\ i=$((i+1));\n sleep 1;\ndone \n"
image: busybox
imagePullPolicy: IfNotPresent
name: count
volumeMounts:
- name: logs
mountPath: /var/log
- name: sidecar
image: busybox
imagePullPolicy: IfNotPresent
args: [/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-app.log']
volumeMounts:
- name: logs
mountPath: /var/log
volumes:
- name: logs
emptyDir: {}
# 先删除原有的 pod 才能更新
root@cka-master1:~# kubectl delete -f sidecar.yaml
# 如果删除很慢的话,就强制删除
root@cka-master1:~# kubectl delete -f sidecar.yaml --force --grace-period=0
root@cka-master1:~# kubectl apply -f sidecar.yaml
pod/legacy-app created
root@cka-master1:~# kubectl get pods legacy-app
NAME READY STATUS RESTARTS AGE
legacy-app 2/2 Running 0 3s
# 查看 sidecar 容器日志
root@cka-master1:~# kubectl logs legacy-app -c sidecar
16、考核知识:查看 Pod 的 cpu
题目内容
题目内容中文解释
切换 k8s 集群环境:kubectl config use-context k8s
Task
找出标签是 name=cpu-user 的 Pod,并过滤出使用 CPU 最高的 Pod,然后把它的名字写在已经存在的 /opt/KUTR00401/KUTR00401.txt 文件里(注意他没有说指定 namespace,所以需要使用 -A 指定所有 namespace)。
官方文档搜索关键字:kubectl top pod
指定内存请求和限制:为容器和 Pod 分配内存资源 | Kubernetes
显示资源(CPU、内存、存储)的使用情况:
做题解答
# 考试时执行,切换集群。模拟环境中不需要执行
[student@node-1] $ kubectl config use-context k8s
# 将 addon.tar.gz、metrics-server-amd64-0-3-6.tar.gz 上传到 node 并解压
root@cka-node1:~# docker load -i addon.tar.gz
root@cka-node1:~# docker load -i metrics-server-amd64-0-3-6.tar.gz
# 将 metrics.yaml 上传到 master 并创建
root@cka-master1:~# kubectl apply -f metrics.yaml
# 给 pod 打上标签
root@cka-master1:~# kubectl label pods -n kube-system metrics-server-875fcb674-snp99 name=cpu-user
# 创建题目给的目录
root@cka-master1:~# mkdir -pv /opt/KUTR00401
# 以上步骤在模拟环境中创建,模拟题目给出的环境,考试时不需要,已存在
# 开始解题:
# 查看标签为 name=cpu-user 并且是 cpu 使用最高的 pod
root@cka-master1:~# kubectl top pods -l name=cpu-user --sort-by=cpu -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system metrics-server-875fcb674-snp99 2m 17Mi
# 将查到的 pod 名字写入 /opt/KUTR00401/KUTR00401.txt 文件中
root@cka-master1:~# echo "metrics-server-875fcb674-snp99" > /opt/KUTR00401/KUTR00401.txt
root@cka-master1:~# cat /opt/KUTR00401/KUTR00401.txt
metrics-server-875fcb674-snp99
17、考核知识:集群故障排查 - kubectl 故障
题目内容
题目内容中文解释
切换 k8s 集群环境:kubectl config use-context wk8s
Task
一个名为 wk8s-node-0 的节点状态为 NotReady,让其他恢复至正常状态,并确认所有的更改开机自动完成。
可以使用以下命令,通过 ssh 连接到 wk8s-node-0 节点:ssh wk8s-node-0
可以使用以下命令,在该节点上获取更高权限:sudo -i
做题解答
# 考试时执行,切换集群。模拟环境中不需要执行
[student@node-1] $ kubectl config use-context wk8s
# 开始解题:
[student@node-1] $ ssh wk8s-node-0
[student@node-1] $ sudo -i
[root@wk8s-node-0 ~]# systemctl status kubelet
[root@wk8s-node-0 ~]# systemctl enable kubelet --now
[root@wk8s-node-0 ~]# systemctl status kubelet
# 退出 root,退回到 student@wk8s-node-0
[root@wk8s-node-0 ~]# exit
# 退出 wk8s-node-0,退回到 student@node-1
[student@wk8s-node-0 ~]# exit
# 不要输入 exit 太多,否则会退出考试环境
上一篇文章:K8s 认证工程师 CKA 考题分析和题库练习(上)_Stars.Sky的博客-CSDN博客