CKAD考试题解析

1、CronJob - 1

Quick Reference
Cluste/配置环境 k8s
Namespace default

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
1、创建一个名为 ppi 并执行一个运行以下单一容器的 Pod 的 CronJob:
- name: pi
 image: perl:5
 command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
配置 CronJob 为:
⚫ 每隔 5 分钟执行一次
⚫ 保留 2 个已完成的 Job
⚫ 保留 4 个失败的 Job
⚫ 永不重启 Pod
⚫ 在 8 秒后终止 Pod

2、为测试目的,从 CronJob ppi 中手动创建并执行一个名为 ppi-test 的 Job。

搜索CronJob和jobs

CKAD考试题解析
CKAD考试题解析
CKAD考试题解析
CKAD考试题解析

vicronjob-1.yaml

apiVersion: batch/v1
kind: CronJob
metadata:
  name: ppi
spec:
  schedule: "*/5 * * * *" #CronJob 的运行时间表,根据题目要求修改。这里是每 5 分钟!
  successfulJobsHistoryLimit: 2
  failedJobsHistoryLimit: 4
  jobTemplate:
    spec:
      activeDeadlineSeconds: 8 
      template:
        spec:
          containers:
          - name: pi
            image: perl:5
            imagePullPolicy: IfNotPresent
            command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
          restartPolicy: Never #这里记得修改,永不重启 Pod 为 Never

创建 CronJob

kubectl apply -f cronjob-1.yaml

检查 CronJob

kubectl get cronjob

CKAD考试题解析

2、CronJob-2

Quick Reference
Cluste/配置环境 k8s
Namespace default

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Context
您需要创建一个将在预定时间运行的 Pod。

Task
1、在清单文件 /ckad/CKAD00016/periodic.yaml 中定义此 Pod
2、在一个 busybox:stable 容器中运行命令 date ,该命令必须每分钟运行一次,并且必须在 10 秒内完成运行,或者被 Kubernetes 终止运行。
 注意:CronJob 名称和容器名称都必须为 hello
3、在上述清单文件中创建此资源,并验证此 Job 至少成功执行一次。

vi /ckad/CKAD00016/periodic.yaml

……
metadata:
  name: hello
spec:
  schedule: "* * * * *" #CronJob 的运行时间表,根据题目要求修改
  jobTemplate:
    spec:
      activeDeadlineSeconds: 10
      template:
        spec:
          containers:
          - name: hello
            image: busybox:stable
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh
            - -c
            - date
          restartPolicy: OnFailure

创建 Cronjob

kubectl apply -f /ckad/CKAD00016/periodic.yaml

检查 Cronjob 和 job,确保至少有一个 hello-****的 job

kubectl get cronjobs hello

kubectl get jobs

CKAD考试题解析

3、Dockerfile

Quick Reference

Task
一个 Dockerfile 已经存在于 /ckad/DF/Dockerfile

1、使用已存在的 Dockerfile,构建一个名为 centos 和标签为 8.2 的容器镜像。
您可以安装和使用您选择的工具。

2、使用您选择的工具,以 OCI 格式导出构建的容器镜像,并将其存储在 /ckad/DF/centos-8.2.tar

要切换到 Dockerfile 文件所在的目录做镜像,注意命令最后还有一个小数点,表示当前目录。

cd /ckad/DF/

sudo docker build -t centos:8.2 .

检查镜像

sudo docker images | grep centos | grep 8.2

2、导出新镜像 centos:8.2,并保存到/ckad/DF/centos-8.2.tar

sudo docker save centos:8.2 > /ckad/DF/centos-8.2.tar

检查存储的镜像

ll /ckad/DF/centos-8.2.tar

4、限制 CPU 和内存 - 1

Quick Reference
Cluster/配置环境 k8s
Namespace pod-resources

Context
您需要创建一个请求一定量的 CPU 和内存的 Pod。

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
在现有的 namespace pod-resources 中创建一个名为 nginx-resources 的 Pod。用 nginx:1.16 的镜像来指定一个容器.
为其容器指定 40m 的 CPU 和 50Mi 的内存的资源请求

搜索pod,resources/requests

CKAD考试题解析

vi nginx-resources.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-resources
  namespace: pod-resources
spec:
  containers:
  - image: nginx:1.16
    name: nginx-resources
    resources:
      requests:
        cpu: "40m"
        memory: "50Mi"

kubectl apply -f nginx-resources.yaml

5、限制CPU和内存-2

