CKAD 模拟考 A
这是模拟考试
实际的CKAD是在120分钟内完成15~20个课题,超过66%就可以通过。这个套餐也
作业17个·120分钟·合格线是66%,所以需要全部正确。因为是部分分数制,所以需要全部正确。
没有。通过17个中的12个视为完成处理。
**不要看提示,先试着解到最后。**实际考试没有提示。
遇到困难的作业可以跳过,如果还有时间的话,回来的话对分数更有优势。
提示和正确答案请在考试结束后用作复习。
在实际考试现场第一次知道的话会浪费时间的东西
- 考试是远程桌面,每道作业都通过指定的主机
ssh进行工作。
**不支持叠加ssh。**工作结束后,请务必用exit回到原来的位置。
k别名和bash自动完成**已经设置好了。**一开始就从alias开始
现在建议制作不符合环境。这个练习板也一样调整了。
-
yq·curl·wget·man也已经安装好了。 -
终端复制是
Ctrl+Shift+C,粘贴是Ctrl+Shift+V。 -
Ctrl+W关闭浏览器标签页。 删除单词时请使用Ctrl+Alt+W。 -
INSERT键被堵住,vim必须以
i进入输入模式。 -
每个题目的分值不同,允许多种途径到达正确答案。
域名分配
| 域名 | 实际分数 | 这套任务 |
|---|---:|---:|
| 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。
-
设置emptyDir卷
work,所有容器都挂载在/work上。 -
初始化容器
seed以busybox:1.36创建/work/seed.txt。 -
容器
app是nginx:1.27。 -
容器
tailer用busybox:1.36tail/work/seed.txt。
初始化容器单独写在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)。
-
startupProbe: httpGet
/startup:8080, failureThreshold 30, periodSeconds 5 -
readinessProbe: httpGet
/ready:8080, initialDelaySeconds 5, periodSeconds 10 -
livenessProbe: httpGet
/health:8080, periodSeconds 15, failureThreshold 3, timeoutSeconds 2
三个探头在容器规格中并排写。如果遗漏一个值,就会输入默认值,评分器会按问题中写着的值进行评分。
将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)写入三种方式。
-
通过
envFrom接收整个ConfigMap作为环境变量。 -
环境变量
API_TOKEN参考Secret的相同名称键(不要用普通字符串写)。 -
将ConfigMap作为卷进行挂载,但将
subPath作为app.properties只放在/etc/app/app.properties中。
使用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-ing的app.example.com发送到Ingress /为web:80,/admin发送为admin:80。两个路径都为pathType是Prefix。
路径重叠时,更具体的内容会先匹配,但评分只看两个规则是否准确写着。也请确认后端服务是否实际存在。
禁止和允许三政策
请在名称空间net中创建三个NetworkPolicy。
-
deny-all:对命名空间的所有页面都阻止 incoming traffic 和 outgoing traffic。 -
allow-dns:允许命名空间的所有进程向kube-system命名空间发送UDP 53和TCP 53。 -
allow-web: 允许app=web版面从app=client版面传来的TCP 8080。
如果全部阻止egress,DNS也会被阻止,所以帕德无法找到任何名称。DNS不仅只使用UDP,如果响应很大,就会切换到TCP,所以需要打开两者。命名空间选择器可以选择kubernetes.io/metadata.name标签。