Kubernetes CKA 考试题解析
本指南旨在提供一系列 CKA (Certified Kubernetes Administrator) 考试常见题目的解答和解析,帮助考生理解和掌握 Kubernetes 的核心概念与操作。
1. 列出所有 PersistentVolume (PV) 并按名称排序
使用 kubectl get pv 命令并结合 --sort-by 参数,按 PV 的元数据名称字段进行排序。
kubectl get pv --sort-by=.metadata.name
2. 提取 Pod 日志中的错误信息并保存到文件
通过 kubectl logs 获取指定 Pod 的日志,然后使用 grep 过滤包含 "Error" 的行,并将结果重定向到指定文件。
kubectl logs <pod-name> | grep Error > /opt/error_logs.txt
3. 统计可用节点数量(排除不可调度节点)
获取集群中所有节点的状态,并过滤掉标记为 SchedulingDisabled 或 NotReady 的节点,最后统计剩余节点的数量。
kubectl get nodes --no-headers | awk '$2 != "NotReady" && $2 != "SchedulingDisabled" {print $1}' | wc -l > available_nodes_count.txt
4. 创建指定节点选择器的 Pod
创建一个名为 nginx 的 Pod,并配置 nodeSelector,使其仅调度到带有 disktype: ssd 标签的节点上。
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx-container
image: nginx
nodeSelector:
disktype: ssd
5. 使用 Init Container 创建文件并供主容器检查
定义一个 Pod,其中包含一个 initContainer,该容器负责在共享的 emptyDir 卷中创建一个名为 /opt/app_ready 的文件。主容器会检查该文件是否存在,如果不存在则退出。
apiVersion: v1
kind: Pod
metadata:
name: init-check-pod
spec:
initContainers:
- name: readiness-initializer
image: busybox
command: ['sh', '-c', 'touch /app/ready_file']
volumeMounts:
- name: app-data
mountPath: /app
containers:
- name: main-app
image: busybox
command: ['sh', '-c', 'if [ ! -f /app/ready_file ]; then echo "App not ready!"; exit 1; fi; echo "App is ready!"; sleep 3600']
volumeMounts:
- name: app-data
mountPath: /app
volumes:
- name: app-data
emptyDir: {}
6. 在指定命名空间创建包含多个镜像的 Pod
创建一个名为 multi-image-pod 的 Pod,并配置四个容器,分别使用 nginx, redis, memcached, 和 busybox 镜像。此 Pod 将部署在 test-namespace 命名空间下。
apiVersion: v1
kind: Pod
metadata:
name: multi-image-pod
namespace: test-namespace
spec:
containers:
- name: nginx-container
image: nginx
- name: redis-container
image: redis
- name: memcached-container
image: memcached
- name: busybox-container
image: busybox
7. 创建使用 emptyDir Volume 的 Pod
创建一个名为 cache-pod 的 Pod,挂载一个名为 cache-volume 的 emptyDir 类型 Volume 到 /data 目录,用于存储临时数据。
apiVersion: v1
kind: Pod
metadata:
name: cache-pod
spec:
containers:
- name: app-container
image: nginx
volumeMounts:
- name: cache-volume
mountPath: /data
volumes:
- name: cache-volume
emptyDir: {}
8. 查找 Service 关联 Pod 的 CPU 使用率最高者
首先,通过 kubectl get svc test -o wide 获取 test 服务的 selector。然后,使用 kubectl top pods -l '<selector>' 获取匹配 Pod 的资源使用情况,并找出 CPU 使用率最高的 Pod。
# 假设 service test 的 selector 是 app=my-app, tier=backend
kubectl top pods -l 'app=my-app,tier=backend' --sort-by=cpu
9. 创建 Nginx Deployment 并关联 NodePort Service
首先,使用 kubectl create deployment 命令创建一个名为 nginx-deployment 的 Deployment,使用 nginx 镜像。然后,创建一个名为 nginx-service 的 NodePort 类型 Service,其 selector 指向 Deployment 的 Pod 标签。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
10. 创建 DaemonSet 以在每个节点上运行 Pod
创建一个 DaemonSet,确保 nginx Pod 在集群的每个节点上都至少运行一个副本。注意,此操作不会影响节点原有的 Tolerations 设置。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: nginx-daemonset
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
# 示例:添加一个容忍,以便 DaemonSet Pod 可以调度到 master 节点
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
11. 调整 Deployment 的副本数
将名为 nginx-deployment 的 Deployment 的副本数量从当前值修改为 4。
kubectl scale deployment nginx-deployment --replicas=4
12. Deployment 镜像升级与回滚
首先,创建一个使用 nginx:1.11.0-alpine 镜像的 nginx-deployment Deployment,并启用记录(--record)。接着,将镜像更新为 nginx:1.11.3-alpine。最后,执行回滚操作,将 Deployment 恢复到之前的版本(nginx:1.11.0-alpine)。
# 创建 Deployment
kubectl create deployment nginx-deployment --image=nginx:1.11.0-alpine --record
# 更新镜像
kubectl set image deployment nginx-deployment nginx=nginx:1.11.3-alpine
# 回滚到上一个版本
kubectl rollout undo deployment nginx-deployment
13. 创建 Service 并使用 nslookup 进行 DNS 查询
创建一个名为 nginx-svc 的 NodePort 类型 Service,监听 80 端口。然后,使用一个 busybox Pod 执行 nslookup 命令,分别查询 Service 的 DNS 记录和 Pod 的 DNS 记录,并将结果保存到指定文件。
# 创建 Service
kubectl create service nodeport nginx-svc --tcp=80:80
# 创建 busybox Pod (如果集群中已有则无需重复创建)
kubectl apply -f https://k8s.io/examples/admin/dns/busybox.yaml
# 查询 Service DNS 并保存
kubectl exec -it busybox -- nslookup nginx-svc > service_dns.txt
# 获取 Pod IP (假设 Pod 名为 nginx-pod)
POD_IP=$(kubectl get pod nginx-pod -o jsonpath='{.status.podIP}')
# 查询 Pod DNS 并保存
kubectl exec -it busybox -- nslookup $POD_IP > pod_dns.txt
14. 使用 Secret 传递敏感信息
创建一个名为 my-secret 的 Secret,包含一个 password 字段,其值为 bob(经过 Base64 编码)。然后,创建两个 Pod:pod-env-user,它通过环境变量获取密码;pod-volume-user,它将 Secret 挂载为 Volume 目录 /app-secrets。
# 编码密码
echo -n 'bob' | base64
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
password: Ym9i # base64 encoded 'bob'
---
apiVersion: v1
kind: Pod
metadata:
name: pod-env-user
spec:
containers:
- name: env-container
image: redis
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
---
apiVersion: v1
kind: Pod
metadata:
name: pod-volume-user
spec:
containers:
- name: volume-container
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/app-secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: my-secret
15. 节点维护:标记节点不可调度并驱逐 Pod
将节点 node1 标记为不可调度,并安全地驱逐其上运行的 Pod。使用 --ignore-daemonsets 和 --delete-local-data 参数来处理 DaemonSet 和本地存储的数据。
kubectl drain node1 --ignore-daemonsets --delete-local-data
16. 使用 etcdctl 备份 etcd 集群
使用 etcdctl snapshot save 命令备份 etcd 集群。需要提供 etcd 的端点 (endpoints) 以及 CA 证书、客户端证书和密钥。
ETCDCTL_API=3 etcdctl --endpoints=https://<etcd-endpoint>:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshot.db
17. 集群故障排查:Kubelet 服务问题
当一个节点 node1 失联时,首先检查节点状态。如果节点显示不健康,SSH 登录到该节点,检查 kubelet 进程是否存在以及 kubelet.service 服务的状态。如果服务未运行,尝试启动并启用它。最后,在主节点上验证节点是否已重新加入集群。
# 在主节点上
kubectl get nodes
kubectl describe node node1
# 登录到故障节点 node1
ssh node1
# 检查 kubelet 进程和状态
ps -aux | grep kubelet
systemctl status kubelet.service
# 启动并启用 kubelet 服务
systemctl start kubelet.service
systemctl enable kubelet.service
# 退出节点,返回主节点
exit
# 再次检查节点状态
kubectl get nodes
18. 创建 ReadOnlyMany 模式的 HostPath PersistentVolume
创建一个 PersistentVolume (PV),类型为 hostPath,位于 /mnt/data 路径下,容量为 2Gi,访问模式为 ReadOnlyMany。
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-readonly-hostpath
spec:
capacity:
storage: 2Gi
volumeMode: Filesystem
accessModes:
- ReadOnlyMany
persistentVolumeReclaimPolicy: Retain
storageClassName: manual-readonly
hostPath:
path: "/mnt/data"
19. 将新节点加入集群(TLS Bootstrapping)
将一个新节点添加到 Kubernetes 集群中,并利用 TLS Bootstrapping 机制完成节点的安全加入过程。这通常涉及到在主节点上配置 Controller Manager 以批准节点提交的证书签名请求 (CSR),并在新节点上配置 Kubelet 使用 TLS Bootstrapping。
注意: 此过程涉及复杂的配置,通常需要修改 Controller Manager 的配置和 Kubelet 的启动参数。具体步骤请参考官方文档。