Quick Reference
Cluster/配置环境 k8s
Namespace haddock

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
haddock namespace 中名为 nosql 的 Deployment 的 Pod 因其容器已用完资源而无法启动。
请更新 nosql Deployment,使 Pod:
⚫ 为其容器请求 15Mi 的内存
⚫ 将内存限制为 haddock namespace 设置的最大内存容量的一半。
您可以在 /ckad/chief-cardinal/nosql.yaml 找到 nosql Deployment 的配置清单。

先查看 namespace haddock 的 LimitRange 详情

kubectl describe ns haddock

或者使用下面两条命令查看详情

kubectl -n haddock get limitrange
kubectl -n haddock get limitrange xxxxxxxxx -o yaml

可见 namespace haddock 设置的最大内存为 40Mi,一半就是 20Mi。

CKAD考试题解析
CKAD考试题解析

直接在线修改

kubectl -n haddock edit deployments.apps nosql

注意,在 image 这一小段最后添加。

spec:
  containers:
  - image: nginx:1.16
    name: nginx
    resources:
      requests:
        memory: "15Mi"
      limits:
        memory: "20Mi"
CKAD考试题解析

kubectl -n haddock describe deployment nosql

CKAD考试题解析

6、运行旧版应用程序

Quick Reference
Cluster/配置环境 k8s
Namespace garfish

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Context
您需要在运行最新版本 Kubernetes 的 cluster 上部署一个为旧版本 Kubernetes 开发的应用程序。

Task
1、修复清单文件 /ckad/credible-mite/www.yaml 中的任何 API 弃用问题,以便可以将应用程序部署在 k8s cluster 上。
 注意:该应用程序是为 Kubernetes v1.15 开发的。
 k8s cluster 运行着 Kubernetes v1.24
2、请在 garfish namespace 中部署更新后的清单文件/ckad/credible-mite/www.yaml 中指定的应用程序。

修改 yaml 配置文件

vi /ckad/credible-mite/www.yaml

修改红色部分

api 版本修改为 apps/v1
并在 spec 下添加或修改 selector 标签,这个标签要和下面的 template 里的标签一致。

CKAD考试题解析

创建

kubectl apply -f /ckad/credible-mite/www.yaml

检查

kubectl -n garfish get all

7、金丝雀部署

Quick Reference
Cluster/配置环境 k8s
Namespace goshawk

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Contex
为了测试新的应用程序发布,您需要准备一个金丝雀部署。

Task
namespace goshawk 中名为 chipmunk-service 的 Service 指向名为 current-chipmunk-deployment 的 Deployment 创建的 5 个 Pod。

你可以在/ckad/goshawk/中找到 current-chipmunk-deployment 的清单文件。

1、在同一 namespace 中创建一个相同的 Deployment,名为 canary-chipmunk-deployment
2、修改 Deployment,以便:
⚫ 在 namespace goshawk 中运行的 Pod 的最大数量为 10 个
⚫ chipmunk.service 流量的 40%流向 Pod canary-chipmunk-deployment

cp /ckad/goshawk/current-chipmunk-deployment.yaml bak.yaml

vi /ckad/goshawk/current-chipmunk-deployment.yaml

……
metadata:
  name: canary-chipmunk-deployment #这个根据题目要求修改
  namespace: goshawk
spec:
  replicas: 1 #这里也先修改为 1
  selector:
    matchLabels:
      app: canary-chipmunk-deployment
      run: dep-svc #确保 current-chipmunk-deployment 和 canary-chipmunk-deployment 都有这个公用的标签。
  template:
    metadata:
      labels:
        app: canary-chipmunk-deployment
        run: dep-svc #确保 current-chipmunk-deployment 和 canary-chipmunk-deployment 都有这个公用的标签。
……

kubectl apply -f /ckad/goshawk/current-chipmunk-deployment.yaml

总共 10 个 Pod,将 60%流量给当前版本 Pod,就是 current-chipmunk-deployment 扩容至 6 个 pod

kubectl scale deployment current-chipmunk-deployment --replicas=6 -n goshawk

将 40%流量给金丝雀版本 Pod,就是 canary-chipmunk-deployment 扩容至 4 个 pod

kubectl scale deployment canary-chipmunk-deployment --replicas=4 -n goshawk

检查

kubectl get pod -n goshawk

CKAD考试题解析

为了区分不同流量,可以在部署金丝雀的时候,修改一个 lable 标签,这样,crul svc 时打印标签,会打印原先和金丝雀 pod 不同的标签了。

