草庐IT

CKA真题-2022年12月1号通过(考题&模拟题脚本)

黄启铨 2023-04-20 原文

      

       

        趁着11月黑五5折活动,报了个CKA&CKS,现已通过CKA。

        考前准备

        模拟题脚本&检测脚本

注意事项:

1. 12月份考试的时候kubectl已经可以Tab补全了,不需要背指令source <(kubectl completion bash).

2.  指令多用-h查询,答案不唯一,指令或yaml解出来都可以。

3. 题目中蓝色字在考试都会有所变动(我考试只变了1,2题参数,其他没变)。

4. 考试只允许访问官网查询,不能使用收藏网页,考试都是使用官网浏览器,浏览器会要求你关闭远程工具,虚拟机vm等进程(要我关闭进程显卡控制台???)

5. 注意切换集群。

6. 自己写了个模拟试题和检测脚本,会写在下一帖子。

题库:

题目一. RBAC 

        [node]$ kubectl config use-context k8s

        创建一个名为deployment-clusterrole的clusterrole,该clusterrole只允许创建deployment、daemonset、statefulset的create操作。

        在名字为  app-team1的namespace下创建一个名为cicd-token的serviceAccount。

   限于namespace app-team1,将新的clusterrole deployment-clusterrole绑定到新的serviceAccount cicd-token

参考答案:

# kubectl config use-context k8s            #切换集群                   
# kubectl create rolebinding -h
# kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets               #注意:要写小写,每个需要添加一个s
# kubectl create serviceaccount -h
# kubectl create serviceaccount cicd-token -n app-team1
# kubectl create clusterrole -h   
# kubectl create rolebinding cicd-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -n app-team1
# 注意cicd-binding (这个名字可以任意,叫abc也行。)
查看
kubectl describe clusterrole deployment-clusterrole 
kubectl describe rolebinding -n app-team1

题目二. Top

        [node]$ kubectl config use-context k8s

        通过pod label name=cpu-utilizer 直到运行占用大量cpu的pod,将pod名写入文件

/opt/KUTR00401/KUTR00401.txt

参考答案:

# kubectl config use-context k8s            #切换集群
# kubectl top pod -h
# kubectl top pod -l name=cpu-utilizer --sort-by='cpu' -A
# echo <podname> >/opt/KUTR00401/KUTR00401.txt   #注意:这里由于翻译问题可能文件名字不存在,可以先进去/opt下,确认这个文件具体目录在写入进去,别新建文件目录,否则没分。

题目三. Networkpolicy        

        [node]$ kubectl config use-context hk8s

        在namespace my-app中创建一个allow-port-from-namespace的新networkpolicy,确保新的NetwoekPolicy允许namespace big-corp中的Pods连接到namespace my-app中的Pod的端口8080。

进一步确认Networkolicy:

不允许对没有监听 8080 的Pods访问

不允许不来自namespace my-app 的Pods访问

参考答案:

官网链接:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/
官网->概念->服务->网络策略
或 在搜索写入 network policy

# kubectl config use-context hk8s
# kubectl label namespace big-corp name=big-corp           #将命名空间标签
#如果访问者的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用
# vim 03.yaml
内容参考下方
# kubectl apply -f   networkpolicy.yaml
# kubectl get networkpolicy -nmy-app   #查看状态。如果脚本报错,可能是命名空间标记没标注导致脚本报错。

题目四: Service

        [node]$ kubectl config use-context k8s

        重新配置现有的front-end以及添加http的端口规范来公开现有的容器nginx的端口80/tcp

        创建一个名叫front-end-svc服务,公开容器端口http。使用NodePort来公开各个Pods。

参考答案:

官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
文档主页-->概念-->工作负载-->工作负载资源-->deployments
或搜索 deployment
#  kubectl config use-context k8s
#  kubectl get svc                      # 查看服务有没有启动,考试不需要
#  kubectl edit deployment front-end   # 注意,已经存在pods,修改即可,改动如下:
在name和resources中间插入,然后保存:wq

 

# kubectl expose -h
# kubectl expose deployment front-end --port=80 --target-port=80 --type=NodePort --name=front-end-svc
#说明,deployment 接的是pod名字,外部端口,容器端口,type别漏了,--name=svc名字
# kubectl get deployment front-end -owide      #查看配置
# kubectl get svc                              #查看服务
# curl svc-ip:端口                              #验证是否访问到nginx

