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
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
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
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
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。
直接在线修改
kubectl -n haddock edit deployments.apps nosql
注意,在 image 这一小段最后添加。
spec:
containers:
- image: nginx:1.16
name: nginx
resources:
requests:
memory: "15Mi"
limits:
memory: "20Mi"
kubectl -n haddock describe deployment nosql
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 里的标签一致。
创建
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
为了区分不同流量,可以在部署金丝雀的时候,修改一个 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
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
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
下面命令背过,如果不会,就使用 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
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-***
检查现有的serviceaccount
kubectl -n gorilla get sa
查看rolebinding和role的绑定
kubectl -n gorilla get rolebinding
通过rolebinding,查看role和serviceaccount的绑定
kubectl -n gorilla describe rolebinding
检查role,寻找有get或list权限的role
kubectl -n gorilla describe role
通过上面的一系列操作,检查发现,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-***
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
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
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
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
找出Liveness probe问题的Pod。
kubectl get pods-A
kubectl describe pod probe-demo-n probe-ns|tail
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
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 是就绪探测
编辑 deployment probe-http
kubectl edit deployment probe-http
检查
kubectl get pod
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
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
检查
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
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
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
kubectl -n ckad00018 get networkpolicy access-db -o yaml
kubectl -n ckad00018 get pod --show-labels
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
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
说明:
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
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
经过分析检查,会发现没有service,所以需创建service,而service需要的内容部分来自ingress和deployment里的字段。
查看ingress,记下service的name和port的number。
kubectl -n ingress-kk get ingress -o yaml
查看deployment,记下ports的containerPort
kubectl -n ingress-kk get deployments -o yaml
创建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 地址>
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。
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
……
kubectl apply -f poller.yaml
检查
kubectl get pod poller -n default
kubectl get svc -n default
curl 10.98.61.231:9090
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
通过查出来的 pod,去编辑它的 deployment。
kubectl edit deployment deploy-nk8s -n default
修改 image:为正确的镜像,比如改为 image: nginx
再次检查
kubectl get pods -n default
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
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
从 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
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
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
发布者:LJH,转发请注明出处:https://www.ljh.cool/33682.html