我们可以先检查一下 svc,你会发现,svc 暴露的服务(kubectl -n goshawk get svc -o wide),选择的是原先 deployment 中两个标签中的一个,比如是 run: depsvc(svc 选择是的 pod 的 label,而不是 deployment 的 lable),那么我们只需要部署金丝雀时,修改另一个标签,就是修改 app: current-chipmunk-deployment
为 app: canary-chipmunk-deployment,这样 curl svc 时,打印的标签就是 current 和 canary,就能够显示出测试的效果了。

8、配置 Container 安全上下文

Quick Reference
Cluste/配置环境 k8s
Namespace quetzal

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
修改运行在 namespace quetzal 名为 broker-deployment 的现有 Deployment,使其容器
⚫ 以用户 30000 运行
⚫ 禁止特权提升。
您可以在/ckad/daring-moccasin/broker-deployment.yaml 找到 broker-deployment 的清单文件。(模拟环境无此文件,做题也不需要此文件)

搜索security context

CKAD考试题解析

kubectl edit deployment broker-deployment -n quetzal

在 containers:下的 image:和 name:下面添加:

 spec:
   containers:
   - image: busybox
     imagePullPolicy: IfNotPresent
     name: sec-ctx-demo
     securityContext:
       runAsUser: 3000
       allowPrivilegeEscalation: false
CKAD考试题解析

9、创建 Deployment 并指定环境变量

Quick Reference
Cluster/配置环境 k8s
Namespace ckad00014

Context
您需要新建一个用于运行 NGINX 的 Deployment。

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
在现有的 namespace ckad00014 中创建一个运行 6 个 Pod 副本,名为 api 的 Deployment。用 nginx:1.16 的镜像来指定一个容器。
将名为 NGINX_PORT 且值为 8000 的环境变量添加到容器中,然后公开端口 80

搜索env

CKAD考试题解析

下面命令背过,如果不会,就使用 kubectl -h 来帮助。

kubectl create deployment api --image=nginx:1.16 --replicas=6 -n ckad00014 --dry-run=client -o yaml > api.yaml

vi api.yaml

在 containers:里的 image:和 name:下添加

    env:
     - name: NGINX_PORT
     value: "8000"
     ports:
     - containerPort: 80
CKAD考试题解析

kubectl apply -f api.yaml

10、RBAC 授权

Quick Reference
Cluster/配置环境 k8s
Namespace gorilla

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
在名为 honeybee-deployment 的 Deployment 和 namespace gorilla 中的一个 Pod 正在记录错误.
1 查看日志以识别错误消息。
找出错误,包括 User “system:serviceaccount:gorilla:default ”cannot list resource “serviceaccounts” […] in the namespace “gorilla”
2 更新 Deployment honeybee-deployment 以解决 Pod 日志中的错误。
您可以在/ckad/prompt-escargot/honeybee-deployment.yaml 中找到 honeybee-deployment 的清单文件

1、通过 logs 打印错误日志

kubectl -n gorilla get pod

kubectl -n gorilla logs honeybee-deployment-***

CKAD考试题解析

检查现有的serviceaccount

kubectl -n gorilla get sa

CKAD考试题解析

查看rolebinding和role的绑定

kubectl -n gorilla get rolebinding

CKAD考试题解析

通过rolebinding,查看role和serviceaccount的绑定

kubectl -n gorilla describe rolebinding

CKAD考试题解析

检查role,寻找有get或list权限的role

kubectl -n gorilla describe role

CKAD考试题解析

通过上面的一系列操作,检查发现,gorilla-role符合题目的要求,它对应的serviceaccount是gorilla-sa

3、设置honeybee-deployment的serviceaccount

kubectl -n gorilla set serviceaccount deployments honeybee-deployment gorilla-sa

等2分钟,会自动生成一个新pod,再次检查,不报错了

kubectl -n gorilla logs honeybee-deployment-***

CKAD考试题解析

11、ConfigMap

Quick Reference
Cluster/配置环境 k8s
Namespace default

Context
您需要创建一个 Configmap,并在一个 Pod 中使用此 Config Map。

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
1 在 namespace default 中创建一个名为 some-config 并存储着以下键/值对的 Configmap:
key3: value4
2 在 namespace default 中创建一个名为 nginx-configmap 的 Pod。用 nginx:stable 的镜像来指定一个容器。
用存储在 Configmap some-config 中的数据来填充卷,并将其安装在路径/some/path

搜索configMap

CKAD考试题解析

1、在 namespace default 中创建一个名为 some-config 并存储着以下键/值对的 Configmap

kubectl create configmap some-config --from-literal=key3=value4

