LabHub
学习 学习路径 课程

CKAD — Kubernetes 应用开发者

CKAD 模拟考 A

在 LabHub 中继续学习

这是模拟考试

实际的CKAD是在120分钟内完成15~20个课题,超过66%就可以通过。这个套餐也

作业17个·120分钟·合格线是66%,所以需要全部正确。因为是部分分数制,所以需要全部正确。

没有。通过17个中的12个视为完成处理。

**不要看提示,先试着解到最后。**实际考试没有提示。

遇到困难的作业可以跳过,如果还有时间的话,回来的话对分数更有优势。

提示和正确答案请在考试结束后用作复习。

在实际考试现场第一次知道的话会浪费时间的东西

**不支持叠加ssh。**工作结束后,请务必用exit回到原来的位置。

现在建议制作不符合环境。这个练习板也一样调整了。

域名分配

| 域名 | 实际分数 | 这套任务 |

|---|---:|---:|

| Application Design and Build | 20% | 1~3次 |

| Application Deployment | 20% | 4~7次 |

| Application Observability and Maintenance | 15% | 8~10次 |

| Application Environment, Configuration and Security | 25% | 11~14号 |

| Services and Networking | 20% | 15~17号 |

关于时间分配

3号(CronJob)最多需要1分钟,直到控制器实际运行一次。先制作

先放下其他作业,完成后再确认。4号和5号要等到滚动结束。

因此,使用kubectl rollout status比较快。

##在这个环境中的其他点

Pad内的群集是kwokctl发布的1人用群集。因为控制平面是真实的

Manifest、RBAC、排程、季度、CRD、PV绑定、排水全部实际运行。

但是工作负载容器不会运行,所以kubectl exec·logs·port-forward

不能用。作业也不要求那个。

开始前,请用kubectl get nodes确认3个节点是否已准备就绪。如果还没有准备就绪的话

正在显示聚类中(大约需要2分钟)。

##评分

按下各课题的确认按钮,评分器将在活着的群集中重新计算值

进行对比。不是看文件上写了什么,而是看群集处于什么状态。

通往正确答案的道路允许多种途径。

初始化容器和侧卡

请在命名空间app中创建垫子logger

初始化容器单独写在spec.initContainers中。卷只在磁盘上声明一次,三个容器各自用volumeMounts导入。

指定完成次数的Job

在命名空间app中创建Jobmigrate。图像是busybox:1.36,执行echo done

完成次数4,并行度2,backoffLimit 2,activeDeadlineSeconds 120,restartPolicy是Never。必须以捕获的Complete结束。

Job的completions制作后不能更改。如果写错了值,请删除并重新制作。restartPolicy写在pad模板那一边。

CronJob

请在命名空间app中创建CronJobreport。图像是busybox:1.36执行date, restartPolicy是OnFailure。

日程安排是*/1 * * * *, concurrencyPolicy是Forbid, startingDeadlineSeconds是30,成功记录只剩下2个,失败记录是1个。实际上必须执行一次以上。

因为周期为1分钟,所以制作后不久还没有执行记录。请等到kubectl get cronjob report -n app的LAST SCHEDULE列上显示时间后再评分。

通过滚动更新上传图片

请将Deployment deploy在Namespace api中设置为nginx:1.27,并创建3个副本。策略是RollingUpdate, maxSurge 2·maxUnavailable 0。

然后将该图像上传到nginx:1.28。不要删除后重新创建,需要更新。

kubectl set image deploy/api <컨테이너>=nginx:1.28更新后,之前的ReplicaSet将作为历史记录留下。请等待到kubectl rollout status结束为止。

回滚

请将Deployment deploy在名称空间web中设置为nginx:1.27,并创建2个副本。

然后将该图像上传为nginx:1.99-broken,确认是错误的发布后,请恢复到第一版本。恢复后,问题版本也应该保留在历史记录中。

kubectl rollout history deploy/web确认版本号后,写入kubectl rollout undo deploy/web --to-revision=1。删除后重新创建的话,历史记录会消失。

按标签分成的金丝雀

在名称空间deploy中创建Deployment shop-stable(副本4,板标签app=shop·version=stable,映像nginx:1.27)和shop-canary(副本1,板标签app=shop·version=canary,映像nginx:1.28)。两个板的容器端口都是8080。

Service shop 接收80次,转发到8080,必须指向两个部署的pad。

在服务选择器中输入version的话,只会捕获一方。请只用两个部署共同拥有的一个标签作为选择器。只要确认端点有5个就可以了。

kustomize叠加

/root/exam/kustomize/base中放置Deployment cart(副本1,映像nginx:1.27,板标签app=cart)和kustomization。

/root/exam/kustomize/overlay中创建覆盖层,在名称前面加上prod-,命名空间改为deploy-prod,复制件改为3,图像标签改为1.28,并添加标签env=prod(不放入选择器中)。

请将那个叠加物应用到聚类中。

先用kubectl kustomize <디렉터리>用眼睛确认结果后,请用kubectl apply -k进行应用。选择器创建后无法更改,所以把共同标签放在选择器中的话,下次应用会被拒绝。

三个探针

请在名称空间obs中创建Deploymentcheckout。图像是nginx:1.27,复制件2个,容器端口是8080(名称http)。

