CKS认证-容器运⾏时类 (Runtime Class)

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创建的。
image.png
所以我们需要修改的是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中 **
image.png
通过名字可以看出web01 这三个Pod是由deploy web01管理的, 所以要修改deployment web01
1 kubectl edit deploy -n client web01
image.png
修改位置在 **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
image.png
#或者get deployment -o yaml, 不要⽤describe deployment检查不到结果
kubectl get deployments.apps -n client web01 -oyaml | grep untrusted
image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值