2、在 namespace default 中创建一个名为 nginx-configmap 的 Pod。用 nginx:stable 的镜像来指定一个容器。

vi nginx-configmap.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-configmap
spec:
  containers:
  - name: nginx-configmap
    image: nginx:stable
    volumeMounts:
    - name: config
      mountPath: "/some/path"
  volumes:
  - name: config
    configMap:
      name: some-config

kubectl apply -f nginx-configmap.yaml

检查

kubectl exec -it nginx-configmap --/bin/bash

cat /some/path/key3

CKAD考试题解析

12、Secret

Quick Reference
Cluster/配置环境 k8s
Namespace default

Context
您需要创建一个 Secret,并在一个 Pod 中使用此 Secret。
您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
1、在 namespace default 中创建一个名为 another-secret 并包含以下单个键/值对的 Secret:
key1: valuel2
2、在 namespace default 中创建一个名为 nginx-secret 的 Pod。用 nginx:1.16 的镜像来指定一个容器。
添加一个名为 COOL_VARIABLE 的环境变量来使用 secret 键 key1 的值。

搜索secret

CKAD考试题解析

1、在namespace default中创建一个名为another-secret并包含以下单个键/值对的Secret:key1: valuel2

kubectl create secret generic another-secret --from-literal=key1=value1

2、在 namespace default 中创建一个名为 nginx-secret 的 Pod。用 nginx:1.16 的镜像来指定一个容器。添加一个名为 COOL_VARIABLE 的环境变量来使用 secret 键 key1 的值。

vi nginx-secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: nginx-secret
spec:
  containers:
  - image: nginx:1.16
    name: nginx-secret
    env:
    - name: COOL_VARIABLE
      valueFrom:
        secretKeyRef:
          name: another-secret
          key: key1

kubectl apply -f nginx-secret.yaml

13、Pod 健康检查 livenessProbe

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context dk8s

Task
由于 Liveness Probe 发生了问题,您无法访问一个应用程序。该应用程序可能在任何 namespace 中运行。
1 找出对应的 Pod 并将其名称和 namespace 写入文件 /ckad/CKAD00011/broken.txt 。使用以下格式:
<namespaceName>/<podName>
文件/ckad/CKAD00011/broken.txt 已存在
2 用 kubectl get events 来获取相关错误事件井将其写入文件 /ckad/CKAD00011/error.txt 。请使用输出格式 wide 。
文件/ckad/CKAD00011/error.txt 已存在。
3 修复故障的 Pod 的 Liveness Probe 问题。

搜索liveness

CKAD考试题解析

找出Liveness probe问题的Pod。

kubectl get pods-A

kubectl describe pod probe-demo-n probe-ns|tail

CKAD考试题解析

echo probe-ns/probe-demo >/ckad/CKAD00011/broken.txt

kubectl get events -n probe-ns -o wide |grep probe-demo > /ckad/CKAD00011/error.txt

kubectl get pods probe-demo -n probe-ns -o yaml > probe.yaml

cp probe.yaml bak-probe.yaml

kubectl delete -f probe.yaml

vi probe.yaml

CKAD考试题解析

kubectl apply -f probe.yaml

检查

kubectl describe pod probe-demo -n probe-ns |tail

14、Pod 健康检查 readinessProbe

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context dk8s

修改现有的 deployment probe-http ,增加 readinessProbe 探测器,规格如下:
使用 httpGet 进行探测
探测路径为 /healthz/return200
探测端口为 80
在执行第一次探测前应该等待 15 秒
执行探测的时间间隔为 20 秒

搜索readinessProbe,readinessProbe 是就绪探测

CKAD考试题解析
CKAD考试题解析

编辑 deployment probe-http
kubectl edit deployment probe-http

CKAD考试题解析

检查

kubectl get pod

CKAD考试题解析

15、升级与回滚

Quick Reference
Cluster/配置环境 k8s
Namespace ckad00015

Context
您需要更新一个应用程序,然后执行该更新的回滚。
您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
1 更新 namespace ckad00015 中的 Deployment webapp 的比例缩放配置,将 maxSurge 设置为 10%,将 maxUnavailable 设置为 4。
2 更新 Deployment webapp 以让容器镜像 lfccncf/nginx 使用版本标签 1.13.7。
3 将 Deployment webapp 回滚至前一版本。

1、kubectl edit deployment webapp -n ckad00015

CKAD考试题解析

2、先检查一下之前的 image 版本,为 lfccncf/nginx:1.12.2

