CKA证书题库-总结

CKA真题(考题总结)

文章目录

证书

image-20230426140720531

个人考试总结

我总结了一下今天考试的问题?
我是凌晨5点考试的,当时选择了一个VPN节点是美国 400ms,然后连接上去,进入psi浏览器,然后出现英文的界面,选择一些东西,客服也是英文老师,等到4.50出现的一个中文监考老师,让后检测各种考试环境,进入到考试界面,刚切换成中文,然后点击了一下终端就掉了,等了30分钟从新连接上去,显示已经完成考试,等待考试结果,这里进行申诉给官方,申诉邮箱不方便贴出来,大家可以私信找我拿。

第二次考试,准备也是早上5点,网络状态好用,不用开启VPN,上去正常考试

image-20230426140622217

申诉结果

image-20230426140357536

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分及格

题目说明:国内访问一般会自动切换中文

考试系统界面:

image-20230307201148638

答题结束后,在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

考试原题

image-20230306212454610

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

image-20230306215133630

第⼆题:节点维护,设置节点不可⽤

考点:cordon 和 drain 命令的使用

原题

image-20230306215233712

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

image-20230306215554733

image-20230307112813841

第三题:升级 节点kubeadm

原题

image-20230306215829264

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方式)

image-20230306223054282

另一版本

img

1
img

2
img

3
img

4
img

5
img

6
img

第四题:备份还原 etcd

原题

img

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

image-20230307204242658

img

解题

⚠️ 如下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备份,恢复就不需要做了。。。可以看情况)

第五题 网络策略

原题

image-20230307205102768

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/

image-20230307205250424

题解

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

image-20230307205504693

删除egress,ingress里的ipBlock,podSelector部分,修改spec.podSelector后面为空。

另一个版本

image-20230307205538104

2
image-20230307205553452

检查

image-20230307205618302

第六题SVC 暴露应用(强制记忆)

考点:将现有的 deploy 暴露成 nodeport 的 service。

原题

image-20230307205732083

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

答题技巧

image-20230307205923477

第七题Ingress创建(拷贝yaml)📍(注意yaml位置)

原题

image-20230307210456057

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/

image-20230307210616504

2
image-20230307210640629

题解

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

image-20230307210845793

另一版本

image-20230307210944999

2
image-20230307211000688

3
image-20230307211011523

4
image-20230307211048058

5
image-20230307211105188

第八题-扩容 deployment 副本数量(强制记忆,送分题

原题

image-20230307211417331

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数量

image-20230307211553822

2
image-20230307211613588

第九题-调度 pod 到指定节点(强制记忆,送分题

原题

image-20230307211739438

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名称即可,很简单;

。。。注意下:这个网址是改变了的。。。

image-20230307211937640

另一版本

image-20230307212003908

2
image-20230307212017526

3
创建
image-20230307212036748

第10题-查看可用节点数量(强制记忆,送分题

考点:检查节点角色标签,状态属性,污点属性的使用

原题

image-20230307212137239

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;

另一版本

image-20230307212426812

2
image-20230307212440222

3
image-20230307212454717

第11题-创建多容器的 pod(强制记忆,送分题

原题

image-20230307212611169

Task
创建一个名为kucc4的pod,在pod里面分别为以下每个images单独运行一个app container(可能会有1-4个images):
nginx +redis+memcached

参考

https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/#using-pods

image-20230307212636931

题解

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

另一版本

image-20230307212720717

2
image-20230307212744336

3

image-20230307212755710

第12题-创建 PV(拷贝yaml)📍(注意yaml位置)

考点:hostPath 类型的 pv

原题

image-20230307213753438

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/

image-20230307213830477

题解

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的,不需要去用;
把标签和存储类给去掉;

image-20230307214000016

另一版本

image-20230307214033201

2
image-20230307214043403

第13题 创建PVC(拷贝yaml)📍(注意yaml位置)pvc 的创建 class 属性的使用,–record 记录变更

pvc 的创建 class 属性的使用,–record 记录变更

原题

image-20230307214142876

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作为存储:

image-20230307214230859

题解

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分钟的时间才会发生变化;

image-20230307214431739

2
image-20230307214448153

另一版本

image-20230307214511056

2
image-20230307214522729

3
image-20230307214537391

4
image-20230307214843837

5

image-20230307214911348

6
image-20230307214932206

7
image-20230307214946215

第14题 获取 Pod 错误日志(强制记忆,送分题

考点:kubectl logs 命令

原题

image-20230307220022877

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

答题技巧

image-20230307220222050

第15题-使用 sidecar 代理容器日志(边车)(强制记忆)要注意下

考点:pod 两个容器共享存储卷

原题

image-20230307220327331

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 查看下边车容器是否会有日志文件持续输出;

image-20230307220654041

另一版本

image-20230307220715953

2
image-20230307220730143

3
image-20230307220809589

4
image-20230307220824135

5
image-20230307220833147

6
image-20230307220843318

16-统计使用 CPU 最高的 Pod(强制记忆,送分题

考点:kubectl top -l 命令的使用

原题

image-20230307221016208

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处理

排查集群中故障节点(强制记忆,送分题,一定要做完这道题,分值最高,最简单)

原题

image-20230307221357339

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
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值