侧边栏壁纸
博主头像
jinn博客博主等级

行动起来,活在当下

  • 累计撰写 14 篇文章
  • 累计创建 5 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录
CKA

CKA证书考试试题2024

jinn
2024-11-13 / 0 评论 / 0 点赞 / 37 阅读 / 18375 字

CKA 考试认证

考试内容

CKA认证针对考核成为当业界的Kubernetes管理员所需的技能。
CKA认证考试包括这些一般领域及其在考试中的权重:

集群架构,安装和配置:25% 工作负载和调度:15% 服务和网络:20% 
存储:10%
故障排除:30% 

详细内容:

集群架构,安装和配置:25%

• 管理基于角色的访问控制(RBAC)
• 使用Kubeadm安装基本集群
• 管理高可用性的Kubernetes集群
• 设置基础架构以部署Kubernetes集群
• 使用Kubeadm在Kubernetes集群上执行版本升级
• 实施etcd备份和还原


工作负载和调度:15%

• 了解部署以及如何执行滚动更新和回滚
• 使用ConfigMaps和Secrets配置应用程序
• 了解如何扩展应用程序
• 了解用于创建健壮的、自修复的应用程序部署的原语
• 了解资源限制如何影响Pod调度
• 了解清单管理和通用模板工具

服务和网络:20%

• 了解集群节点上的主机网络配置
• 理解Pods之间的连通性
• 了解ClusterIP、NodePort、LoadBalancer服务类型和端点
• 了解如何使用入口控制器和入口资源
• 了解如何配置和使用CoreDNS
• 选择适当的容器网络接口插件

存储:10%

• 了解存储类、持久卷
• 了解卷模式、访问模式和卷回收策略
• 理解持久容量声明原语
• 了解如何配置具有持久性存储的应用程序

故障排除:30%

• 评估集群和节点日志
• 了解如何监视应用程序
• 管理容器标准输出和标准错误日志
• 解决应用程序故障
• 对群集组件故障进行故障排除
• 排除网络故障

注意事项

.题目里设计到名称和路径之类,可以直接点击左侧进行复制,然后到粘贴到你的命令行窗口里
.注意:考试环境有多个k8s集群,要切换到要求的环境中进行答题
.kubernetes.io中搜索题目关键字:左边题目上方也会给出一部分关键字,节省搜索时间
.注意验证结果5.kubernetes.io中举例说明,很多可以直接复制到自己yaml中,改几个参数就可以了,节约时间

考试题目