kubectl -n ckad00015 get deployments webapp -o yaml|grep image

kubectl set image deployment webapp nginx=lfccncf/nginx:1.13.7 -n ckad00015

kubectl -n ckad00015 get deployments webapp -o yaml|grep image

如果需要看历史,则可以使用下面这条命令

kubectl -n ckad00015 rollout history deployment webapp

回滚

kubectl rollout undo deployment webapp -n ckad00015

或者 kubectl rollout undo deployment webapp -n ckad00015 --to-revision=1

--to-revision 指定回滚的版本

再检查,image 为 1.12.2 了

kubectl -n ckad00015 get deployments webapp -o yaml|grep image

16、Deployment 使用 ServiceAcount

Quick Reference
Cluster/配置环境 k8s
Namespace frontend

Contest
您的应用程序需要使用特定的 ServiceAccount
您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
更新在 namespace frontend 中的 Deployment,使其使用现有的 ServiceAccount app

检查 deployment 的名字

kubectl -n frontend get deployment

开始更新

kubectl -n frontend set serviceaccount deployments frontend-deployment app

17、更新 Deployment 并暴露 Service

Quick Reference
Cluster/配置环境 k8s
Namespace ckad00017

Contest
您需要扩展一个现有的应用程序,并将其公开在基础设施内。

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
1 首先,更新在 namespace ckad00017 中的 Deployment ckad00017-deployment :
⚫ 以使其运行 5 个 Pod 的副本
⚫ 将以下标签添加到 Pod
tier: dmz
2 然后,在 namespace ckad00017 中创建一个名为 rover 的 NodePort Service 以在 TCP 端口 81 上公开 Deployment ckad00017-deployment

1、第一个 Task

kubectl get deployment ckad00017-deployment -n ckad00017 -o yaml > ckad00017.yaml

cp ckad00017.yaml bak-ckad00017.yaml

kubectl delete -f ckad00017.yaml

vi ckad00017.yaml

修改 replicas: 1 为 replicas: 5;标签 app: ckad00017-deployment

kubectl apply -f ckad00017.yaml

CKAD考试题解析

检查

kubectl get pod -n ckad00017 --show-labels

2、第二个 Task

先确认 pod 容器的端口,就是下面命令--target-port=的端口。

通过检查发现,容器端口为 81。

kubectl -n ckad00017 expose deployment ckad00017-deployment --name=rover --protocol=TCP --port=81 --target-port=81 --type=NodePort

注意:
--port=81 是暴露的 service 的端口为 81。
--target-port=81 是 Deployment ckad00017-deployment 内 Pod 容器使用的端口,这个需要检查 yaml 文件。如果检查完,发现容器端口为 containerPort: 80,
或者没有 containerPort,则也是用默认的 80。则暴露服务的命令需要写成。
kubectl -n ckad00017 expose deployment ckad00017-deployment --name=rover --protocol=TCP --port=81 --target-port=80 --type=NodePort

检查

kubectl -n ckad00017 get svc

curl 10.103.95.21:81

CKAD考试题解析

18、NetworkPolicy 网络策略

Quick Reference
Cluster/配置环境 nk8s
Namespace ckad00018

Contest
您需要让一个 Pod 只与其他两个 Pod,而不是和这两个以外的,进行通信。
您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context nk8s

Task
更新在 namespace ckad00018 中的 Pod ckad00018-newpod ,
使其使用一个只允许 此 Pod 与 Pod front 和 db 之间收发流量的 Networkpolicy

搜索networkPolicies

CKAD考试题解析

1、先检查所有的networkpolicy和pod标签

通过查看所有networkpolicy得知,

front 和db各有一个networkpolicy,ckad00018-newpod没有networkpolicy。

所以查看front 和db的networkpolicy标签,把可以跟他们互通的标签,设置给ckad00018-newpod。

kubectl -n ckad00018 get networkpolicy

kubectl -n ckad00018 get networkpolicy access-front -o yaml

CKAD考试题解析

kubectl -n ckad00018 get networkpolicy access-db -o yaml

CKAD考试题解析

kubectl -n ckad00018 get pod --show-labels

CKAD考试题解析

2、给ckad00018-newpod打正确的标签

kubectl label pod -n ckad00018 ckad00018-newpod front-access=true

kubectl label pod -n ckad00018 ckad00018-newpod db-access=true

再次检查标签

kubectl -n ckad00018 get pod --show-labels

CKAD考试题解析

19、Ingress排错-1