三个探头在容器规格中并排写。如果遗漏一个值,就会输入默认值,评分器会按问题中写着的值进行评分。

将pad列表提取为文件

在名称空间obs中,按标签app=checkout的帕德按名称顺序排列,以<파드이름> <노드이름> <상태>的形式保存到一行/root/exam/09-pods.txt中。不添加标题。

评分器会将此文件与评分时的群集进行比较。如果以后重新创建了板,请重新创建文件。

kubectl get pods -o jsonpath的range提取所需的字段,用sort排序就可以了。节点名称是.spec.nodeName,状态是.status.phase

移动消失的API版本

下面的manifest是现在在集群中不提供服务的API版本。请迁移到当前版本并应用于命名空间obs。如果需要的字段增加,请填写。

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata: {name: obs-pdb}
spec:
  minAvailable: 1
---
apiVersion: batch/v1beta1
kind: CronJob
metadata: {name: obs-cron}
spec:
  schedule: "0 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers: [{name: obs, image: busybox:1.36, command: ["sh","-c","date"]}]
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata: {name: obs-ing}
spec:
  rules:
    - host: obs.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: checkout
              servicePort: 80

请一起创建Ingress要指定的Service checkout(80号→容器端口http)和IngressClass nginx(controller k8s.io/ingress-nginx),并在Ingress中指定该类。PDB的选择器是app=checkout

可以通过kubectl explain <리소스> --recursive来确认当前版本的字段名称。policy/v1的PDB必须有selector,networking.k8s.io/v1的Ingress要求pathType和backend.service结构。

注入设置和秘密值

请在命名空间cfg中创建ConfigMapapp-config。键是APP_MODE=production, LOG_LEVEL=info, 以及文件用的键app.properties(内容自由)。

请在Secret app-secret(Opaque)中放置键API_TOKEN值请直接设定。

Deployment svc(映像 nginx:1.27, 副本 1)写入三种方式。

使用subPath时,不会把目录放在路径上,只会把一个文件放在路径上。在mountPath上写上文件路径,在subPath上写上键名。如果把值设置为--from-literal,base64编码由kubectl自己处理。

用securityContext缩小范围

请在名称空间cfg中创建Deploymenthardened。图像是nginx:1.27,复制件1个。

Pad级别:runAsUser 10001,runAsGroup 10001,fsGroup 10001,runAsNonRoot true,seccompProfile是RuntimeDefault。

容器级别:allowPrivilegeEscalation false, readOnlyRootFilesystem true, capabilities全部删除,只添加NET_BIND_SERVICE。

Pad级别和容器级别在不同的位置。capabilities和allowPrivilegeEscalation·readOnlyRootFilesystem只有在容器方面。

应用程序专用服务账户

在名称空间cfg中创建服务账户app-sa,但请不要让令牌自动挂载。

Role cm-reader 只允许在 core 组中的 configmaps 中使用 get·list。请将其绑定为 RoleBinding cm-reader

请将Deployment reader(图像 nginx:1.27, 副本1)转到该服务账户。

automountServiceAccountToken是服务账户对象的顶级字段(不是spec内)。在部署中用pad规格的serviceAccountName指定。

在限度内运转的工作负载

在名称空间cfg-quota中添加LimitRangecfg-limits。以容器为基准,max cpu 500m·memory 512Mi,min cpu 50m·memory 64Mi,default cpu 250m·memory 256Mi,defaultRequest cpu 100m·memory 128Mi。

ResourceQuota cfg-quota 的限制是 pods 10, requests.cpu 1, requests.memory 1Gi, limits.cpu 2, limits.memory 2Gi。

Deployment sized(图像 nginx:1.27, 副本2)要求requests cpu 100m·memory 128Mi, limits cpu 250m·memory 256Mi,两个进程都必须启动。

超过LimitRange的max值在Admission中被拒绝。是否实际计入了quota,请查看kubectl describe quota cfg-quota -n cfg-quota的Used列。

ClusterIP和NodePort

请在名称空间net中创建Deploymentweb。图像是nginx:1.27,复制件3个,容器端口是8080,名称是http

Service web 收到 80 次 ClusterIP,并转发到端口名称 http。Service web-nodeport 指向相同的套接字,收到 80 次,节点端口是 30080。

两个服务都需要在targetPort上写上名字,而不是数字。nodePort只能在30000~32767范围内直接指定。

分隔两个路线的Ingress

在名称空间net上创建Deployment admin(映像nginx:1.27,副本1,容器端口8080名称http)和Service admin(80号→http)。

创建IngressClass nginx(controller k8s.io/ingress-nginx),将Host net-ingapp.example.com发送到Ingress /为web:80,/admin发送为admin:80。两个路径都为pathType是Prefix。

路径重叠时,更具体的内容会先匹配,但评分只看两个规则是否准确写着。也请确认后端服务是否实际存在。

禁止和允许三政策

请在名称空间net中创建三个NetworkPolicy。

如果全部阻止egress,DNS也会被阻止,所以帕德无法找到任何名称。DNS不仅只使用UDP,如果响应很大,就会切换到TCP,所以需要打开两者。命名空间选择器可以选择kubernetes.io/metadata.name标签。