1. 权限控制 RBAC(权重4%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Context
为部署流水线创建一个新的 ClusterRole 并将其绑定到范围为特定的 namespace 的特定 ServiceAccount。
Task
创建一个名为 deployment-clusterrole 且仅允许创建以下资源类型的新 ClusterRole:
Deployment
StatefulSet
DaemonSet
在现有的 namespace app-team1 中创建一个名为 cicd-token 的新 ServiceAccount。
限于 namespace app-team1 中,将新的 ClusterRole deployment-clusterrole 绑定到新的 ServiceAccount cicd-token。

#切换集群#
kubectl config use-context k8s

# 操作步骤 #
# 创建一个名为deployment-clusterrole的clusterrole

 kubectl create clusterrole deployment-clusterrole \
 --verb=create \
 --resource=deployment,statefulset,daemonset 

# 创建一个 ServiceAccount
kubectl create sa cicd-token -n app-team1 

# 创建 rolebinding
 kubectl create rolebinding deployment-binding \
 --clusterrole=deployment-clusterrole \
 --serviceaccount=app-team1:cicd-token -n app-team1
 
# 验证auth create 返回值都为yes
kubectl auth can-i create deployment --as=system:serviceaccount:app-team1:cicd-token -n app-team1
 
kubectl auth can-i create statefulset --as=system:serviceaccount:app-team1:cicd-token -n app-team1
 
kubectl auth can-i create daemonset --as=system:serviceaccount:app-team1:cicd-token -n app-team1

# 验证auth delete 返回值为no
kubectl auth can-i delete deployment --as=system:serviceaccount:app-team1:cicd-token -n app-team1

2. 查看 pod 的 CPU(权重5%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
通过 pod label name=cpu-loader,找到运行时占用大量 CPU 的 pod,
并将占用 CPU 最高的 pod 名称写入文件 /opt/KUTR000401/KUTR00401.txt(已存在)。

#切换集群#
kubectl config use-context k8s

##开始操作##
# 查看 pod 名称 -A 是所有 namespace
kubectl top pod -l name=cpu-loader --sort-by=cpu -A
# 将 cpu 占用最多的 pod 的 name 写入/opt/test1.txt 文件
echo "查出来的 Pod Name" > /opt/KUTR000401/KUTR00401.txt

##检查##
cat /opt/KUTR000401/KUTR00401.txt

3. 配置网络策略 NetworkPolicy(权重7%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context hk8s
Task
在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。
确保新的 NetworkPolicy 允许 namespace echo 中的 Pods 连接到 namespace my-app 中的 Pods 的 9000 端口。
进一步确保新的 NetworkPolicy:
不允许对没有在监听 端口 9000 的 Pods 的访问
不允许非来自 namespace echo 中的 Pods 的访问

网络策略-文档

#切换集群#
kubectl config use-context k8s

##开始操作##
查看所有 ns 的标签 label
kubectl get ns --show-labels
如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用。
kubectl label ns echo project=echo

编写一个 yaml 文件
vim networkpolicy.yaml
#注意 :set paste,防止 yaml 文件空格错序。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace
  namespace: my-app
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
  - Ingress
  ingress:
  - fro:
    - namespaceSelector:
        matchLabels:
          project: echo
    - podSelector:
        matchLabels: {}
    ports:
    - protocol: TCP
      port: 9000
创建
kubectl apply -f networkpolicy.yaml

##检查##
kubectl describe networkpolicy -n my-app

4. 暴露服务 service(权重7%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
请重新配置现有的 deployment front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端口 80/tcp。
创建一个名为 front-end-svc 的新 service,以公开容器端口 http。
配置此 service,以通过各个 Pod 所在的节点上的 NodePort 来公开他们。

#切换集群#
kubectl config use-context k8s

##开始操作##
检查 deployment 信息,并记录 SELECTOR 的 Lable 标签,这里是 app=front-end
kubectl get deployment front-end -o wide
参考官方文档,按照需要 edit deployment,添加端口信息
kubectl edit deployment front-end
#注意 :set paste,防止 yaml 文件空格错序。
 spec:
 containers:
 - image: vicuu/nginx:hello
 imagePullPolicy: IfNotPresent
 name: nginx #找到此位置。下文会简单说明一下 yaml 文件的格式,不懂 yaml 格式的,往下看。
 ports: #添加这 4 行
 - name: http
 containerPort: 80
 protocol: TCP
 
#暴露对应端口
kubectl expose deployment front-end --type=NodePort --port=80 --target-port=80 --name=front-end-svc
#注意考试中需要创建的是 NodePort,还是 ClusterIP。如果是 ClusterIP,则应为--type=ClusterIP
#--port 是 service 的端口号,--target-port 是 deployment 里 pod 的容器的端口号。
暴露服务后,检查一下 service 的 selector 标签是否正确,这个要与 deployment 的 selector 标签一致的。

#检查
kubectl get svc front-end-svc -o wide
kubectl get deployment front-end -o wide
如果你 kubectl expose 暴露服务后,发现 service 的 selector 标签是空的<none>,或者不是 deployment 的标签
则需要编辑此 service,手动添加标签。(模拟环境里暴露服务后,selector 标签是正确的。但是考试时,有时 service 的 selector 标签是 none)

kubectl edit svc front-end-svc
在 ports 这一小段下面添加 selector 标签
 selector:
 app: front-end #注意 yaml 里是写冒号,而不是等号,不是 app=front-end。

kubectl create deploy -h
生成--port的deploy: kubectl create deployment test --image=busybox --port=5701
-o yaml查看ports相关字段进行修改题目的deploy
kubectl expose deploy -h

5. 创建 Ingress(权重7%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
如下创建一个新的 nginx Ingress 资源:
名称: ping
Namespace: ing-internal
使用服务端口 5678 在路径 /hello 上公开服务 hello
可以使用以下命令检查服务 hello 的可用性,该命令应返回 hello:
curl -kL <INTERNAL_IP>/hello
Ingress-文档

vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ping
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /hello
        pathType: Prefix
        backend:
          service:
            name: hello
            port:
              number: 5678
              
创建
kubectl apply -f ingress.yaml

#检查
kubectl get ingress -n ing-internal
curl ingress 的 ip 地址/hello

6. 扩容 deployment 副本数量(权重4%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
将 deployment presentation 扩展至 4 个 pods

#切换集群#
kubectl config use-context k8s

##开始操作##
kubectl scale deployment presentation --replicas=4

##检查##
kubectl get deployments presentation -o wide

7. 调度 pod 到指定节点(权重4%)

[candidate@node-1] $ kubectl config use-context k8s
Task
按如下要求调度一个 pod:
名称:nginx-kusc00401
Image:nginx
Node selector:disk=ssd

pod调度指定节点-文档

#切换集群#
kubectl config use-context k8s

##开始操作##
# 确保 node 有这个 labels,考试时,检查一下就行,应该已经提前设置好了 labels。
kubectl get nodes --show-labels|grep 'disk=ssd'

如果没有设置,则使用 kubectl label nodes node01 disk=ssd 命令来手动自己设置。
拷贝官文案例,修改下 pod 名称和镜像,删除多余的部分即可
vim pod-disk-ssd.yaml
#注意 :set paste,防止 yaml 文件空格错序。
apiVersion: v1
kind: Pod
metadata:
 name: nginx-kusc00401
spec:
 containers:
 - name: nginx
 image: nginx
 imagePullPolicy: IfNotPresent #这句的意思是,如果此 image 已经有了,则不重新下载。考试时写不写这个都是可以的。
 nodeSelector:
 disk: ssd
创建
kubectl apply -f pod-disk-ssd.yaml

##检查##
kubectl get pod nginx-kusc00401 -o wide

8. 查看可用节点数量(权重4%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
检查有多少 nodes 已准备就绪(不包括被打上 Taint:NoSchedule 的节点),
并将数量写入 /opt/KUSC00402/kusc00402.txt

#切换集群#
kubectl config use-context k8s

##开始操作##
# grep 的-i 是忽略大小写,grep -v 是排除在外,grep -c 是统计查出来的条数。
kubectl describe nodes | grep -i Taints | grep -vc NoSchedule
echo "查出来的数字" > /opt/KUSC00402/kusc00402.txt

9. 创建多容器的 pod(权重4%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
按如下要求调度一个 Pod:
名称:kucc8
app containers: 2
container 名称/images:

  • nginx
  • consu

pod-文档

vim pod-kucc.yaml
#注意 :set paste,防止 yaml 文件空格错序。
apiVersion: v1
kind: Pod
metadata:
  name: kucc8
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  - name: consul
    image: consul
    imagePullPolicy: IfNotPresent

kubectl apply -f pod-kucc.yaml
检查
kubectl get pod kucc8

10. 创建 PV(权重4%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context hk8s
Task
创建名为 app-config 的 persistent volume,容量为 1Gi,访问模式为 ReadWriteMany。
volume 类型为 hostPath,位于 /srv/app-config

pv-文档

#切换集群#
kubectl config use-context k8s

##开始操作##
vim pv.yaml
#注意 :set paste,防止 yaml 文件空格错序。
apiVersion: v1
kind: PersistentVolume
metadata:
  name:  app-config
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/srv/app-config"
创建
kubectl apply -f pv.yaml

11. 创建 PVC(权重7%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context ok8s
Task
创建一个新的 PersistentVolumeClaim:
名称: pv-volume
Class: csi-hostpath-sc
容量: 10Mi
创建一个新的 Pod,来将 PersistentVolumeClaim 作为 volume 进行挂载:
名称:web-server
Image:nginx:1.16
挂载路径:/usr/share/nginx/html
配置新的 Pod,以对 volume 具有 ReadWriteOnce 权限。
最后,使用 kubectl edit 或 kubectl patch 将 PersistentVolumeClaim 的容量扩展为 70Mi,并记录此更改。

#切换集群#
kubectl config use-context k8s

##开始操作##
vim pvc.yaml
#注意 :set paste,防止 yaml 文件空格错序。
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: pv-volume #pvc 名字
spec:
 storageClassName: csi-hostpath-sc
 accessModes:
 - ReadWriteOnce # 注意,考试时的访问模式可能有 ReadWriteMany 和 ReadOnlyMany 和 ReadWriteOnce,根据题目要求写。
 resources:
 requests:
 storage: 10Mi
创建 PVC
kubectl apply -f pvc.yaml

vim pvc-pod.yaml
#注意 :set paste,防止 yaml 文件空格错序。
apiVersion: v1
kind: Pod
metadata:
 name: web-server
spec:
 volumes:
 - name: task-pv-storage #绿色的两个 name 要一样。
 persistentVolumeClaim:
 claimName: pv-volume #这个要使用上面创建的 pvc 名字
 containers:
 - name: nginx
 image: nginx:1.16
 volumeMounts:
 - mountPath: "/usr/share/nginx/html"
 name: task-pv-storage #绿色的两个 name 要一样。

#创建
kubectl apply -f pvc-pod.yaml
#检查
kubectl get pod web-server

12. 查看 pod 日志(权重5%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Task
监控 pod foo 的日志并:
提取与错误 RLIMIT_NOFILE 相对应的日志行
将这些日志行写入 /opt/KUTR00101/foo

#切换集群#
kubectl config use-context k8s

##开始操作##
kubectl logs foo | grep "RLIMIT_NOFILE" > /opt/KUTR00101/foo

检查
cat /opt/KUTR00101/foo

13. 使用 sidecar 代理容器日志(权重7%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context k8s
Context
将一个现有的 Pod 集成到 Kubernetes 的内置日志记录体系结构中(例如 kubectl logs)。
添加 streaming sidecar 容器是实现此要求的一种好方法。
Task
使用 busybox Image 来将名为 sidecar 的 sidecar 容器添加到现有的 Pod 11-factor-app 中。
新的 sidecar 容器必须运行以下命令:
/bin/sh -c tail -n+1 -f /var/log/11-factor-app.log
使用挂载在/var/log 的 Volume,使日志文件 11-factor-app.log 可用于 sidecar 容器。
除了添加所需要的 volume mount 以外,请勿更改现有容器的规格。

# 1.切换环境
kubectl config use-context k8s

# 2.编写yaml
[root@master2 sidecar]# cat side.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: 11-factor-app
spec:
  containers:
  - name: count
    image: docker.io/library/busybox:latest
    imagePullPolicy: IfNotPresent
    args:
    - /bin/sh
    - -c
    - >
      i=0;
      while true;
      do
        echo "$i: $(date)" >> /var/log/11-factor-app.log;
        i=$((i+1));
        sleep 1;
      done
    volumeMounts:
    - name: varlog
      mountPath: /var/log
  - name: sidecar
    image: docker.io/library/busybox:latest
    imagePullPolicy: IfNotPresent
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/11-factor-app.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log

  volumes:
    - name: varlog
      emptyDir: {}

# 3.运行检测
删除之前的pod 
kubectl delete pod 11-factor-app
[root@master2 sidecar]# kubectl apply -f side.yaml 
pod/11-factor-app created

# 查看日志
kubectl logs 11-factor-app -c sidecarash

14. 升级集群(权重7%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context mk8s
Task
现有的 Kubernetes 集群正在运行版本 1.28.0。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.28.1。
确保在升级之前 drain master 节点,并在升级后 uncordon master 节点。
可以使用以下命令,通过 ssh 连接到 master 节点:
ssh master01
可以使用以下命令,在该 master 节点上获取更高权限:
sudo -i
另外,在主节点上升级 kubelet 和 kubectl。
请不要升级工作节点,etcd,container 管理器,CNI 插件, DNS 服务或任何其他插件。

集群升级-文档

#切换集群#
kubectl config use-context k8s

kubectl get nodes
#打污点,强制驱逐node节点的pod
kubectl cordon master01
kubectl drain master01  --ignore-daemonsets=false
ssh master01
sudo -i
apt-get update
apt-cache show kubeadm|grep 1.28.1
apt-get install kubeadm=1.28.1-00
#检查
kubeadm version
# 验证升级计划,会显示很多可升级的版本,我们关注题目要求升级到的那个版本。
kubeadm upgrade plan
# 排除 etcd,升级其他的,提示时,输入 y。大约要等 5 分钟。
kubeadm upgrade apply v1.28.1 --etcd-upgrade=false

升级 kubelet
apt-get install kubelet=1.28.1-00
systemctl restart kubelet
kubelet --version

恢复 master01 调度
kubectl uncordon master01
kubectl get nodes

15. 备份还原 etcd(权重7%)

设置配置环境
此项目无需更改配置环境。但是,在执行此项目之前,请确保您已返回初始节点。
[candidate@master01] $ exit #注意,这个之前是在 master01 上,所以要 exit 退到 node01,如果已经是 node01 了,就不要再 exit 了。
Task
首先,为运行在 https://11.0.1.111:2379 上的现有 etcd 实例创建快照并将快照保存到 /var/lib/backup/etcd-snapshot.db
(注意,真实考试中,这里写的是 https://127.0.0.1:2379)
为给定实例创建快照预计能在几秒钟内完成。 如果该操作似乎挂起,则命令可能有问题。用 CTRL + C 来取消操作,然后重试。
然后还原位于/data/backup/etcd-snapshot-previous.db 的现有先前快照。
提供了以下 TLS 证书和密钥,以通过 etcdctl 连接到服务器。
CA 证书: /opt/KUIN00601/ca.crt
客户端证书: /opt/KUIN00601/etcd-client.crt
客户端密钥: /opt/KUIN00601/etcd-client.key

etcd备份还原-文档

#切换集群#
kubectl config use-context k8s

备份:
# 如果不使用 export ETCDCTL_API=3,而使用 ETCDCTL_API=3,则下面每条 etcdctl 命令前都要加 ETCDCTL_API=3。
# 如果执行时,提示 permission denied,则是权限不够,命令最前面加 sudo 即可。
export ETCDCTL_API=3
etcdctl --endpoints=https://127.0.0.1:2379 --cacert="/opt/KUIN00601/ca.crt" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" 
snapshot save /var/lib/backup/etcd-snapshot.db

检查
etcdctl snapshot status /var/lib/backup/etcd-snapshot.db -wtable

1、先检查一下考试环境,使用的 etcd 是服务还是容器。
kubectl get pod -A
sudo systemctl status etcd
如果是 systemd 服务,则继续往下操作。

2、确认 etcd 数据目录(--data-dir 值)
ps -ef |grep etcd
一般默认为/var/lib/etcd

3、停止 etcd 服务
sudo systemctl stop etcd

4、先移动备份 etcd 原目录
sudo mv /var/lib/etcd /var/lib/etcd.bak

5、开始还原(还原时,可以不加证书和秘钥)
sudo ETCDCTL_API=3 etcdctl --data-dir=/var/lib/etcd snapshot restore /data/backup/etcd-snapshot-previous.db

6、更改文件属主
sudo chown -R etcd:etcd /var/lib/etcd

7、启动 etcd 服务
sudo systemctl start etcd

16. 排查集群中故障节点 (权重13%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context wk8s
Task
名为 node02 的 Kubernetes worker node 处于 NotReady 状态。
调查发生这种情况的原因,并采取相应的措施将 node 恢复为 Ready 状态,确保所做的任何更改永久生效。可以使用以下命令,通过 ssh 连接到 node02 节点:
ssh node02
可以使用以下命令,在该节点上获取更高权限:
sudo -i

#切换集群#
kubectl config use-context k8s
#
ssh node2
sudo -i 
systemctl status kubelet
systemctl enable kubelet
systemctl start kubelet

#检查
kubectl get nodes

17. 节点维护(权重4%)

设置配置环境:
[candidate@node-1] $ kubectl config use-context ek8s
Task
将名为 node02 的 node 设置为不可用,并重新调度该 node 上所有运行的 pods。

#切换集群#
kubectl config use-context k8s
kubectl crodon node02
kubectl drain node02 --ignore-daemonsets
# 注意,还有一个参数--delete-emptydir-data --force,这个考试时不用加,就可以正常 draini node02 的。
# 但如果执行后,有跟测试环境一样的报错,则需要加上--delete-emptydir-data --force,会强制将 pod 移除。
# kubectl drain node02 --ignore-daemonsets --delete-emptydir-data --force
0

评论区