Quick Reference
Cluster/配置环境 k8s
Namespace ingress-ckad

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
在 namespace ingress-ckad 下,有 deployment service ingress 三个资源已经部署好了,
但是他们的配置有问题,导致的 ingress 网络不通。
3 个资源的配置清单在目录/ckad/CKAD202206 中,请将其修改为正确的,并重新创建。

请注意,这道题的 deployment 是正确的,请不要修改 deployment。

搜索ingress

CKAD考试题解析

说明:

port是service端口,即k8s中服务之间的访问端口

targetport是pod(也就是容器)的端口

修改配置文件

vi /ckad/CKAD202206/ingress.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dm
  namespace: ingress-ckad
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx-ing
  template:
    metadata:
      labels:
        name: nginx-ing ## 1 ## 记住 Deployment 的 labels 标签,因为题目说明了 Deployment 是正确的。
    spec:
      containers:
      - name: nginx
        image: vicuu/nginx:hello81
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 81 ## 2 ## 记住 Deployment 的容器的端口号,因为题目说明了 Deployment 是正确的。

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-ing-svc ## 3 ## 记住 Service 的 name 名字
  namespace: ingress-ckad
spec:
  ports:
  - port: 80 ## 5 ## 检查一下,确保 Service 的 port 和 Ingress 的 port:number 端口一致
    targetPort: 81 ## 2 ## 修改 Service 的 targetPort 端口与上面 Deployment 的 containerPort 端口号一致,即修改为 80。
    protocol: TCP
  selector:
    name: nginx-ing ## 1 ## 修改 Service 的 selector 为上面 Deployment 的 labels 标签,即修改为 name: nginx-ing

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-ingress-test
  namespace: ingress-ckad
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /hello ## 4 ## 检查一下 Ingress 的 path,如果题目里有要求,则修改为题目要求的路径。
        pathType: Prefix
        backend:
          service:
            name: nginx-ing-svc ## 3 ## 修改 Ingress 的 service 为上面 Service 的 name 名字,即修改为 name: nginx-ing-svc
            port:
              number: 80 ## 5 ## 检查一下,确保 Ingress 的 port:number 和 Service 的 port 端口一致

kubectl apply -f /ckad/CKAD202206/ingress.yaml

CKAD考试题解析

20、Ingress 排错-2

Quick Reference
Cluster/配置环境 k8s
Namespace ingress-kk

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
在 namespace ingress-kk 下有一个 ingress ,但是它貌似不能被正常访问,
请排除出原因,并修复。

请注意,这道题的 deployment 是正确的,请不要修改 deployment。

先检查这道题里的 ingress 和 deployment,以及 service,这三项哪里有问题。

kubectl -n ingress-kk get all

CKAD考试题解析

经过分析检查,会发现没有service,所以需创建service,而service需要的内容部分来自ingress和deployment里的字段。

查看ingress,记下service的name和port的number。

kubectl -n ingress-kk get ingress -o yaml

CKAD考试题解析

查看deployment,记下ports的containerPort

kubectl -n ingress-kk get deployments -o yaml

CKAD考试题解析

创建service

vi kk-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginxsvc-kk #这里对应 ingress 里的 service: name:
  namespace: ingress-kk
spec:
  ports:
  - port: 80 #port: 80 是 service 的端口,它对应的是 ingress 里的 port: number
    targetPort: 80 # targetPort: 80 是 deployment 里的容器的端口
    protocol: TCP
  selector:
    name: nginx-lab #这里对应 deployment 的 labels 标签

kubectl apply -f kk-svc.yaml

检查

kubectl -n ingress-kk get all

curl <service 的 ip 地址>

CKAD考试题解析

21、Service、Configmap、Sidecar

Quick Reference
Cluster/配置环境 k8s
Namespace default
Context
位于一个 Pod 中的容器被硬编码使其连接到在特定的端口上的 Service。您需要添加一个 ambassador 容器来更新端口并使其可配置以供将来更新。

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
1、更新在 namespace default 中的 Service nginxsvc 来暴露端口 9090。
2、在 namespace default 中创建一个名为 haproxy-config 并存储着的/ckad/ambassador/haproxy.cfg 的内容的 ConfigMap。
3、更新在 namespace default 中名为 poller 的 Pod:
首先,添加一个使用 haproxy:lts 镜像、暴露端口 80 并名为 ambassador-container 的 ambassador 容器(大使代理模式)。
最后,ConfigMap haproxy-config 要挂载到 ambassador 容器 ambassador-container 的/usr/local/etc/haproxy/目录。

1、更新在 namespace default 中的 Service nginxsvc 来暴露端口 9090。

