CKA真题(考题总结)
文章目录
- CKA真题(考题总结)
- 证书
- 个人考试总结
- 申诉结果
- CKA题目参考博主
- 重点介绍
- CKA模拟题库
- 注意事项
- CKA题目答案
- 设置自动补全
- 方法一
- 方法二
- 第⼀题:权限控制RBAC
- 考试原题
- image-20230306212454610
- 参考链接官网
- 题解
- 个人理解
- 考试
- 练习环境
- 第⼆题:节点维护,设置节点不可⽤
- 原题
- 参考链接官网
- 题解
- **第三题:升级 节点kubeadm**
- 原题
- 参考官网链接
- 题解
- 考试
- 练习
- 另一版本
- 第四题:备份还原 etcd
- 原题
- 参考网页
- 解题
- 答题技巧
- **第五题 网络策略**
- 原题
- 参考
- 题解
- 另一个版本
- 检查
- 第六题SVC 暴露应用(强制记忆)
- 原题
- 参考
- 题解
- 答题技巧
- 第七题Ingress创建(拷贝yaml)📍(注意yaml位置)
- 原题
- 参考
- 题解
- 答题技巧
- 官方yaml代码需要修改的地方
- 另一版本
- 第八题-扩容 deployment 副本数量(强制记忆,`送分题`)
- 原题
- 参考链接
- 题解
- 可以先检查下pod数量
- 第九题-调度 pod 到指定节点(强制记忆,`送分题`)
- 原题
- 参考
- 题解
- 答题技巧
- 另一版本
- 第10题-查看可用节点数量(强制记忆,`送分题`)
- 原题
- 参考链接
- 题解
- 答题技巧
- 另一版本
- 第11题-创建多容器的 pod(强制记忆,`送分题`)
- 原题
- 参考
- 题解
- 另一版本
- 第12题-创建 PV(拷贝yaml)📍(注意yaml位置)
- 原题
- 参考
- 题解
- 答题技巧
- 另一版本
- 第13题 创建PVC(拷贝yaml)📍(注意yaml位置)pvc 的创建 class 属性的使用,–record 记录变更
- 原题
- 参考
- 题解
- 解题技巧
- 另一版本
- 第14题 获取 Pod 错误日志(强制记忆,`送分题`)
- 原题
- 参考
- 题解
- 答题技巧
- 第15题-使用 sidecar 代理容器日志(边车)(强制记忆)要注意下
- 原题
- 参考
- 题解
- 解题yaml:
- 答题技巧
- 另一版本
- 16-统计使用 CPU 最高的 Pod(强制记忆,`送分题`)
- 原题
- 参考链接
- 题解
- 答题技巧
- 第17题-节点NotReady处理
- 排查集群中故障节点(强制记忆,`送分题`,一定要做完这道题,分值最高,最简单)
- 原题
- 参考链接
- 题解
- 答题技巧
- 原题
- 参考链接
- 题解
- 答题技巧
- 第17题-节点NotReady处理
- 排查集群中故障节点(强制记忆,`送分题`,一定要做完这道题,分值最高,最简单)
- 原题
- 参考链接
- 题解
- 答题技巧
证书
个人考试总结
我总结了一下今天考试的问题?
我是凌晨5点考试的,当时选择了一个VPN节点是美国 400ms,然后连接上去,进入psi浏览器,然后出现英文的界面,选择一些东西,客服也是英文老师,等到4.50出现的一个中文监考老师,让后检测各种考试环境,进入到考试界面,刚切换成中文,然后点击了一下终端就掉了,等了30分钟从新连接上去,显示已经完成考试,等待考试结果,这里进行申诉给官方,申诉邮箱不方便贴出来,大家可以私信找我拿。
第二次考试,准备也是早上5点,网络状态好用,不用开启VPN,上去正常考试
申诉结果
CKA题目参考博主
https://blog.csdn.net/april_4/article/details/123233845 #3月1日刚过
https://blog.csdn.net/qq_41847894/article/details/128477688?spm=1001.2014.3001.5506
#写的比较细一位小姐姐,带官网报名流程介绍
https://blog.51cto.com/u_14907428/4803641
#51cto博主写的,还可以
https://blog.csdn.net/weixin_72758284/article/details/128142352?spm=1001.2014.3001.5501
#12月,题目稍微不一样
https://blog.51cto.com/u_15966109/category3.html
#51cto博主写的6-10题,还有模拟题库
https://blog.csdn.net/weixin_39246554/article/details/126874141?spm=1001.2014.3001.5506
#比较细可以参考,推荐
https://blog.csdn.net/qq_33680297/article/details/123074501 #带官网搜答案教程
重点介绍
https://www.yuque.com/wangzilong-4omf5/mid93s/rzizm8cq2gb2zn7r
#语雀CKA考题解析,做的很细很细,可以参考,带模拟题,还有小笔记
CKA模拟题库
https://blog.51cto.com/u_15966109/category3.html
注意事项
1. 12月份考试的时候kubectl已经可以Tab补全了,不需要背指令source <(kubectl completion bash).
2. 指令多用-h查询,答案不唯一,指令或yaml解出来都可以。
3. 题目中蓝色字在考试都会有所变动(我考试只变了1,2题参数,其他没变)。
4. 考试只允许访问官网查询,不能使用收藏网页,考试都是使用官网浏览器,浏览器会要求你关闭远程工具,虚拟机vm等进程(要我关闭进程显卡控制台???)
5. 注意切换集群。
考试概要
考试模式:线上考试
考试时间:2小时
题目数量:17题
分数:一般总分100分有时99、98,66分及格
题目说明:国内访问一般会自动切换中文
考试系统界面:
答题结束后,在Exam Controls里结束考试
考试注意事项:
1. yaml文件名字可以用01.yaml,02.yaml等对应相应题,方便排错。yaml文件里面必须使用空格来缩进
2. vim编辑yaml文件,如果粘贴官网yaml过来需要设置:set paste
3. 题目能复制就复制。
4. 考试环境会在节点node进行,如遇到权限不够加sudo。
CKA题目答案
设置自动补全
方法一
登陆管理节点
kubectl --help | grep bash,此步是为了找关键词completion
sudo vim /etc/profile
添加source <(kubectl completion bash)
file
5.保存退出,source /etc/profile
方法二
自动补全:echo "source <(kubectl completion bash)" >> ~/.bashrc; source ~/.bashrc
1. 12月份考试的时候kubectl已经可以Tab补全了,不需要背指令source <(kubectl completion bash).
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tC7vtScB-1682489659975)(C:\Users\艾克\AppData\Roaming\Typora\typora-user-images\image-20230306212043611.png)]
第⼀题:权限控制RBAC
考试原题
Task
创建一个名为deployment-clusterrole 且允许创建以下资源类型的新ClusterRole:
Deployment
StatefulSet
DaemonSet
在现有的namespace app-team1中创建一个名为cicd-token的新ServiceAccount
限于namespace app-team1,将新的ClusterRole deployment-clusterrole绑定到新的ServiceAccount cicd-token
参考链接官网
https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/#kubectl-create-clusterrole
https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/authentication-resources/service-account-v1/#create-%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA-serviceaccount
题解
个人理解
没必要参考网址,使用-h 帮助更方便。
kubectl create clusterrole -h
kubectl create serviceaccount -h
kubectl create rolebinding -h
考试
1、切换环境
kubectl config use-context kubernetes
2、配置
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets
kubectl create serviceaccount cicd-token -n app-team1
# 题目中写了“限于 namespace app-team1 中”,则创建 rolebinding。没有写的话,则创建 clusterrolebinding。
kubectl create rolebinding cicd-token-rolebinding --serviceaccount=app-team1:cicd-token --clusterrole=deployment-clusterrole -n app-team1
# rolebinding 后面的名字 cicd-token-rolebinding 随便起的,因为题目中没有要求,如果题目中有要求,就不能随便起了。
3、验证
#稍微验证下
kubectl describe rolebinding cicd-token-rolebinding -napp-team1
kubectl get serviceaccout -n 命名空间
练习环境
备注 命令空间会变,题目顺序也会变,我这里命令空间自己定义的cka
1、创建namespace
kubectl create namespace cka #考试里面已经有了
2、创建serviceaccount
kubectl create serviceaccount cicd-token -n cka
3、创建role或者clueterrole
kubectl create role deployment-role --verb=create,delete --resource=deployment,statefulset,saemonset -n cka
4、创建rolebinding或者clusterrolebinding
kubectl create rolebinding cicd-rolebinding --role=deployment-role --serviceaccount=cka:cicd-token -n cka
验证
kubectl auth can-i list pod --as system:serviceaccount:cka:cka-1202-sa -n cka
第⼆题:节点维护,设置节点不可⽤
考点:cordon 和 drain 命令的使用
原题
Task
将名为ek8s-node-1的node设置为不可用,并重新调度该node上所有运行的pods
参考链接官网
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/safely-drain-node/
题解
1、将节点设置为不可用
kubectl get node
kubectl cordon master01
2、重新调度节点上所有pod
**kubectl drain master01 --delete-emptydir-data --ignore-daemonsets --force
小技巧,不加参数,驱逐不成功,报错就显示要添加的参数了,如果还有报错就看后面提示,添加参数就可以了
.#先进入指定集群
kubectl drain ek8s-node-1 --ignore-daemonsets #设置不可调度并驱逐节点上pod
注:如果执行了drain提示错误,根据提示再加上选项,例如--delete-local-data --force
#检查
kubectl get pod -o wide
第三题:升级 节点kubeadm
原题
Task
设置配置环境:
kubectl config use-context mk8s
现有的Kubernetes集群正在运行版本1.20.0,仅将主节点上的所有Kubernetes控制平面和节点组件升级到版本1.20.1
确保在升级之前drain主节点,并在升级后uncordon主节点
可使用以下命令通过ssh连接到主节点:
ssh mk8s-master-0
可使用以下命令在该主节点上获取更高权限:
sudo -i
另外,在主节点上升级kubelet和kubectl。(不需要升级etcd)
参考官网链接
1.登陆官网k8s.io,可以右上角更换语言,点击Learn Kubernetes Basics
2.搜索upgrade
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
题解
考试
1、切换环境
kubectl config use-context mk8s
2、配置
#升级kueadm
kubectl drain mk8s-master-0 --ignore=daemonsets
ssh mk8s-master-0
sudo -i
apt install kubeadm=1.20.1-00 -y
kubeadm upgrade plan
#这里可以先查下的:apt-cache show|grep kubeadm
#kubeadm upgrade install v1.20.1 #。。。淦,这个写错了。。。。。。。是apply,并且要加上--ectd-ugrade=false。。。。。。题目要求不升级 etcd; 注意下这2个版本号写法的区别。。。。
kubeadm upgrade apply v1.20.1 --etcd-upgrade=false
#升级kubelt
apt install kubelet=1.20.1-00 kubectl=1.20.1-00 -y
systemctl restart kubelet #这里要重启下kubelt的,切记。。。
exit
exit
kubectl uncordon mk8s-master-0
3、验证
kubectl get node -owide
kubectl --version
kubelet --version
练习
文档主页-->任务-->管理集群-->用 kubeadm 进行管理-->升级 kubeadm 集群
1、驱逐节点上的pod
kubectl cordon master
kubectl drain master01 --ignore-daemonsets
2、查看现有版本和可升级的版本 #ubuntu操作系统
kubeadm version
apt-cache madison kubeadm|grep 1.22
3、升级kubeadm
apt-get install kubeadm=1.22.3-00 -y --allow-change-held-packages
kubeadm upgrade plan
sudo kubeadm upgrade apply v1.22.3 --etcd-upgrade=false 不升级etcd
4、升级kubelet和kubectl
apt-get install -y kubelet=1.22.3-00 kubectl=1.22.3-00 --allow-change-held-packages
sudo systemctl daemon-reload
sudo systemctl restart kubelet
5、配置节点可调度
kubectl uncordon k8s-master
- 答题技巧
03 升级 kubernetes 版本; 7分 简单;有链接但 强制记忆;
这个使用的是ubuntu操作系统;(唯一 一个需要用到ubuntu命令的考题;)
ubuntu使用sudo -i 切换root,使用apt-get安装软件包;
ununtu默认禁止root登录;
因此,考试时,只有升级kubernetes这一道题需要用到ubuntu系统,其他都不需要用到;
直接用sudo -i切换到root用户,再开始答题;(不需要输入密码)
注意:这里切换kubernetes集群后,直接使用`kubectl drain kubernetes-master-0 --ignore-daemonsets`命令进行配置,不需要先ssh到mkubernetes-master-0节点;(这个需要注意下)
确定要升级到哪个版本
使用操作系统的包管理器找到最新的稳定 1.21:
apt update
apt-cache policy kubeadm
# 在列表中查找最新的 1.21 版本
# 它看起来应该是 1.21.x-00,其中 x 是最新的补丁版本
#ubuntu和centos查看kubeadm最新版本的方法
apt-cache policy kubeadm #ubuntu查看方式
1.20.5-00
yum list --showduplicates kubeadm --disableexcludes=kubernetes #centos查看方式
1.21.2-0
#注意如下的2种格式:
ubuntu系统:1.20.5-00
centos系统:1.21.2-0
#注意:
ubuntu中apt install kubeadm=1.20.1-00 –y或者apt-get install kubeadm=1.20.1-00 –y都是可以的;(我们这里使用apt install方式)
另一版本
1
2
3
4
5
6
第四题:备份还原 etcd
原题
Task
首先,为运行在https://127.0.0.1:2379上的现有etcd实例创建快照并将快照保存到/data/backup/etcd-snapshot.db
为给定实例创建快照预计能在几秒钟内完成。如果该操作似乎挂起,则命令可能有问题。用ctrl+c来取消操作,然后重试。
然后还原位于/data/backup/etcd-snapshot-previous.db的现有先前快照。
提供了以下TLS证书和密钥,以通过etcdctl连接到服务器。
CA证书:/opt/KUIN00601/ca.crt
客户端证书:/opt/KUIN00601/etcd-client.crt
客户端密钥:/opt/KUIN00601/etcd-client.key
参考网页
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster
解题
⚠️ 如下2条命令很容易忘记呀,要多次记忆呀。。。。。(特别注意下这个题目。。。)
1、确定当前环境
kubectl get node
2、配置
#备份
ETCDCTL_API=3 etcdctl snapshot save /data/backup/etcd-snapshot.db --endpoints=https://127.0.0.1:2379 --cacert=xx --cert=xx --key=xx
#还原
sudo -i
systemctl stop etcd
systemctl cat etcd #。。。。。淦:注意这里是systemctl cat etcd
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak # 。。。。淦:注意这里是default.etcd
exit
ll /data/backup/etcd-snapshot-previous.db
sudo ETCDCTL_API=3 etcdctl restore /data/backup/etcd-snapshot-previous.db --data-dir=/var/lib/etcd/default.etcd
chown -R etcd:etcd /var/lib/etcd #淦。。。。注意,不要忘记了。。。。
syetmctl start etcd
注:执行备份命令如果提示没证书文件,exit 退回上一步操作
参考资料 : https://kubernetes.io/zh/docs/tasks/administer-cluster/configureupgrade-etcd/
验证
练习环境,把集群里面随便一个pod删除,恢复etcd的实话看看pod有没有恢复过来
crictl ps #查看容器
答题技巧
04 etcd 备份与恢复 ;7分 简单;有链接但 强制记忆;(此题可先搁置)!!!
#备份etcd
etcdctl snapshot save --cacert --cert --key
#恢复etcd
关闭etcd服务
确认etcd数据目录:systemctl cat etcd
etcdctl snapshot restore --data-dir
给权限: /var/lib/etcd
启动etcd
查看帮助,仔细检查证书目录,还有要复制的目录,练习环境集群跟考试不一样,但是操作命令都是一样的,改变的就是参数
1.安装etcd 这个命令进行备份,考试环境是安装好的
2.ETCDCTL_API=3 etcdctl -h #查看帮助,需要添加那些参数
恢复:这里需要给大家强调一下
1.这里恢复用的是已经存在的一个备份文件,而不是说我们之前备份的那个文件;
2.这里的etcd是二进制方式部署的,重启需要使用systemctl start etcd命令;
3.这个ectd的备份与恢复考题:恢复这里一直是个坑;你恢复了之后,这个etcd起不来了,这个就JJ了。。。。;
4.这个题是个坑:可以直接放弃,把稳起见;(可以做个etcd备份,恢复就不需要做了。。。可以看情况)
第五题 网络策略
原题
Task
在现有的namespace my-app中创建一个名为allow-port-from-namespace的新NetworkPolicy
确保新的NetworkPolicy允许namespace my-app中的Pods来连接到namespace big-corp中的端口8080
进一步确保新的NetworkPolicy:
不允许对没有在监听端口8080的pods的访问
不允许不来自namespace my-app中的pods的访问
双重否定就是肯定,所以最后两句话的意思就是:
仅允许端口为 8080 的 pod 访问。
仅允许 my-app命名空间中的 pod 访问。
参考
https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
题解
1、切换环境
kubectl config use-context hk8s
2、配置
#如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用。
给命名空间打标签:kubectl label namespace big-corp name=big-corp
编写一个 yaml 文件
vim networkpolicy.yaml
#注意 :set paste,防止 yaml 文件空格错序。
apiVersion: networking.kubernetes.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: my-app #被访问者的命名空间
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: big-corp #访问者的命名空间的标签
ports:
- protocol: TCP
port: 8080 #被访问者公开的端口
kubectl apply -f networkpolicy.yaml
3、验证
kubectl get networkpolicy -nmy-app
官方yaml
apiVersion: networking.kubernetes.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
删除egress,ingress里的ipBlock,podSelector部分,修改spec.podSelector后面为空。
另一个版本
2
检查
第六题SVC 暴露应用(强制记忆)
考点:将现有的 deploy 暴露成 nodeport 的 service。
原题
Task
请重新配置现有的部署front-end 以及添加名为http的端口规范来公开现有容器nginx的端口80/tcp
创建一个名为front-end-svc的新服务,以公开容器端口http
配置此服务,以通过在排定的节点上的NodePort来公开各个Pods
参考
https://kubernetes.io/zh-cn/docs/tutorials/services/source-ip/#source-ip-for-services-with-type-nodeport
题解
1、切换环境
kubectl config use-context kubernetes
2、配置
kubectl edit deployment front-end
…
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- name: http #额额,这里要加一个-横杠的。。。
protocol: TCP #protocol不写也是可以的,因为默认就是TCP
containerPort: 80
…
kubectl expose deployment front-end --port=80 --target-port=80 --type=NodePort --name=front-end-svc #注意:这里--name(不要忘记了。。。。)svc类型:NodePort/ClusterIP; --port是svc的端口号,--target-port是deployment里pod的容器的端口号
#验证:(看下他们的SELECTOR标签是否一致)
kubectl get svc front-end-svc -owide
kubectl get deployment front-end -owide
curl 节点名/节点ip:NodePort
curl svcIP:port
答题技巧
第七题Ingress创建(拷贝yaml)📍(注意yaml位置)
原题
Task
如下创建一个新的nginx ingress资源:
名称:pong
Namespace: ing-internal
使用服务端口5678在路径/hello上公开服务hello
可以使用以下命令检查服务hello的可用性,该命令应返回hello:
curl -kL <INTERNAL_IP>/hello
参考
https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
2
题解
1、切换环境
kubectl config use-context k8s
2、配置
vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
#如果测试结果没有hello输出,则可以尝试删除annotations字段内容;
# 注意,如果等待5min后,这个还是出不来Ip时,可以看下那个hello服务类型是不是ClusterIP类型,如果不是,请修改为ClusterIp
3、验证
kubectl get ingress -ning-internal
curl -kL internal_IP/hello
答题技巧
1.直接从官方代码复制过来修改下即可;
2.如果测试结果没有hello输出,则可以尝试删除annotations字段内容;
3.注意,一般自己的学习环境是看不到这个ingress 的 IP 地址的,而考试环境是可以的;
官方yaml代码需要修改的地方
注意:ingress资源还要加上一个namesapce的。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
另一版本
2
3
4
5
第八题-扩容 deployment 副本数量(强制记忆,送分题
)
原题
Task
将deployment从loadbalancer扩展至5 pods
参考链接
没必要参考网址,使用-h 帮助更方便。
kubectl scale deployment -h
题解
1、切换环境
kubectl config use-context k8s
2、配置
kubectl scale deployment loadbalancer --replicas=5
3、验证
kubectl get po
kubectl get deployment
可以先检查下pod数量
2
第九题-调度 pod 到指定节点(强制记忆,送分题
)
原题
Task
按如下要求调度一个pod
名称:nginx-kusc00401
Image: nginx
Node selector: disk=ssd
参考
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/
题解
1、切换环境
kubectl config use-context k8s
2、配置
vim nodeSelector.yaml
aoiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
spec:
containers:
- name: nginx-kusc00401
image: nginx
nodeSelector: #这个是和containers同一级别的。
disk: ssd
kubectl apply -f nodeSelector.yaml
# kubectl label node node01 disk=ssd 打标签
# kubectl get node --show-lables
3、验证
kubectl get po -owide
答题技巧
直接打开书签,拷贝yaml,删除2处内容,并修改pod名称即可,很简单;
。。。注意下:这个网址是改变了的。。。
另一版本
2
3
创建
第10题-查看可用节点数量(强制记忆,送分题
)
考点:检查节点角色标签,状态属性,污点属性的使用
原题
Task
检查有多少worker nodes已准备就绪(不包括被打上Taint:NoSchedule的节点),并将数量写入
参考链接
没必要参考网址,使用-h 帮助更方便。
kubectl -hD
如果实在记不住命令,可以手动往题目文件里面写入2 即可
题解
1、切换环境
kubectl config use-context k8s
2、配置
kubctl describle nodes $(kubectl get node|grep Ready|awk '{print $1}')|grep Taints|grep -vc NoSchedule
3、验证
cat /opt/KUSC00402/kusc00402.txt
2
答题技巧
1、自己测试过程
#统计all准备就绪的节点
[root@kubernetes-master ~]#kubectl get nodes|grep Ready
kubernetes-master Ready control-plane,master 43d v1.21.2
kubernetes-node1 Ready <none> 43d v1.21.2
kubernetes-node2 Ready <none> 43d v1.21.2
[root@kubernetes-master ~]#kubectl get nodes|grep Ready|awk '{print $1}'
kubernetes-master
kubernetes-node1
kubernetes-node2
[root@kubernetes-master ~]#
#统计没有打上污点的节点
[root@kubernetes-master ~]#kubectl describe nodes |grep Taint
Taints: node-role.kubernetes.io/master:NoSchedule
Taints: <none>
Taints: <none>
[root@kubernetes-master ~]#kubectl describe nodes |grep Taint|grep -v NoSchedule
Taints: <none>
Taints: <none>
[root@kubernetes-master ~]#kubectl describe nodes |grep Taint|grep -cv NoSchedule
2
#最终代码
[root@kubernetes-master ~]#kubectl describe node $(kubectl get nodes|grep Ready|awk '{print $1}') |grep Taint|grep -vc NoSchedule
2
kubectl describe node $(kubectl get nodes|grep Ready|awk '{print $1}') |grep Taint|grep -vc NoSchedule > /opt/KUSC00402/kusc00402.txt
2.如果不熟悉shell的话,那么手动统计应该也可以;
[root@kubernetes-master ~]#kubectl get node
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready control-plane,master 43d v1.21.2
kubernetes-node1 Ready <none> 43d v1.21.2
kubernetes-node2 Ready <none> 43d v1.21.2
[root@kubernetes-master ~]#kubectl describe nodes |grep Taint
Taints: node-role.kubernetes.io/master:NoSchedule
Taints: <none>
Taints: <none>
[root@kubernetes-master ~]#
3.
-c代表统计个数;
污点tag也不全是NoSchedule;
另一版本
2
3
第11题-创建多容器的 pod(强制记忆,送分题
)
原题
Task
创建一个名为kucc4的pod,在pod里面分别为以下每个images单独运行一个app container(可能会有1-4个images):
nginx +redis+memcached
参考
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/#using-pods
题解
1、配置环境
kubectl config use-context k8s
2、配置
vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: kucc4
spec:
containers:
- name: nginx
image: nginx
- name: redis
image: redis
- name: memcached
image: memcached
kubectl apply -f pod.yaml
3、验证
kuebctl get po
另一版本
2
3
第12题-创建 PV(拷贝yaml)📍(注意yaml位置)
考点:hostPath 类型的 pv
原题
Task
创建名为app-data的persistent volume,容量为2Gi,访问模式为ReadWriteOnce,volume类型hostPath,位于/srv/app-data
参考
https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
题解
1、切换环境
kubectl config use-context hk8s
2、配置
vim pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-data
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/srv/app-data"
kubectl appy -f pv.yaml
3、验证
kubectl get pv
答题技巧
这个是直接创建pv的,不需要去用;
把标签和存储类给去掉;
另一版本
2
第13题 创建PVC(拷贝yaml)📍(注意yaml位置)pvc 的创建 class 属性的使用,–record 记录变更
pvc 的创建 class 属性的使用,–record 记录变更
原题
Task
创建一个新的PersistentVolumeClaim:
名称:pv-volume
Class: csi-hostpath-sc
容量:10Mi
创建一个新的Pod,此Pod将作为volume挂载到PersistentVolumeClaim
名称: web-server
image: nginx
挂在路径:/usr/share/nginx/html
配置新的pod,以对volume具有ReadWriteOnce权限
最后,使用kubectl edit或kubectl patch将PersistentVolumeClaim的容量扩展为70Mi,并记录此更改
参考
https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
⚠️ 注意:官方yaml位置
官网-任务-配置Pods和容器-配置Pod以使用pv作为存储:
题解
1、切换环境
kubectl config use-context ok8s
2、配置
vim pvc.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: task-pv-storage
persistentVolumeClaim:
claimName: pv-volume
containers:
- name: web-server
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
kubectl apply -f pvc.yaml
3、验证
kubectl get pvc
kubectl get pv
kubectl get po
#kubectl edit pvc pv-volume --config-save #淦。。。。。是--save-config ,自己写错了。。。。
kubectl edit pvc pv-volume --save-config #可能要等个1分钟的时间才会发生变化;
# kubectl edit pvc pv-volume --record 这种方法也是可以的。。。。
70Mi
解题技巧
这里会用到存储类,会动态的供给;
1.先创建一个pvc
2.再创建一个pod
端口这边写不写都无所谓:在写svc时候,如果你没指定--target-port的话,那么就会以你定义的为准;
volumes定义在上面和下面都无所谓,只要和container同级就好;
kubectl get pvc,可能要等个1分钟的时间才会发生变化;
2
另一版本
2
3
4
5
6
7
第14题 获取 Pod 错误日志(强制记忆,送分题
)
考点:kubectl logs 命令
原题
Task
监控pod bar的日志并:
提取与错误file-not-found相对应的日志行,将这些日志写入/opt/KUTR00101/bar
参考
https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/
没必要参考网址,使用-h 帮助更方便。
kubectl -h
题解
1、切换环境
kubectl config use-context k8s
2、配置
kubectl logs bar |grep file-not-found > /opt/KUTR00101/bar
3、验证
cat /opt/KUTR00101/bar
答题技巧
第15题-使用 sidecar 代理容器日志(边车)(强制记忆)要注意下
考点:pod 两个容器共享存储卷
原题
Task
使用busybox Image来将名为sidecar的sidecar容器添加到现有的pod legacy-app中。新的sidecar容器必须运行以上命令:
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log
使用安装在/var/log的Volume,使日志文件legacy-app.log可用于sidecar容器。
(注:除了添加所需的volume mount以外,请勿更改现有容器的规格。)
解题
参考
https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/
题解
- 注:由于 Pod 不能在线增加容器,可先导出 yaml 再添加最后 apply
原yaml文件:
1、切换环境
kubectl config use-context k8s
2、配置
kubectl get po leagcy-app -oyaml > sidecar.yaml #由于 Pod 不能在线增加容器,可先导出 yaml 再添加最后 apply
kubectl delet po leagcy-app
vim sidecar.yaml
……
metadata:
name: leagcy-app
spec:
volumes:
- name: varlog
emptyDir: {}
containers:
- name: xx
image: xx
volumeMounts:
- name: varlog
mountPath: /var/log
- name: sidecar
image: busybox
args: [/bin/sh, -c, "tail -n+1 -f /var/log/legacy-app.log"] #。。。。里面是单引号。。。
volumeMounts: #要注意:volumes和volumeMounts这里都是复数。。。
- name: varlog #这里是有一个name的。。。
mountPath: /var/log
kubectl apply -f sidecar.yaml
3、验证
kubectl logs legacy-app
kubectl exec legacy-app -c xx -- tail -f /var/log/legacy-app.log
kubectl exec legacy-app -c siecar -- tail -f /var/log/legacy-app.log
解题yaml:
apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: leagcy-app
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/legacy-app.log;
i=$((i+1));
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
- name: sidecar
image: busybox
args: [/bin/sh, -c, 'tail -n+1 -F /var/log/legacy-app.log']
volumeMounts:
- name: varlog
mountPath: /var/log
volumes:
- name: varlog
emptyDir: {}
答题技巧
这个题目也是争议比较的大一个题目,能做出来的人很少;
考题中文翻译描述的问题很奇怪。。;
sidecar边车容器不是作为主容器,而是辅助主容器做一些功能;
注意:kubectl get pod big-corp-app -o yaml > big-corp-app.yaml 这里面的东西一个都不要删;
这个地方也容器出错;
加这一块比较容易出错,加着加着,这个对齐方式找不到了;
导出来,找到你的位置,然后直接粘贴过来修改即可;
这一块,比较考验你的yaml能力;
验证的话:
1.可以查看下kubectl get pod 看刚才那个pod是否有2个容器
2.用tail -f 查看下边车容器是否会有日志文件持续输出;
另一版本
2
3
4
5
6
16-统计使用 CPU 最高的 Pod(强制记忆,送分题
)
考点:kubectl top -l 命令的使用
原题
Task
通过pod label name=cpu-utilizer,找到运行时占用大量cpu的pod,并将占用cpu最高的pod名称写入文件/opt/KUTR00401.txt(已存在)
参考链接
没必要参考网址,使用-h 帮助更方便。
kubectl top pod -h
题解
1、切换环境
kubectl config use-context kubernetes
2、配置
kubectl top pod -l name=cpu-utilizer --sort-by="cpu" -A #-A是所有namespace 不要忘记写哦,-l也要记得写哦。。。
echo "<podname>" > /opt/KUR00401.txt # 将第一个 Pod 名称写到文件
#写完后记得检查下那个保存结果的文件
3、验证
cat /opt/KUR00401.txt
答题技巧
metric-server已经准备好了,我们不用管;
第17题-节点NotReady处理
排查集群中故障节点(强制记忆,送分题
,一定要做完这道题,分值最高,最简单)
原题
Task
名为wk8s-node-0的Kubernetes worker node处于NotReady状态。调查发生这种情况的原因,并采取相应措施将node恢复为Ready状态,确保所做的任何更改永久有效
可使用以下命令通过ssh连接到故障node:
ssh wk8s-node-0
可使用以下命令在该node上获取更高权限:
sudo -i
参考链接
强制记忆。
题解
1、切换环境
kubectl config use-context wk8s #考试时切到这道题的集群后,那个 node 就是异常的。 真实考试时,这个异常节点的 kubelet 服务没有启动导致的,就这么简单。
2、配置
kubectl get node #查看Not Ready的node节点
ssh wk8s-node-0
sudo -i
systemctl status kubelet
systemctl start kubelet
systemctl enable kubelet
exit #退出root用户
exit #退出故障节点
3、验证
kubectl get node
#jounarlctl -u kubelet 查看kubelet日志
答题技巧
通过 get nodes 查看异常节点,登录节点查看 kubelet 等组件的 status 并判断原因。
真实考试时,这个异常节点的 kubelet 服务没有启动导致的,就这么简单。
考试时切到这道题的集群后,那个 node 就是异常的。
如果systemctl start kubelet没起来的话,就要看它的日志了;(一般是会起来的)
如果kubelt的日志没起来,该如何看kubelet的日志?
journalctl -u kubelet
ctl top -l 命令的使用
原题
[外链图片转存中…(img-HNs61IJ4-1682489660009)]
Task
通过pod label name=cpu-utilizer,找到运行时占用大量cpu的pod,并将占用cpu最高的pod名称写入文件/opt/KUTR00401.txt(已存在)
参考链接
没必要参考网址,使用-h 帮助更方便。
kubectl top pod -h
题解
1、切换环境
kubectl config use-context kubernetes
2、配置
kubectl top pod -l name=cpu-utilizer --sort-by="cpu" -A #-A是所有namespace 不要忘记写哦,-l也要记得写哦。。。
echo "<podname>" > /opt/KUR00401.txt # 将第一个 Pod 名称写到文件
#写完后记得检查下那个保存结果的文件
3、验证
cat /opt/KUR00401.txt
答题技巧
metric-server已经准备好了,我们不用管;
第17题-节点NotReady处理
排查集群中故障节点(强制记忆,送分题
,一定要做完这道题,分值最高,最简单)
原题
[外链图片转存中…(img-7vGftcpi-1682489660009)]
Task
名为wk8s-node-0的Kubernetes worker node处于NotReady状态。调查发生这种情况的原因,并采取相应措施将node恢复为Ready状态,确保所做的任何更改永久有效
可使用以下命令通过ssh连接到故障node:
ssh wk8s-node-0
可使用以下命令在该node上获取更高权限:
sudo -i
参考链接
强制记忆。
题解
1、切换环境
kubectl config use-context wk8s #考试时切到这道题的集群后,那个 node 就是异常的。 真实考试时,这个异常节点的 kubelet 服务没有启动导致的,就这么简单。
2、配置
kubectl get node #查看Not Ready的node节点
ssh wk8s-node-0
sudo -i
systemctl status kubelet
systemctl start kubelet
systemctl enable kubelet
exit #退出root用户
exit #退出故障节点
3、验证
kubectl get node
#jounarlctl -u kubelet 查看kubelet日志
答题技巧
通过 get nodes 查看异常节点,登录节点查看 kubelet 等组件的 status 并判断原因。
真实考试时,这个异常节点的 kubelet 服务没有启动导致的,就这么简单。
考试时切到这道题的集群后,那个 node 就是异常的。
如果systemctl start kubelet没起来的话,就要看它的日志了;(一般是会起来的)
如果kubelt的日志没起来,该如何看kubelet的日志?
journalctl -u kubelet