当前位置:首页 > 技术 > 正文内容

Kubernetes CKA 考试题解析

访客 技术 2026年10月11日 1

本指南旨在提供一系列 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 的启动参数。具体步骤请参考官方文档。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。