kubectl edit svc nginxsvc -n default

修改为 port: 9090
注意,不是修改 targetPort。

CKAD考试题解析

2、在 namespace default 中创建一个名为 haproxy-config 并存储着的/ckad/ambassador/haproxy.cfg 的内容的 ConfigMap。

kubectl create configmap haproxy-config --from-file=/ckad/ambassador/haproxy.cfg -n default

3、更新在 namespace default 中名为 poller 的 Pod:

kubectl -n default get pod poller -o yaml > poller.yaml

cp poller.yaml bak-poller.yaml

kubectl delete -f poller.yaml

vi poller.yaml

……
  - image: haproxy:lts
    name: ambassador-container
    ports:
  - containerPort: 80
  volumeMounts:
  - name: config
    mountPath: "/usr/local/etc/haproxy/"
    readOnly: true
……
在 volumes:下面
 - name: config
 configMap:
 name: haproxy-config
……
CKAD考试题解析

kubectl apply -f poller.yaml

检查

kubectl get pod poller -n default

kubectl get svc -n default

curl 10.98.61.231:9090

CKAD考试题解析

22、Deployment 修改镜像

Quick Reference
Cluster/配置环境 nk8s
Namespace default

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context nk8s

Task
在 namespace default 中的一个 Deployment 由于指定了错误的容器镜像而失败。
找出此 Deployment 并修复问题。

kubectl get pods -n default

CKAD考试题解析

通过查出来的 pod,去编辑它的 deployment。

kubectl edit deployment deploy-nk8s -n default

修改 image:为正确的镜像,比如改为 image: nginx

CKAD考试题解析

再次检查

kubectl get pods -n default

CKAD考试题解析

23、获取使用CPU 最高的Pod

Quick Reference
Cluster/配置环境 k8s
Namespace cpu-stress

您必须切换到正确的 Cluster/配置环境。不这样做可能导致零分。
[candidate@node-1] $ kubectl config use-context k8s

Task
监控在 namespace cpu-stress 中运行的 Pod,
并将消耗最多 CPU 的 Pod 的名称写入文件 /ckad/CKAD00010/pod.txt
注意:文件 /ckad/CKAD00010/pod.txt 已存在

kubectl top pod --sort-by="cpu" -n cpu-stress

echo redis-test > /ckad/CKAD00010/pod.txt

CKAD考试题解析

24、PV/PVC 的使用

问题:
1、在 node02 节 点 上 创 建 一 个 文 件 /opt/KDSP00101/data/index.html , 内 容 为 WEPKEY=7789
2、使用 hostPath 创建一个名为 task-pv-volume 的 PersistentVolume ,并分配 2Gi 容量,指定该卷位于集群节点上的 /opt/KDSP00101/data ,访问模式
ReadWriteOnce 。它应该为 PersistentVolume 定义 StorageClass 名称为 keys ,它将被用来绑定 PersistentVolumeClaim 请求到这个 PersistenetVolume。
3、创建一个名为 task-pv-claim 的 PersistentVolumeClaim,请求容量 200Mi ,并指定访问模式 ReadWriteOnce
4、创建一个 pod,使用 PersistentVolmeClaim 作为一个卷,带有一个标签 app:my-storage-app ,将卷挂载到 pod 内的 /usr/share/nginx/html

搜索PV

CKAD考试题解析

从 node01 上 ssh 跳转到 node02 上

ssh node02

1、在 node02 节 点 上 创 建 一 个 文 件 /opt/KDSP00101/data/index.html , 内 容 为 WEPKEY=7789

echo WEPKEY=7789 > /opt/KDSP00101/data/index.html

2、使用 hostPath 创建一个名为 task-pv-volume 的 PersistentVolume ,并分配 2Gi 容量,指定该卷位于集群节点上的 /opt/KDSP00101/data ,访问模式 ReadWriteOnce 。它应该为 PersistentVolume 定义 StorageClass 名称为 keys ,它将被用来绑定 PersistentVolumeClaim 请求到这个 PersistenetVolume。

vi task-pv-volume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
spec:
  storageClassName: keys
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/opt/KDSP00101/data"

kubectl apply -f task-pv-volume.yaml

3、创建一个名为 task-pv-claim 的 PersistentVolumeClaim,请求容量 200Mi ,并指定访问模式 ReadWriteOnce

vi task-pv-claim.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: keys
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 200Mi

kubectl apply -f task-pv-claim.yaml

