1、权限控制 RBAC

1.1 题目详情

设置配置环境:

[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


1.2 参考链接

1.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

创建 ClusterRole(集群角色):

candidate@node01:~$ kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
clusterrole.rbac.authorization.k8s.io/deployment-clusterrole created
candidate@node01:~$
  • 1.
  • 2.
  • 3.

创建 ServiceAccount(服务账号):

candidate@node01:~$ kubectl -n app-team1 create serviceaccount cicd-token
serviceaccount/cicd-token created
candidate@node01:~$
  • 1.
  • 2.
  • 3.

创建 RoleBinding(角色绑定):


candidate@node01:~$ kubectl -n app-team1 create rolebinding cicd-token-rolebinding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
rolebinding.rbac.authorization.k8s.io/cicd-token-rolebinding created
candidate@node01:~$

# rolebinding 后面的名字 cicd-token-rolebinding 随便起的,因为题目中没有要求,如果题目中有要求,根据题目要求写。
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ kubectl describe rolebinding cicd-token-rolebinding -n app-team1
Name:         cicd-token-rolebinding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  deployment-clusterrole
Subjects:
  Kind            Name        Namespace
  ----            ----        ---------
  ServiceAccount  cicd-token  app-team1
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.

K8S认证 2024年CKA考题汇总(解析+答案)_ci

2、扩容 deployment 副本数量

2.1 题目详情

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

将 deployment presentation 扩展至 4 个 pods


2.2 参考链接

2.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

检查现有 deployment 的 pod 数量:

candidate@node01:~$ kubectl get deployment presentation
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
presentation   1/1     1            1           167d
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.

将 deployment presentation 扩展至 4 个 pods:

candidate@node01:~$ kubectl scale deployment presentation --replicas=4
deployment.apps/presentation scaled
candidate@node01:~$
  • 1.
  • 2.
  • 3.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ kubectl get deployment presentation
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
presentation   4/4     4            4           167d
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.

K8S认证 2024年CKA考题汇总(解析+答案)_nginx_02

3、配置网络策略 NetworkPolicy

3.1 题目详情

设置配置环境:

[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 的访问


3.2 参考链接

 https://kubernetes.io/docs/concepts/services-networking/network-policies/

3.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

查看所有 ns 的标签 label:

candidate@node01:~$ kubectl get ns echo --show-labels
NAME   STATUS   AGE    LABELS
candidate@node01:~$
  • 1.
  • 2.
  • 3.

打标签 echo :

candidate@node01:~$ kubectl label ns echo project=echo
namespace/echo labeled
candidate@node01:~$

# 再次进行查看标签
candidate@node01:~$ kubectl get ns echo --show-labels
NAME   STATUS   AGE    LABELS
echo   Active   167d   kubernetes.io/metadata.name=echo,project=echo
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

手动编写一个 yaml 文件(名字任意):

candidate@node01:~$ touch networkpolicy.yaml
  • 1.

查看参考链接并复制内容:

K8S认证 2024年CKA考题汇总(解析+答案)_nginx_03

将文档内容进行修改:

candidate@node01:~$ cat networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace  # 根据题目要求填写
  namespace: my-app   # 根据题目要求填写
spec:
  podSelector: {}   # 应用在 my-app 命名空间中的所有 Pod
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: echo   # 访问者的命名空间的标签 labelecho 访问 my-appports:
    - protocol: TCP
      port: 9000   # 被访问者公开的端口

candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

K8S认证 2024年CKA考题汇总(解析+答案)_ci_04

创建:

candidate@node01:~$ kubectl apply -f networkpolicy.yaml
networkpolicy.networking.k8s.io/allow-port-from-namespace created
candidate@node01:~$
  • 1.
  • 2.
  • 3.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ kubectl describe networkpolicy -n my-app
Name:         allow-port-from-namespace
Namespace:    my-app
Created on:   2024-08-01 16:16:07 +0800 CST
Labels:       <none>
Annotations:  <none>
Spec:
  PodSelector:     <none> (Allowing the specific traffic to all pods in this namespace)
  Allowing ingress traffic:
    To Port: 9000/TCP
    From:
      NamespaceSelector: project=echo
  Not affecting egress traffic
  Policy Types: Ingress
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

K8S认证 2024年CKA考题汇总(解析+答案)_nginx_05

4、暴露服务 service

4.1 题目详情

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

请重新配置现有的 deployment front-end 以及添加名为 http 的端口规范来公开现有容器 nginx 的端口 80/tcp

创建一个名为 front-end-svc 的新 service,以公开容器端口 http

配置此 service,以通过各个 Pod 所在的节点上的 NodePort 来公开他们。


4.2 参考链接

 https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

4.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

检查 deployment 信息,并记录 SELECTOR 的 Lable 标签,这里是 app=front-end:

candidate@node01:~$ kubectl get deployment front-end -o wide
NAME        READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES              SELECTOR
front-end   1/1     1            1           167d   nginx        vicuu/nginx:hello   app=front-end
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.

K8S认证 2024年CKA考题汇总(解析+答案)_配置环境_06

添加端口信息:(官方文档只给出两行需要自己在手动添加两行)

candidate@node01:~$ kubectl edit deployment front-end
                                                      
# 官方给出
ports:
        - containerPort: 80
# 修改为
ports:
        - name: http
          containerPort: 80
          protocol: TCP
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

K8S认证 2024年CKA考题汇总(解析+答案)_ci_07

K8S认证 2024年CKA考题汇总(解析+答案)_ci_08

暴露对应端口:

candidate@node01:~$ kubectl expose deployment front-end --type=NodePort --port=80 --target-port=80 --name=front-end-svc
service/front-end-svc exposed
candidate@node01:~$
  • 1.
  • 2.
  • 3.

curl 检查(考试时,所有的检查项,都可以不做):

candidate@node01:~$ kubectl get svc -o wide
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE    SELECTOR
front-end-svc   NodePort    10.109.15.45   <none>        80:30757/TCP   36s    app=front-end
kubernetes      ClusterIP   10.96.0.1      <none>        443/TCP        167d   <none>
candidate@node01:~$
candidate@node01:~$ curl 10.109.15.45
Hello World ^_^
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.

K8S认证 2024年CKA考题汇总(解析+答案)_配置环境_09

5、创建 Ingress

5.1 题目详情

设置配置环境:


[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


5.2 参考链接

 https://kubernetes.io/docs/concepts/services-networking/ingress/

5.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

检查环境里 ingressclass 的名字:

candidate@node01:~$ kubectl get ingressclass
NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       167d
candidate@node01:~$

# 看到 ingressclass 的名字叫 nginx,下面创建 ingress 需要使用。
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

创建编写 ingress 的 yaml:

candidate@node01:~$ touch ingress.yaml
candidate@node01:~$ cat ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ping   # 根据题目要求填写
  namespace: ing-internal   # 根据题目要求填写
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx   # 上面查出来的 ingressclass 的名字
  rules:
  - http:
      paths:
      - path: /hello   # 根据题目要求填写
        pathType: Prefix
        backend:
          service:
            name: hello   # 根据题目要求填写
            port:
              number: 5678   # 根据题目要求填写

candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

K8S认证 2024年CKA考题汇总(解析+答案)_配置环境_10

创建:

candidate@node01:~$ kubectl apply -f ingress.yaml
ingress.networking.k8s.io/ping created
candidate@node01:~$
  • 1.
  • 2.
  • 3.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ kubectl get ingress -n ing-internal
NAME   CLASS   HOSTS   ADDRESS          PORTS   AGE
ping   nginx   *       10.110.140.170   80      69s
candidate@node01:~$
candidate@node01:~$ curl 10.110.140.170/hello
Hello World ^_^
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

6、查看 pod 的 CPU

6.1 题目详情

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

通过 pod label name=cpu-loader,找到运行时占用大量 CPU 的 pod,

并将占用 CPU 最高的 pod 名称写入文件 /opt/KUTR000401/KUTR00401.txt(已存在)。


6.2 参考链接

6.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

查看 pod 名称:

candidate@node01:~$ kubectl top pod -l name=cpu-loader --sort-by=cpu -A
NAMESPACE   NAME                          CPU(cores)   MEMORY(bytes)
cpu-top     redis-test-799bc675cd-zr7jv   2m           5Mi
cpu-top     nginx-host-846bf49987-mf4mr   0m           4Mi
cpu-top     test0-6c665fdc6c-kbm76        0m           5Mi
candidate@node01:~$
# -A 是所有 namespace 的意思
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

将 cpu 占用最多的 pod 的 name 写入/opt/test1.txt 文件:

candidate@node01:~$ echo "redis-test-799bc675cd-zr7jv" > /opt/KUTR000401/KUTR00401.txt
candidate@node01:~$
  • 1.
  • 2.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ cat /opt/KUTR000401/KUTR00401.txt
redis-test-799bc675cd-zr7jv
candidate@node01:~$
  • 1.
  • 2.
  • 3.

K8S认证 2024年CKA考题汇总(解析+答案)_配置环境_11

7、调度 pod 到指定节点

7.1 题目详情

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

按如下要求调度一个 pod:

名称:nginx-kusc00401

Image:nginx

Node selector:disk=ssd


7.2 参考链接

 https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/

7.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

先检查一下是否有这个 pod,因为没有创建,所以需要创建:

candidate@node01:~$ kubectl get pod -A | grep nginx-kusc00401
candidate@node01:~$
  • 1.
  • 2.

检查一下 node 的标签:

candidate@node01:~$ kubectl get nodes --show-labels | grep "disk=ssd"
node01     Ready    <none>          167d   v1.29.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disk=ssd,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux
candidate@node01:~$
  • 1.
  • 2.
  • 3.

K8S认证 2024年CKA考题汇总(解析+答案)_ci_12

创建并参考官方文档编写yaml:

candidate@node01:~$ touch pod-disk-ssd.yaml
  • 1.

修改文件内容:

candidate@node01:~$ cat pod-disk-ssd.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-kusc00401
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disk: ssd

candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

K8S认证 2024年CKA考题汇总(解析+答案)_配置环境_13

创建:

candidate@node01:~$ kubectl apply -f pod-disk-ssd.yaml
pod/nginx-kusc00401 created
candidate@node01:~$
  • 1.
  • 2.
  • 3.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ kubectl get pod nginx-kusc00401 -o wide
NAME              READY   STATUS    RESTARTS   AGE   IP               NODE     NOMINATED NODE   READINESS GATES
nginx-kusc00401   1/1     Running   0          30s   10.244.196.176   node01   <none>           <none>
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.

K8S认证 2024年CKA考题汇总(解析+答案)_nginx_14

8、查看可用节点数量

8.1 题目详情

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

检查有多少 nodes 已准备就绪(不包括被打上 Taint:NoSchedule 的节点),

并将数量写入 /opt/KUSC00402/kusc00402.txt


8.2 参考链接

8.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

检查几个打了 NoSchedule:

candidate@node01:~$ kubectl describe nodes | grep -i Taints
Taints:             node-role.kubernetes.io/control-plane:NoSchedule
Taints:             <none>
Taints:             <none>
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

写入文件:

candidate@node01:~$ echo "2" > /opt/KUSC00402/kusc00402.txt
candidate@node01:~$
  • 1.
  • 2.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ cat /opt/KUSC00402/kusc00402.txt
2
candidate@node01:~$
  • 1.
  • 2.
  • 3.

K8S认证 2024年CKA考题汇总(解析+答案)_ci_15

9、创建多容器的 pod

9.1 题目详情

设置配置环境:

[candidate@node-1] $ kubectl config use-context k8s

Task

按如下要求调度一个 Pod:

名称:kucc8

app containers: 2

container 名称/images:

nginx

memcached


9.2 参考链接

 https://kubernetes.io/docs/concepts/workloads/pods/

9.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

创建 yaml 文件:

candidate@node01:~$ touch pod-kucc8.yaml
  • 1.

根据官方文档进行修改:

candidate@node01:~$ cat pod-kucc8.yaml
apiVersion: v1
kind: Pod
metadata:
  name: kucc8
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  - name: memcached
    image: memcached
    imagePullPolicy: IfNotPresent
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

K8S认证 2024年CKA考题汇总(解析+答案)_nginx_16

创建:

candidate@node01:~$ kubectl apply -f pod-kucc8.yaml
pod/kucc8 created
candidate@node01:~$
  • 1.
  • 2.
  • 3.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ kubectl get pod kucc8
NAME    READY   STATUS    RESTARTS   AGE
kucc8   2/2     Running   0          8s
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.

K8S认证 2024年CKA考题汇总(解析+答案)_ci_17

10、创建 PV

10.1 题目详情

设置配置环境:

[candidate@node-1] $ kubectl config use-context hk8s

Task

创建名为 app-config 的 persistent volume,容量为 1Gi,访问模式为 ReadWriteMany

volume 类型为 hostPath,位于 /srv/app-config


10.2 参考链接

 https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/

10.3 解题流程

切换集群:

candidate@node01:~$ kubectl config use-context k8s
  • 1.

创建 yaml 文件:

candidate@node01:~$ touch pv.yaml
  • 1.

根据官方文档进行编辑修改:

candidate@node01:~$ cat pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: app-config
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/srv/app-config"

candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

K8S认证 2024年CKA考题汇总(解析+答案)_ci_18

创建:

candidate@node01:~$ kubectl apply -f pv.yaml
  • 1.

验证查看(考试时,所有的检查项,都可以不做):

candidate@node01:~$ kubectl get pv
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS      VOLUMEATTRIBUTESCLASS   REASON   AGE
app-config   1Gi        RWX            Retain           Available                             <unset>                          2m21s
pv01         10Mi       RWO            Recycle          Available           csi-hostpath-sc   <unset>                          166d
candidate@node01:~$
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.