1. 容器运⾏时类 (Runtime Class)
问题:
Context
该 cluster 使用 containerd 作为 CRI运行时containerd 的默认运行时处理程序是 runc 。containerd 已准备好支持额外的运行时①处理程序runsc(gVisor)
Task
使用②名为 runsc 的现有运行时处理程序,创建一个名为 untrusted 的 Runtimeclass.
③更新 namespace client 中的所有 Pod 以在gVisor 上运行。
:::info
你可以在/home/candidate/KSMV00301/runtime-class.yaml找到一个模板清单文件。
:::
正确答案:
注意:
本题一定要认真审题,刚开始没认真看题做错了。
① 处理程序runsc(gVisor),这里是告诉你环境已经配置了runsc这个程序,runsc这个程序能运行gVisor。而不是让你直接创建这个gVisor。所以一定要注意考题给出来的内容
②名为 runsc:这个位置人家会告诉你运行什么处理器。就按照这个位置给出来的关键词创建。
③③更新 namespace client 中的所有 Pod 以在gVisor 上运行:你需要把这个名称空间下面的所有pod都更新成runsc(gVisor)
1 apiVersion: node.k8s.io/v1
2 kind: RuntimeClass
3 metadata:
4 name: untrusted
5 namespace: client
6 handler: gvisor ##这么写是错的,pod不会识别这个处理程序。
一、创建一个名为 untrusted 的 Runtimeclass
root@hk8s-master01:/home/candidate/KSMV00301# vim runtime-class.yaml
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: untrusted
handler: runsc
##创建runsc
root@hk8s-master01:/home/candidate/KSMV00301# kubectl apply -f runtime-class.yaml
runtimeclass.node.k8s.io/untrusted created
##检查是否已经创建出runsc
root@hk8s-master01:/home/candidate/KSMV00301# kubectl get runtimeclasses.node.k8s.io
NAME HANDLER AGE
untrusted runsc 13m
二、更新 namespace client 中的所有 Pod 以在gVisor 上运行
注意:
直接使用edit编辑demoapp会报错,你需要先删除pod,然后再创建pod。
##先查看这个名称空间下面有哪些pod
root@hk8s-master01:/home/candidate/KSMV00301# kubectl get pods -n client
NAME READY STATUS RESTARTS AGE
demoapp 1/1 Running 1 (6h2m ago) 418d
web01-6dbf7c599-62jfm 1/1 Running 5 (6h2m ago) 418d
web01-6dbf7c599-hnmnd 1/1 Running 1 (6h2m ago) 418d
web01-6dbf7c599-xbl92 1/1 Running 5 (6h2m ago) 418d
##删除demoapp
root@hk8s-master01:/home/candidate/KSMV00301# kubectl delete pods -n client demoapp
pod "demoapp" deleted
##保存配置文件,修改Pod demoapp,只保留最重要的部分即可
root@hk8s-master01:/# kubectl get pods -n client demoapp -o yaml > 1.yaml
root@hk8s-master01:/home/candidate/KSMV00301# vim 1.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demoapp
name: demoapp
namespace: client
spec:
runtimeClassName: untrusted ##增加这⼀⾏,指定runtimeClass为untrusted
containers:
- image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
name: demoapp
##创建pod
root@hk8s-master01:/home/candidate/KSMV00301# kubectl apply -f 1.yaml
pod/demoapp created
##查看该pod是否已经运行
root@hk8s-master01:/home/candidate/KSMV00301# kubectl get pods -n client
NAME READY STATUS RESTARTS AGE
demoapp 1/1 Running 0 12s
web01-6dbf7c599-62jfm 1/1 Running 5 (6h28m ago) 418d
web01-6dbf7c599-hnmnd 1/1 Running 1 (6h29m ago) 418d
web01-6dbf7c599-xbl92 1/1 Running 5 (6h28m ago) 418d
root@hk8s-master01:/home/candidate/KSMV00301# kubectl describe pod -n client demoapp | grep Runtime
Runtime Class Name: untrusted
三、更新剩下是三个pod
注意:
如果要精简相关pod的yaml文件前,记得一定要备份
还有一个细节是剩下的3个Pod web(看题目你不会想到这3个pod是用deployment控制器创建出来的,你如果你按照修改demoapp的方式去修改的话,那么肯定是创建不出来pod的,虽然创建不会报错,但是没有相关的pod)。
那么这时候需要你细心再细心的观察了,是需要通过pod名字辨别出这3个web是由deployment创建的。因为deployment可以指定pod副本数。前面的字段都一样,只有后面的字段有区别,这是典型的deployment创建的。
所以我们需要修改的是deployment。而deployment和pod修改runtimeClassName这个字段的位置不一样。
##错误的配置文件
1 apiVersion: v1
2 kind: Pod
3 metadata:
4 labels:
5 app: web01
6 pod-template-hash: 6dbf7c599
7 name: web01-6dbf7c599-62jfm
8 namespace: client
9 ownerReferences: ##下面这几行得删除
10 - apiVersion: apps/v1
11 blockOwnerDeletion: true
12 controller: true
13 kind: ReplicaSet
14 name: web01-6dbf7c599
15 spec:
16 runtimeClassName: untrusted
17 containers:
18 - image: ikubernetes/demoapp:v1.0
19 imagePullPolicy: IfNotPresent
20 name: demoapp
##用上面错误的配置文件创建的话会导致报错,因为我多删除了一行uid。他报错说uid不能为空。
root@hk8s-master01:/home/candidate/KSMV00301# kubectl apply -f 1-web1.yaml
The Pod "web01-6dbf7c599-62jfm" is invalid: metadata.ownerReferences.uid: Invalid value: "": uid must not be empty
##精简pod内容
root@hk8s-master01:~# kubectl get -n client pods web01-6dbf7c599-62jfm -o yaml > web1.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
app: web01
pod-template-hash: 6dbf7c599
name: web01-6dbf7c599-62jfm
namespace: client
spec:
runtimeClassName: untrusted
containers:
- image: ikubernetes/demoapp:v1.0
imagePullPolicy: IfNotPresent
name: demoapp
##创建pod
root@hk8s-master01:/home/candidate/KSMV00301# kubectl apply -f 1-web1.yaml
pod/web01-6dbf7c599-62jfm created
##检查pod是否已经运行
root@hk8s-master01:~# kubectl get pods -n client
NAME READY STATUS RESTARTS AGE
demoapp 1/1 Running 0 20m
web01-6dbf7c599-bvrh2 1/1 Running 0 10m
web01-6dbf7c599-hnmnd 1/1 Running 1 (6h49m ago) 418d
web01-6dbf7c599-xbl92 1/1 Running 5 (6h49m ago) 418d
##查看deployment创建的pod
root@hk8s-master01:/home/candidate/KSMV00301# kubectl get deployments.apps -n client
NAME READY UP-TO-DATE AVAILABLE AGE
web01 3/3 3 3 418d
##把这个文件先备份
root@hk8s-master01:/home/candidate/KSMV00301# kubectl get deployments.apps -n client -o yaml > 1-web.yaml
##编辑文件,先备份先备份先备份或者不删,不用备份,也可以创建
root@hk8s-master01:/home/candidate/KSMV00301# vim 1-web.yaml
1 apiVersion: v1
2 items:
3 - apiVersion: apps/v1
4 kind: Deployment
5 metadata:
10 labels:
11 app: web01
12 name: web01
13 namespace: client
16 spec:
17 progressDeadlineSeconds: 600
18 replicas: 3
19 revisionHistoryLimit: 10
20 selector:
21 matchLabels:
22 app: web01
23 strategy:
24 rollingUpdate:
25 maxSurge: 25%
26 maxUnavailable: 25%
27 type: RollingUpdate
28 template:
29 metadata:
30 creationTimestamp: null
31 labels:
32 app: web01
33 spec:
34 runtimeClassName: untrusted
35 containers:
36 - image: ikubernetes/demoapp:v1.0
37 imagePullPolicy: IfNotPresent
38 name: demoapp
##删除文件deployment下面的web01
root@hk8s-master01:/home/candidate/KSMV00301# kubectl delete deployments.apps -n client web01
deployment.apps "web01" deleted
##创建pod
root@hk8s-master01:/home/candidate/KSMV00301# kubectl apply -f 1-web.yaml -n client deployment.apps/web01 created
##检查pod是否正常运行
root@hk8s-master01:/home/candidate/KSMV00301# kubectl get pods -n client
NAME READY STATUS RESTARTS AGE
demoapp 1/1 Running 0 16h
web01-9744c56d8-69wmx 1/1 Running 0 8s
web01-9744c56d8-dhjf9 1/1 Running 0 8s
web01-9744c56d8-xmlf4 1/1 Running 0 8s
##查询每个pod的是否有这个参数
root@hk8s-master01:/home/candidate/KSMV00301# kubectl describe -n client pods web01-9744c56d8-dhjf9 | grep Runtime
Runtime Class Name: untrusted
root@hk8s-master01:/home/candidate/KSMV00301# kubectl describe -n client pods web01-9744c56d8-xmlf4 | grep Runtime
Runtime Class Name: untrusted
重点重点重点
本题有⼀个细微的变化,即需要修改的 Pod 并⾮直接创建,⽽是通过 Deployment 创 建,所 以在指定 RuntimeClass 的时候,更改的位置和 Pod 不太⼀样。
**在Deployment中 **
通过名字可以看出web01 这三个Pod是由deploy web01管理的, 所以要修改deployment web01
1 kubectl edit deploy -n client web01
修改位置在 **spec.template.spec **下, 添加runtimeClassName配置。
检查:
#需要检查deployment⾥⾯的pod
kubectl describe -n client pod web01-6d4c796d78-wjswd | grep untrusted
kubectl get -n client pod web01-6d4c796d78-wjswd -oyaml | grep untrusted
#或者get deployment -o yaml, 不要⽤describe deployment检查不到结果
kubectl get deployments.apps -n client web01 -oyaml | grep untrusted