4、创建一个 pod,使用 PersistentVolmeClaim 作为一个卷,带有一个标签 app:my-storage-app ,将卷挂载到 pod 内的 /usr/share/nginx/html

注意:
因为 Kubernetes supports hostPath for development and testing on a single-node cluster.
所以,测试环境里,需要指定 Pod 在 node02 上运行,即,与 hostPath 类型的 PV 在同一个节点上。
考试环境,一般只有一个 node 节点,所以不需要指定。但是最好你考试时,kubectl get node 先检查一下,如果有多个 node 节点,则也需要指定 Pod 在创建 PV
的那个节点上运行,即,使用 nodeSelector。

vi task-pv-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  labels:
  app: my-storage-app
  name: task-pv-pod
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
      - mountPath: "/usr/share/nginx/html"
        name: task-pv-storage
   nodeSelector:
     kubernetes.io/hostname: node02 #使用 kubectl get node --show-labels 确定这个 node 的特有标签
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim

kubectl apply -f task-pv-pod.yaml

测试

kubectl get pod -o wide | grep task-pv-pod

curl 10.244.2.35

CKAD考试题解析

25、Pod 多容器--边车

⚫ 在 default 命名空间创建一个 deployment 名为 deploymenb-web
⚫ 包含一个主容器 lfccncf/busybox:1 ,名称 logger-123
⚫ 包含一个边车容器 lfccncf/fluentd:v0.12 ,名称 adaptor-dev
⚫ 在两个容器上挂载一个共享卷 /ckad/log ,当 pod 删除,这个卷不会持久。
⚫ 在 logger-123 容器运行以下命令:
while true; do
echo “i luv cncf” >> /ckad/log/input.log;
sleep 10;
done
结果会文本输出到 /ckad/log/input.log ,格式示例如下:
i luv cncf
i luv cncf
i luv cncf
⚫ adaptor-dev 容器读取 /ckad/log/input.log ,并将数据输出到 /ckad/log/output.* 格式为 Fluentd JSON。

请 注 意 : 完 成 此 任 务 不 需 要 了 解 Fluentd , 完 成 此 任 务 所 需 要 的 知 识 从/ckad/KDMC00102/fluentd-configmap.yaml 提供规范文件中
创建 configmap ,并将该 configmap 挂载到边车容器 adapter-dev 中的 /fluentd/etc

搜索Logging Architecture

CKAD考试题解析

cp /ckad/KDMC00102/fluentd-configmap.yamlbak-2.yaml

vi /ckad/KDMC00102/fluentd-configmap.yaml

这段配置文件了解即可

apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
data:
  fluent.conf: |
  <source>
    @type tail
    format none
    path /ckad/log/input.log
    tag cncf #修改为 cncf 或其他包含在日志中的字段。因为从题中 echo “i luv cncf” >> /ckad/log/input.log 得知内容“i luv cncf”要写到/ckad/log/output,
所以 tag 可以过滤 cncf 字段,而得到内容“i luv cncf”。
    <parse>
      @type none
    </parse>
  </source>
  <match cncf> #修改为 cncf 或者* ,match 是匹配上面的 tag cncf,如果写为 cncf,则只匹配 tag cncf,如果写为*,则匹配上面所有的 tag。在这道题里,
也可以写为* 。
  @type file
  path /ckad/log/output #创建完成后,会自动生成/ckad/log/output.20220314.b5da2f3157860121f,其中 output.* 星号是随机字符。
  </match>

kubectl apply -f /ckad/KDMC00102/fluentd-configmap.yaml

vi sidecar.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploymenb-web
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: lfccncf/busybox:1
        name: logger-123
        args:
        - /bin/sh
        - -c
        - >
          while true;
          do
            echo "i luv cncf" >> /ckad/log/input.log;
            sleep 10;
          done
        volumeMounts:
        - name: log
          mountPath: /ckad/log
      - image: lfccncf/fluentd:v0.12
        name: adaptor-dev
        volumeMounts:
        - name: log
          mountPath: /ckad/log
        - name: config
          mountPath: "/fluentd/etc"
      volumes:
      - name: log
        emptyDir: {}
      - name: config
        configMap:
          name: fluentd-config

kubectl apply -f sidecar.yaml

检查

kubectl get deploy,pod | grep deploymenb-web

kubectl exec deploymenb-web-xxxx -c adaptor-dev -- tail /ckad/log/input.log

CKAD考试题解析

发布者:LJH,转发请注明出处:https://www.ljh.cool/33682.html

(11)
上一篇 2023年2月24日 下午7:17
下一篇 2023年2月26日 下午1:04

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注