题目五.  Ingress

         [node]$ kubectl config use-context k8s

         创建一个新的nginx Ingress资源:

        名称: pong

        Namespace: ing-internal

        使用服务端口 5678 在路径 /hello上公开服务 hello  

        可以使用curl -kl <IP> /hello

参考答案:

官网地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#the-ingress-resource
文档路径:概念 --> 服务,负载均衡和联网  --> Ingress-->第一个示例
或搜索ingress
# kubectl config use-context k8s
# vim ingress.yml
# kubectl apply -f 05.yaml
# curl -kL ip/hello  

 

题目六. 副本扩容

        [node]$ kubectl config use-context k8s

        将deployment 从 loadbalancer 扩展至 5 pods

参考答案:

# kubectl config use-context k8s
# kubectl get deployment
# kubectl scale deployment loadbalancer --replicas=5  #记住scale既可以
# kubectl get deployment

题目七. 分配Pod

                

        按照要求调度一个Pod:

        名称: nginux-kusc00401

        Image: nginx

        Node selector: disk=ssd

参考答案:

官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/
文档主页-->任务-->配置pods和容器-->将 Pod 分配给节点
或搜索pod
# kubectl config use-context k8s
# kubectl apply -f 07.yaml
# kubectl get pods nginx-kusc004001 -owide

 

题目八: 统计污点

        [node]$ kubectl config use-context k8s

        统计有多少个worker nodes 以准备就绪(不包括被打上TaintNoSchedule的节点),并将数量写入到/opt/KUSC00402/kusc00402.txt

参考答案:

# kubectl config use-context k8s
方法一:
# kubectl describe node | grep -i Taints | grep -vci NoSchedule > /opt/KUSC00402/kusc00402.txt
# grep -i 忽略大小写(防止大小写错) -c统计 -v取反
方法二:
# kubectl describe node | grep Taints | grep -i NoSchedule | wc -l  #统计污点和不允许调度
# kubectl get node | grep -w  Ready | wc -l            #统计启动状态
# 指令2-指令1数字   echo 数量 >/opt/KUSC00402/kusc00402.txt
方法三:
# kubectl describe nodes $(kubectl get node|grep Ready|awk '{print $1}')|grep Taints|grep -vc NoSchedule 

题目九:多容器运行一个Pod

         [node]$ kubectl config use-context k8s

         创建一个名叫kucc4的pod,在pod里面分别为每个images单独运行一个app container

Nginx+redis+memcached

参考答案:

官网地址:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/
文档主页-->概念-->工作负载-->pod
或搜索pods
# kubectl config use-context k8s
# vim 09.yaml
# kubectl apply -f 09.yaml

 

题目十. PV

        [node]$ kubectl config use-context hk8s

        创建名叫app-data 的pv,容量为2Gi,访问模式为ReadWriteOnce。 Volume类型为hostPath,位于/srv/app-data

参考答案:

官方地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
文档主页 --> 任务 --> 配置pods和容器-->配置 Pod 以使用 PersistentVolume 作为存储
# kubectl config use-context hk8s
# vim 10.yaml
# kubectl apply -f 10.yaml
# kubectl get pv 

 

题目十一. PVC

          [node]$ kubectl config use-context ok8s

        创建一个新的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将pvc容量扩展到70Mi,并记录更改。

参考答案:

官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
文档主页 --> 任务 --> 配置pods和容器-->配置 Pod 以使用 PersistentVolume 作为存储-->创建 PersistentVolumeClaim
步骤,创建pvc,创建pod,edit修改大小
# kubectl config use-context ok8s
# kubectl apply -f pvc.yaml
# kubectl get pvc          #注意,这里因为没有csi这个类,所以状态处于pending是正常的。考试会有csi这个类,csi这个类需要安装对应插件才能使用。
# kubectl edit pvc pv-volume --save-config     #我们修改会保存不了,因为上面pvc,pending状态,记住在那里修改即可。或--save-config也可以用--record替换。

   

题目十二. Logs

        [node]$ kubectl config use-context k8s

        监控 pod bar的日志并:提取与错误 file-not-found 相对应的日志行,将这些日志写入到 /opt/KUTR00101/bar

参考答案:

# kubectl config use-context k8s
# kubectl logs -h
# kubectl logs pod/bar | grep file-not-found >/opt/KUTR00101/bar  #注意pod/bar格式。可以先logs看有没有信息在输出,注意权限问题,必要加sudo
# cat /opt/KUTR00101/bar               #验证

       

