K8S CKA 1.29 题库 考试环境+模拟环境
微信: kc123123v
题库
题库一共17道题,题目难度都不大,在题库中,context和task是描述信息和任务,每一题都配置了官网的文档。
关键词的使用方法: 在考试的时候只能访问官网查资料,考试是类似于远程桌面,在远程桌面的浏览器访问官网,不能做书签和收藏,所以需要掌握如何查询每道题的官方文档。在给你的关键词中,是让你在官网去搜索用的,考试的时候建议这样用,因为每个题目的链接你下来,用关键词可事半功倍。根据截图去搜索就行。
1、基于角色的访问控制-RBAC
Context:
为部署流水线创建一个新的ClusterRole并将其绑定到范围为特定的 namespace 的特定ServiceAccount。
Tasks:
创建一个名为deployment-clusterrole的clusterrole,该clusterrole只允许对Deployment、Daemonset、Statefulset具有create权限,在现有的 namespace app-team1中创建一个名为cicd-token的新 ServiceAccount。
限于 namespace app-team1中,将新的ClusterRole deployment-clusterrole绑定到新的 ServiceAccount cicd-token。
关键词:RBAC
考试环境:
[student@node-1]$ kubectl config use-context k8s # 设置配置环境,模拟环境不用
[student@node-1]$ kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
[student@node-1]$ kubectl create serviceaccount cicd-token -n app-team1
[student@node-1]$ kubectl create rolebinding cicd-token-rolebinding -n app-team1 --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
[student@node-1] $ kubectl describe rolebinding cicd-token-rolebinding -n app-team1 # 检查
模拟环境:
root@master:~# kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
root@master:~# kubectl create serviceaccount cicd-token -n app-team1
root@master:~# kubectl create rolebinding cicd-token-rolebinding -n app-team1 --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
root@master:~# kubectl describe rolebinding cicd-token-rolebinding -n app-team1 # 检查
2、节点维护-指定node节点不可用
Tasks:
Set the node named ek8s-node-1 as unavailable and reschedule all the pods running on it .
翻译:
Tasks:
将ek8s-node-1节点设置为不可用,然后重新调度该节点上的所有Pod.
关键词:drain node
考试环境:
[student@node-1] $ kubectl config use-context ek8s
[student@node-1] $ kubectl cordon ek8s-node-1 #设置节点是不可调度状态
[student@node-1] $ kubectl drain ek8s-node-1 --delete-emptydir-data --ignore-daemonsets --force
模拟环境:
root@master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 5h55m v1.29.0
node Ready <none> 5h53m v1.29.0
root@master:~# kubectl cordon node
node/node cordoned
root@master:~# kubectl drain node --delete-emptydir-data --ignore-daemonsets --force
3、k8s版本升级
现有的Kebernetes集群正在运行的版本1.29.0。仅将master节点上的所有Kubernetes控制平面和节点组件升级到版本1.29.1。
(注意,考试时,有的考生是1.29.0升级到1.29.1,有的考生是1.30.0升级到1.30.1,具体升级的版本要注意,根据题目要求更改)
确保升级之前drain master节点,并在升级后uncirdon master节点
可以使用一下命令,通过ssh连接到master节点。
ssh master01
可以使用一下命令,在该master节点上获取更高权限:
sudo -i
另外在主节点上升级kubelet和kubectl。
请不要升级工作节点,etcd,container管理器,CNI插件,DNS服务或任何其他插件。
[student@node-1] $kubectl config use-context mk8s
[student@node-1] $ kubectl get nodes
# cordon 停止调度,将node调为SchedulingDisabled。新pod不会被调度到该node,但在该node的旧pod不受影响。
# drain 驱逐节点。首先,驱逐该node上的pod,并在其他节点重新创建。接着,将节点调为 SchedulingDisabled。
[student@node-1] $ kubectl cordon master01
[student@node-1] $ kubectl drain master01 --delete-emptydir-data --ignore-daemonsets --force
# ssh到master节点,并切换到root下
[student@node-1] $ ssh master01
[student@master01] $ sudo -i
[root@master01] # apt-cache show kubeadm|grep 1.29.1
[root@master01] # apt-mark hold kubeadm # 解锁
[root@master01] # apt-get update
[root@master01] # apt-get install -y kubeadm=\1.29.1-1.1'
# 验证升级计划
[root@master01] # apt-mark hold kubeadm # 锁定kubeadm 自动升级
[root@master01] #kubeadm upgrade plan
# 排除etcd,升级其他的,提示时,输入y。
[root@master01] # kubeadm upgrade apply v1.29.1 --etcd-upgrade=false # 输入Y
[root@master01] # systemctl restart kubelet
[root@master01] # kubeadm version
# 升级kubelet
[root@master01] # apt-mark unhold kubelet kubectl
[root@master01] #apt-get install -y kubelet=1.29.1-1.1
[root@master01] # kubelet --version
# 升级kubectl
[root@master01] #apt-get install kubectl=1.29.1-1.1
[root@master01] #kubectl version
# 退出root,退回到student@master01
[root@master01] # exit
# 退出master01,退回到student@node-1
[student@master01] $ exit
# 不要输入exit多了,否则会退出考试环境的。
#恢复master01调度
[student@node-1] $ kubectl uncordon master01
[student@node-1] $ kubectl get node
模拟环境:
kubectl version
kubelet --version
kubeadm version
kubectl get nodes
# master节点上设置
kubectl cordon master
kubectl drain master --delete-emptydir-data --ignore-daemonsets --force
apt-cache show kubeadm | grep 1.29.1 # 如果执行这个没有结果的话 先执行后面三条命令
# apt-mark unhold kubeadm apt-get update apt-get install -y kubeadm='1.29.1-1.1'
# 考试的时候已经有了
apt-mark unhold kubeadm # 允许升级kubeadm
apt-get update
apt-get install -y kubeadm='1.29.1-1.1' # 下载的时候需要多等一下,考试的时候下载会很快
apt-mark hold kubeadm # 锁定
kubeadm upgrade plan # 验证升级计划
kubeadm upgrade apply v1.29.1 --etcd-upgrade=false # 交互式页面输入Y
systemctl restart kubelet
kubeadm version # 至此kubeadm升级完成
# 升级kubeket 和kubectl
apt-mark unhold kubelet kubectl
apt-get install -y kubelet='1.29.1-1.1'
kubelet --version
systemctl restart kubelet
apt-get install -y kubectl='1.29.1-1.1'
kubectl version
root@master:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready,SchedulingDisabled control-plane 45d v1.29.1
node Ready <none> 45d v1.29.0
kubectl uncordon master
4、ETCD数据库备份恢复
Task:
首先,为运行在https://127.0.0.1:2379上的现有 etcd 实例创建快照并将快照保存到 /srv/data/etcd-snapshot.db文件
为给定实例创建快照预计能在几秒钟内完成。 如果该操作似乎挂起,则命令可能有问题。用 CTRL + C 来取消操作,然后重试。
然后还原位于/var/lib/backup/etcd-snapshot-previous.db的现有先前快照。
提供了以下TLS证书和密钥,以通过etcdctl连接到服务器。
CA 证书: /opt/KUIN00601/ca.crt
客户端证书: /opt/KUIN00601/etcd-client.crt
客户端密钥: /opt/KUIN00601/etcd-client.key
考试环境:
# 确认一下ssh终端,是在[student@node-1] $ 下
# 备份:
# 如果不使用export ETCDCTL_API=3,而使用ETCDCTL_API=3,则下面每条etcdctl命令前都要加ETCDCTL_API=3。
# 如果执行时,提示permission denied,则是权限不够,命令最前面加sudo即可。
student@node-1:~$ export ETCDCTL_API=3
student@node-1:~$ sudo ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379" --cacert=/opt/KUIN000601/ca.crt --cert=/opt/KUIN000601/etcd-client.crt --key=/opt/KUIN000601/etcd-client.key snapshot save /srv/data/etcd-snapshot.db
# 还原:
student@node-1:~$ sudo export ETCDCTL_API=3
student@node-1:~$ sudo etcdctl --endpoints="https://127.0.0.1:2379" --cacert=/opt/KUIN000601/ca.crt --cert=/opt/KUIN000601/etcd-client.crt --key=/opt/KUIN000601/etcd-client.key snapshot restore /var/lib/backup/etcd-snapshot-previous.db
模拟环境:
sudo ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379" --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save /srv/data/etcd-snapshot.db
cd /srv/data/
sudo ETCDCTL_API=3 etcdctl --endpoints="https://127.0.0.1:2379" --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot restore /var/lib/backup/etcd-snapshot-previous.db
5、网络策略
Task:
在现有的namespace my-app 中创建一个名为allow-port-from-namespace 的新Networkpolicy。
确保新的NetworkPolicy允许namespace echo 中的pods 连接到namespace my-app 中的Pods的9000端口。
进一步确保新的NetworkPolicy:
● 不允许对没有在监听端口9000的Pods的访问
● 不允许非来自namespace echo 中的Pods的访问
考试环境:
[student@node-1] $ kubectl config use-context hk8s
# 查看所有ns的标签label
# 如果访问者的namespace没有标签label,则需要手动打一个。考试的时候这个标签都是打好的
[student@node-1] $ kubectl get ns --show-labels
[student@node-1] $ kubectl label ns echo project=echo # 加入需要打标签就用这个命令
[student@node-1] $ vim networkpolicy.yaml # 编写yaml文件 内容如下
[student@node-1] $ kubectl apply -f networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: my-app
spec:
podSelector:
matchLabels: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: echo
ports:
- protocol: TCP
port: 9000
模拟环境:
root@master:~# vim networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: my-app
spec:
podSelector:
matchLabels: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
project: echo
ports:
- protocol: TCP
port: 9000
root@master:~# kubectl apply -f networkpolicy.yaml
root@master:~# kubectl get NetworkPolicy -n my-app
NAME POD-SELECTOR AGE
allow-port-from-namespace <none> 30s
6、Service四层代理
Task:
重新配置一个已经存在的front-end的deployment,在名字为nginx的容器里面添加一个端口配置,名字为http,暴露端口号为80,然后创建一个service,名字为front-end-svc,暴露该deployment的http端口,并且service的类型为NodePort。
模拟环境:
[student@node-1] $kubectl config use-context k8s
[student@node-1] $kubectl get deploy front-end
[student@node-1] $kubectl edit deploy front-end
# 参考官方文档,按照需要edit deployment,添加端口信息
# 找到name为nginx的容器,在后面添加如下信息
[student@node-1] $ kubectl expose deploy front-end --name=front-end-svc --port=80 --target-port=http --type=NodePort
[student@node-1] $ kubectl describe svc front-end-svc # 验证
模拟环境:
root@master:~# kubectl get deploy front-end
NAME READY UP-TO-DATE AVAILABLE AGE
front-end 1/1 1 1 4m17s
root@master:~# kubectl edit deploy front-end
root@master:~# kubectl expose deploy front-end --name=front-end-svc --port=80 --target-port=http --type=NodePort
root@master:~# kubectl describe svc front-end-svc # 验证
7、Ingress七层代理
Task:
如下创建一个新的nginx Ingress资源:
名称: pong
Namespace: ing-internal
使用服务端口 5678在路径 /hello 上公开服务 hello
可以使用以下命令检查服务 hello的可用性,该命令应返回 hello:
curl -kL <INTERNAL_IP>/hello
模拟环境没有创建service不用管,curl能够出来503就行 考试环境已经创建。
考试环境:
# 做题之前看清楚题目有没有叫切换集群
[student@node-1] $ vim ingressclass.yaml #参考官网内容编写class类的yaml文件
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
name: nginx-example
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
namespace: ing-internal # 添加名称空间
spec:
controller: k8s.io/ingress-nginx
[student@node-1] $ vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
# 验证
[student@node-1] $ kubectl get ingress -n ing-internal
NAME CLASS HOSTS ADDRESS PORTS AGE
pong nginx-example * 192.168.40.201 80 78s
[student@node-1] $ curl -kL 192.168.40.201/hello
模拟环境:
[student@node-1] $ vim ingressclass.yaml #参考官网内容编写class类的yaml文件
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
labels:
app.kubernetes.io/component: controller
name: nginx-example
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
namespace: ing-internal # 添加名称空间
spec:
controller: k8s.io/ingress-nginx
[student@node-1] $ vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx-example
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
[root@master] # kubectl apply -f ingressclass.yaml
[root@master] # kubectl apply -f ingress.yaml
[root@master] # kubectl get ingress -n ing-internal
NAME CLASS HOSTS ADDRESS PORTS AGE
pong nginx-example * 192.168.40.201 80 78s
[root@master] # curl -kL 192.168.40.201/hello
8、Deployment管理pod的扩缩容
Task:
将loadbalancer的deployment管理的Pod的副本数扩容成6个
考试环境:
[student@node-1] $ kubectl config use-context k8s
[student@node-1] $ kubectl get deployment loadbalancer
NAME READY UP-TO-DATE AVAILABLE AGE
loadbalancer 3/3 3 3 56s
[student@node-1] $ kubectl scale --replicas=6 deployment loadbalancer
[student@node-1] $ kubectl get deployment loadbalancer
NAME READY UP-TO-DATE AVAILABLE AGE
loadbalancer 6/6 6 6 56s
模拟环境:
root@master:~# kubectl get deployment loadbalancer
NAME READY UP-TO-DATE AVAILABLE AGE
loadbalancer 3/3 3 3 3m1s
root@master:~# kubectl scale --replicas=6 deployment loadbalancer
root@master:~# kubectl get deployment loadbalancer
NAME READY UP-TO-DATE AVAILABLE AGE
loadbalancer 6/6 6 6 3m39s
9、Pod指定节点调度
Task:
创建一个Pod,名字为nginx-kusc00401,镜像地址是nginx,调度到具有disk=spinning标签的节点上 。
考试环境:
[student@node-1] $ kubectl config use-context k8s
[student@node-1] $ kubectl get nodes --show-labels # 查看带有disk=spinning的节点
[student@node-1] $ vim pod-ns.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
labels:
role: nginx-kusc00401
spec:
nodeSelector:
disk: spinning
containers:
- name: nginx
image: nginx
[student@node-1] $ kubectl apply -f pod-ns.yaml
[student@node-1] $kubectl describe pods nginx | grep Node # 验证
Node: node/192.168.40.201
Node-Selectors: disk=spinning
模拟环境:
[root@master] # kubectl get nodes --show-labels | grep disk # 查看带有disk=spinning的节点
[root@master] # vim pod-ns.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: docker.io/library/nginx:1.9.1 # 模拟环境用的是这个镜像,考试的时候用题目给的nginx
nodeSelector:
disk: spinning
root@master:~# kubectl apply -f pod-ns.yaml
root@master:~# kubectl describe pods nginx | grep Node
Node: node/192.168.40.201
Node-Selectors: disk=spinning
10、检查Ready节点数量
Task:
检查集群中有多少节点为Ready状态(不包括被打上 Taint:NoSchedule 的节点),之后将数量写到/opt/KUSC00402/kusc00402.txt
考试环境:
[student@node-1] $ kubectl config use-context k8s
[student@node-1 ~]# kubectl get nodes |grep -w "Ready"
[student@node-1] $ kubectl get nodes |grep -w "Ready" |wc -l
# 得到的结果是2
[root@node-1 ~]# kubectl describe nodes master node-1 | grep Taint |grep NoSchedule |wc -l
# 得到的结果是1 kubectl describe nodes 后面跟的是节点的节点的名称,通过kubectl get nodes |grep -w "Ready" 得到的节点名称
# 上面两个结果相减2-1=1
[student@node-1] $ echo “1” > /opt/KUSC00402/kusc00402.txt
模拟环境:
11、Pod封装多个容器
Task:
创建一个Pod,名字为kucc1,这个Pod包含4容器,为nginx、redis、memcached、consul
考试环境:
[student@node-1] $ kubectl config use-context k8s
[student@node-1] $ vim pod-kucc.yaml
apiVersion: v1
kind: Pod
metadata:
name: kucc1
spec:
containers:
- name: nginx
image: nginx
- name: redis
image: redis
- name: memcached
image: memcached
- name: consul
image: consul
[student@node-1] $ kubectl apply -f pod-kucc.yaml
[student@node-1] $ kubectl get pods
模拟环境:
root@master:~# vim pod-kucc.yaml
apiVersion: v1
kind: Pod
metadata:
name: kucc1
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent #模拟环境加上这参数的意思是用本地的镜像,考试的时候不用加
- name: redis
image: redis
imagePullPolicy: IfNotPresent #模拟环境加上这参数的意思是用本地的镜像,考试的时候不用加
- name: memcached
image: memcached
imagePullPolicy: IfNotPresent #模拟环境加上这参数的意思是用本地的镜像,考试的时候不用加
- name: consul
image: consul
imagePullPolicy: IfNotPresent #模拟环境加上这参数的意思是用本地的镜像,考试的时候不用加
root@master:~# kubectl apply -f pod-kucc.yaml
root@master:~# kubectl get pods
12、PV
task:
创建一个pv,名字为app-config,大小为2Gi,访问权限为ReadWriteMany。Volume的类型为hostPath,路径为/srv/app-config
考试环境:
[student@node-1] $ kubectl config use-context hk8s
[student@node-1] $ vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/srv/app-config"
[student@node-1] $ kubecl apply -f pv.yaml
[student@node-1] $ kubectl get pv
模拟环境:
root@master:~# vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/srv/app-config"
root@master:~# kubecl apply -f pv.yaml
root@master:~# kubectl get pv
13、PVC
Task:
创建一个名字为pv-volume的pvc,指定storageClass为csi-hostpath-sc,大小为10Mi
然后创建一个Pod,名字为web-server,镜像为nginx,并且挂载该PVC至/usr/share/nginx/html,挂载的权限为ReadWriteOnce。之后通过kubectl edit或者kubectl path将pvc改成70Mi,并且记录修改记录。
考试环境:
[student@node-1] $ kubectl config use-context ok8s
[student@node-1] $ vim pvc.yaml
[student@node-1] $ vim pvc-pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: csi-hostpath-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
volumes:
- name: pv-volume
persistentVolumeClaim:
claimName: pv-volume
containers:
- name: nginx
image: nginx
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pv-volume
[student@node-1] $kubectl apply -f pvc.yaml
[student@node-1] $kubectl apply -f pvc-pod.yaml
[student@node-1] $kubectl edit pvc pv-volume --record
模拟环境:
root@master:~# vim pvc.yaml
root@master:~# vim pvc-pod.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: csi-hostpath-sc
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
volumes:
- name: pv-volume
persistentVolumeClaim:
claimName: pv-volume
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent # 镜像拉取策略
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pv-volume
root@master:~# kubectl apply -f pvc.yaml
root@master:~# kubectl apply -f pvc-pod.yaml
root@master:~# kubectl get pvc
root@master:~# kubectl edit pvc pv-volume --record
14、查看Pod日志
考试环境:
[student@node-1] $ kubectl config use-context k8s
[student@node-1] $ kubectl logs foobar | grep unable-to-access-website > /opt/KUTR00101/foobar
模拟环境:
root@master:~# kubectl logs foobar | grep unable-to-access-website > /opt/KUTR00101/foobar
15、sidecar代理
Context:
将一个现有的 Pod 集成到 Kubernetes 的内置日志记录体系结构中(例如 kubectl logs)。
添加 streaming sidecar 容器是实现此要求的一种好方法。
Task:
使用busybox Image来将名为sidecar的sidecar容器添加到现有的Pod legacy-app上,新的sidecar容器必须运行以下命令:
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log
使用volume挂载/var/log/目录,确保sidecar能访问/var/log/legacy-app.log文件
[student@node-1] $ kubectl config use-context k8s
# 首先将legacy-app的Pod的yaml导出,大致如下:
[student@node-1] $ kubectl get po legacy-app -oyaml > c-sidecar.yaml
# 再此yaml中添加sidecar和volume
[student@node-1] $ vim c-sidecar.yaml
# 标注出来的地方认真检查,需要执行的是什么命令,log日志的位置,卷是否正常挂载
# 做完上面的步骤后保存退出
[student@node-1] $ kubectl delete -f c-sidecar.yaml
[student@node-1] $ kubectl delete -f c-sidecar.yaml --grace-period=0 --force --wait=false # 如果删除比较慢 可以加参数强制删除 一般来说需要加上
[student@node-1] $ kubectl apply -f c-sidecar.yaml
[student@node-1] $ kubectl logs legacy-app -c sidecar # 能看到内容而不是报错,考试的时候不一定是下面的内容
Mon Jun 17 11:54:34 UTC 2024 INFO 0
Mon Jun 17 11:54:35 UTC 2024 INFO 1
Mon Jun 17 11:54:36 UTC 2024 INFO 2
Mon Jun 17 11:54:37 UTC 2024 INFO 3
Mon Jun 17 11:54:38 UTC 2024 INFO 4
Mon Jun 17 11:54:39 UTC 2024 INFO 5
Mon Jun 17 11:54:40 UTC 2024 INFO 6
Mon Jun 17 11:54:41 UTC 2024 INFO 7
Mon Jun 17 11:54:42 UTC 2024 INFO 8
Mon Jun 17 11:54:43 UTC 2024 INFO 9
Mon Jun 17 11:54:44 UTC 2024 INFO 10
模拟环境:
root@master:~# kubectl get pods | grep legacy-app
legacy-app 2/2 Running 0 5m43s
root@master:~# kubectl get po legacy-app -oyaml > c-sidecar.yaml
root@master:~# vim c-sidecar.yaml
# 标注出来的地方认真检查,需要执行的是什么命令,log日志的位置,卷是否正常挂载
root@master:~# $ kubectl delete -f c-sidecar.yaml --grace-period=0 --force --wait=false # 强制删除
root@master:~# $ kubectl apply -f c-sidecar.yaml
root@master:~# kubectl logs legacy-app -c sidecar
16、查看Pod CPU
Task:
找出标签是name=cpu-user的Pod,并过滤出使用CPU最高的Pod,然后把它的名字写在已经存在的/opt/KUTR00401/KUTR00401.txt文件里(注意他没有说指定namespace。所以需要使用-A指定所以namespace)
考试环境:
[student@node-1] $ kubectl config use-context k8s
[student@node-1] $ kubectl top pod -l name=cpu-loader --sort-by=cpu -A
# 将cpu占用最多的pod的name写入/opt/KUTR00401/KUTR00401.txt文件
[student@node-1] $ echo "查出来的Pod Name" > /opt/KUTR00401/KUTR00401.txt
模拟环境:
root@master:~# kubectl top pods -l name=cpu-loader --sort-by=cpu -A
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-public cpu-loader-pod 2m 13Mi
default nginx-cpu-loader-dep-7c97958cb-gr2ch 0m 4Mi
default nginx-cpu-loader-dep-7c97958cb-kvw4f 0m 4Mi
default nginx-cpu-loader-dep-7c97958cb-zfv66 0m 3Mi
root@master:~# echo "cpu-loader-pod" > /opt/KUTR00401/KUTR00401.txt
root@master:~# cat /opt/KUTR00401/KUTR00401.txt
cpu-loader-pod
17、集群故障排查-kubelet故障
Task:
一个名为wk8s-node-0的节点状态为NotReady,让其恢复至正常状态,并确认所有的更改开机自动完成。
可以使用以下命令,通过ssh连接到wk8s-node-0节点:
ssh wk8s-node-0
可以使用以下命令,在该节点上获取更高权限:
sudo -i
[student@node-1] $ kubectl config use-context wk8s
[student@node-1] $ ssh wk8s-node-0
[student@wk8s-node-0] $ sudo -i
[root@wk8s-node-0] # systemctl status kubelet
[root@wk8s-node-0] # systemctl enable kubelet
[root@wk8s-node-0] # systemctl restart kubelet
[root@wk8s-node-0] # exit
[student@wk8s-node-0] $ exit
[student@node-1] $ # 退回到stuentd@node-1 不要多退出会退出考试环境
root@master:~# systemctl status kubelet # 模拟环境Kubelet不是活跃的
root@master:~# systemctl enable kubelet
root@master:~# systemctl restart kubelet