题目十三. Sidecar边车(遇到可以先做后面,我考试第5题出现)

        [node]$ kubectl config use-context k8s

        现有一个Pod legacy-app 内置日志,使用busybox Image添加一个 sidecar 容器添加到现有Pod legacy-app中新sidecar容器必须运行一下指令

/bin/sh, -c, 'tail -n+1 -f /var/log/legacy-app.log'。
并且这个 sidecar 和原有的镜像挂载一个名为 logs 的 volume,挂载的目录为/var/log/

除了添加volume mount 外,请不要更改现有容器的规格。

参考答案:

官网地址:https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/
文档-->概念-->集群管理-->日志架构
或 搜索栏输入side car
# kubectl config use-context k8s
# kubectl get po leagcy-app -oyaml > 13.yaml       #导出旧pod修改,注意因为要求不对原有pod修改,只能新增辅助sidecar,另外要注意备份
# cp 13.yaml 13.bak.yaml                       #备份
# kubectl delet pod legacy-app                            #删除旧pod
# kubectl apply -f 13.yaml                           #重新部署
# kubectl exec legacy-app -c legacy-app -- tail -f /var/log/legacy-app.log    #验证
# kubectl exec legacy-app -c sidecar -- tail -f /var/log/legacy-app.log       #验证是否使用同一个log

 

在这个位置插入内容

在末尾volume添加2句

题目十四. 升级(升级需要时间,建议最后做,我考试第2题出现)

         [node]$ kubectl config use-context mk8s

        

参考答案:

官网地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/
文档主页-->任务-->管理集群-->用 kubeadm 进行管理-->升级 kubeadm 集群
或搜索kubeadm update
1、切换环境
kubectl config use-context mk8s
2、配置
#升级kueadm
kubectl cordon mk8s-master-0
kubectl drain mk8s-master-0 --ignore=daemonsets           #驱逐pod 
ssh mk8s-master-0                            #远程到master节点
sudo -i                                         #提权
apt install kubeadm=1.20.1-00 -y
kubeadm upgrade plan
#这里可以先查下的:apt-cache show|grep kubeadm
#kubeadm upgrade apply install v1.20.1 #并且要加上--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                  #退出root账户
Exit                  #退出ssh登陆的master节点
kubectl uncordon mk8s-master-0
3、验证
kubectl get node -owide
kubectl --version
kubelet --version

 

题目十五. Etcd备份

 

备份文件名:/data/backup/etcd-snapshot.db

还原文件名:/data/backup/etcd-snapshot-previous.db

参考答案:

官网地址:https://kubernetes.io/zh/docs/tasks/administer-cluster/configureupgrade-etcd/
文档主页-->任务-->管理集群-->为Kubernetes运行etcd集群
或搜索etcd
1、确定当前环境
kubectl get node
2、配置
#备份
ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=<trusted-ca-file> --cert=<cert-file> --key=<key-file> \
  snapshot save /data/backup/etcd-snapshot.db
#还原
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
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 退回上一步操作

题目十六. Node 状态排错(送分题)

参考答案:

# ssh wk8k-node-0
# sudo -i
# kubectl descibe node wk8s-node-0
# systemctl enable kubelet --now    # 这题就是这么简单,也可以先start 在enable
# systemctl status kubelet
# exit                              # 退出root
# exit                              # 退出节点
# journalctl -u kubelet             # 如果没有起来,查看原因

题目十七. Node驱逐Pod

        [node]$ kubectl config use-context ek8s

        将名叫ek8s-node-1的node设置为不可用,并重新调度该node上的所有pods

参考答案:

1、切换环境
kubectl config use-context ek8s
2、配置
#kubectl coredon ek8s-node-1                  #设置为不可调度
kubectl drain ek8s-node-1 --ignore-daemonsets #设置次节点为不可调度,并且排空次节点
#如果上面命令报错就加上一个 --delete-local-data --force
3、验证
kubectl get node

结尾:

特别感谢前辈CKA的帖子:一念一生~one的博客_CSDN博客-k8s,Linux,git领域博主 

有关CKA真题-2022年12月1号通过(考题&模拟题脚本)的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  4. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  5. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  6. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  9. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  10. ruby - 通过 erb 模板输出 ruby​​ 数组 - 2

    我正在使用puppet为ruby​​程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby​​不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这

随机推荐