我的CKA考试之路

举报
开心小丸子 发表于 2021/09/27 11:20:31 2021/09/27
【摘要】 (CKA)认证Kubernetes管理员,由Linux基金会和云原生计算基金会(CNCF)推出,是关于kubernetes技术的官方认证。考试环境kubernetes1.21。考试共计17道题,线上考试,2小时之内完成。

    (CKA)认证Kubernetes管理员,由Linux基金会和云原生计算基金会(CNCF)推出,是关于kubernetes技术的官方认证。

关于考试费用:

      我是在2021年2月份通过linux foundation中文网购买的考试券,当时花了2088元人民币,支持微信/支付宝,考试卷有效期为1年,1年内核销考试都有效。现在涨价了,2498元,涨了410元,早买还占到便宜了。我在知乎上看某些博主在美国网站购买,黑色星期五,好像有折人民币1000多买到的。

     买完考试券,大概拖了半年,到7月末正式开始学习kubernetes,线上看了学习课程,也买了kubernetes权威指南(第四版),现在应该推出到第五版了。然后就准备考试了。

关于考试前准备:

    需要提前在英文官网注册报名,核销中文网购买的采购卷,核销后可以预约考试。预约的界面如下,因为我已经考过了,所以可以看到考试状态为通过,95分,66分及格。

      注意check System Requirements这部分,考试是线上的,使用Google浏览器,需要在Google商店下载考试插件,由于国内互联网政策,我们无法访问Google的资源。我琢磨了好久,在华为云的香港节点创建了1台按需的windows云主机,在这台云主机google浏览器下载了考试插件,并导出转存到本地电脑,并安装到我笔记本的Google浏览器上,并通过了checklist。

      提前1-2天预约考试即可,准备好了,就可以考试。我约的是当日的凌晨0:00-02:00。

关于考试当天的准备:

  1. 监考考试会要求通过摄像头检查考试环境,转动摄像头或者笔记本电脑;
  2. 检查护照,要求离摄像头很近,能看到名字。
  3. 检查房间,是不是只有1个人。
  4. 检查桌面,最好桌子上什么都没有。(我放了鼠标垫,让我把鼠标垫拿起来,看看有没有违禁物品)
  5. 监考官会通过聊天窗口文字沟通,全程中文。
  6. 检查合格后开始考试。

关于考试题目:

CKA1.21考试

注意事项

  • 只允许打开2个table页面,1个是考试页面,另一个是kubernetes官网文档。
  • 每道题都切换到对应的集群节点上,直接复制即可。如 kubectl config use-context k8s。
  • 考试题蓝色部分是可以复制粘贴的。

第一题

任务:

使用kubectl config use-context k8s

  • 创建 名字为deployment-cluserroleClusterRole,可以创建Deployment,StatefulSet,DaemonSet
  • namespace名字为app-team1下创建名字为cicd-tokenServiceAccount。
  • 将创建好的ClusterRole和cicd-token进行绑定。

答案:

切换到kubectl config use-context k8s

  • kubectl create clusterrole deployment-clusterrole--verb=create--resource=Deployment,StatefulSet,DaemonSet
  • Kubectl -n app-team1 create serviceaccourt cicd-token
  • Kubectl create rolobinding cicd-token --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --namespace=app-team1

验证:

Kubectl descript -n app-team1 rolobindings cicd-bind

第二题

任务:

使用kubectl config use-context ek8s

  • 名字为ek8s-node-0的节点,设置为不可用。

答案:

切换到kubectl config use-context ek8s

  • kubectl drain ek8s-node-0 --ignore-daemonsets --force

验证:

Kubectl descript ek8s-node-0

第三题

任务:

使用kubectl config use-context mk8s

  • Master节点使用Kubeadm将升级至1.21.1。升级前master设置drain,升级后回复uncordon。
  • Kubelet和kubectl同样升级,但是etcd不升级。

答案:

切换到kubectl config use-context mk8s

  • kubectl get nodes(确定哪个node是master )
  • kubectl drain ek8s-node-0--ignore-daemonsets --force
  • ssh master节点,并sudo -i 提权
  • apt-get install -y kubeadm=1.21.1-00
  • Kubeadm upgrade plan (验证)
  • Kubeadm upgrade apply v1.21.1 --etcd-upgrade=false
  • Apt-get install -y kubelet=1.21.1-00 kubectl=1.21.1-00
  • systemctl daemon-reload
  • systemctl restart kubelet
  • Exit(返回到mk8s)
  • kubectl uncordon ek8s-node-0

验证:

Kubectl descript ek8s-node-0(查看状态是否非unschedule)

第四题

任务:

  • etcd进行备份。
  • /srv/data/etcd-snapshot-previous.db恢复etcd。(这题我还原的时候没还原上,所以扣了5分,但是步骤肯定是正确的)

答案:

  • ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \

  --cacert=/opt/KUIN00601/ca.crt --cert= --key=/opt/KUIN00601/etcd-client.crt \ --key=/opt/KUIN00601/etcd-client.key  snapshot save /data/backup/etcd-snapshot.db

  • ETCDCTL_API=3 etcdctl --endpoints 127.0.0.1:2379 snapshot restore /srv/data/etcd-snapshot-previous.db

第五题

任务:

使用kubectl config use-context hk8s

  • 创建一个名字为allow-port-from-namespace的NetworkPolicy,只允许NS为internal的pod允许通过80端口访问NS为fubar的pod。

答案:

切换到kubectl config use-context hk8s。

  • Kubectl get ns --show-labels(查看internal的标签)
  • Vim NetworkPolicy.yaml

apiVersion: networking.k8s.io/v1

kind: NetworkPolicy

metadata:

  name: allow-port-from-namespace

  namespace: fubar

spec:

  podSelector: {}

  policyTypes:

  - Ingress

  ingress:

  - from:

    - namespaceSelector:

        matchLabels:

          label1: internal

    ports:

    - protocol: TCP

      port: 80

  • kubectl apply -f NetworkPolicy.yaml

第六题

任务:

使用kubectl config use-context k8s

  • 通过一个已经存在的名字为front-end的deployment增加一个特殊的配置:容器为nginx,名字为http端口为80。
  • 通过修改后front-end这个deployment导出一个名字为front-end-svc,并且该SVC可以启用新修改的配置。

答案:

切换到kubectl config use-context k8s。

  • kubectl get deployment.app front-end -o yaml(查看front-end)
  • kubectl edit deployment.app front-end
  • name=nginx下面插入

   ports:

     - name: http

       containerPort: 80

  • kubectl descript deployment.app front-end(看到已经增加的http和80端口,则代表更改完成)
  • kubectl expose deployment.app frond-end --port=80 --target-port=http --type=NodePort --name=front-end-svc

验证

  • Kubectl get svc(看到有front-end-svc)
  • Kubectl descript svc front-end-svc (看到http和80端口的映射状态,代表成功)

第七题

任务:

使用kubectl config use-context k8s

  • 创建名字为pong的ingress,服务名hi路径/hi,服务端口5678。

答案:

切换到kubectl config use-context k8s。

  • Vim ingress,yaml

apiVersion: networking.k8s.io/v1

kind: Ingress

metadata:

  name: minimal-ingress

  namespace: ing-internal

spec:

  rules:

  - http:

      paths:

      - path: /hi

        pathType: Prefix

        backend:

          service:

            name: hi

            port:

              number: 5678

验证

Curl -kL <internal_ip> /hi

第八题

任务:

使用kubectl config use-context k8s

  • guestbook的deployment内pod数量更改为6。

答案:

切换到kubectl config use-context k8s。

  • Kubectl scale deployment guestbook --replicas=6

验证

Kubectl get deployment guestbook

第九题

任务:

使用kubectl config use-context k8s

  • 创建一个pod,名字为nginx-kusc00401,镜像为nginx,nodeSelector为disk:spinning。

答案:

  • Vim nginx.yaml

apiVersion: v1

kind: Pod

metadata:

  name: nginx-kusc00401

spec:

  containers:

  - name: nginx

    image: nginx

  nodeSelector:

    disk: spinning

  • Kubectl apply -f nginx.yaml
  • Kubectl get pod nginx-kusc00401

第十题

任务:

使用kubectl config use-context k8s

  • 查看当前状态为ready的node,统计ready的node,taint=none,并将统计的数量输出到/opt/KUSC00402/kusc00402.txt。

答案:

  • Kubectl get nodes(查看共有几个状态为ready的node)
  • Kubectl describe nodes <node name> | grep -i taint(,taints:<none>,每一个node都查看以下,统计数量)
  • echo 4>/opt/KUSC00402/kusc00402.txt

第十一题

任务:

使用kubectl config use-context k8s

  • 创建一个名字为kucc8的pod,里面包含2个容器redis和consul。

答案:

  • Vim kucc8.yaml

apiVersion: v1

kind: Pod

metadata:

  name: kucc8

spec:

  containers:

  - name: redis

    image: redis

  - name: consul

    image: consul

 

  • Kubectl apply -f kucc8.yaml
  • Kubectl get pod

第十二题

任务:

使用kubectl config use-context hk8s

  • 创建一个名字为app-config,大小2G,redawritenany,类型为host path,path路径为/srv/app-config的卷。

答案:

使用kubectl config use-context hk8s

  • Vim app-config.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

  name: app-config

spec:

  capacity:

    storage: 2Gi

  accessModes:

    - ReadWriteMany

  hostPath:

    path: /srv/app-config

  • Kubectl get pv

第十三题

任务:

  • 创建一个名字为pv-volume,类型为csi-hostpath-sc,大小为10M的pvc。
  • 创建一个pod,使用第一步创建的pvc,挂在地址是/usr/share/nginx/html
  • 将第一步创建的pv-volume大小更改为70M

答案:

  • Vim pv-volume.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: pv-vloume

spec:

  accessModes:

    - ReadWriteOnce

  resources:

    requests:

      storage: 10Mi

  storageClassName: csi-hostpath-sc

  • Kubectl apply -f pv-volume.yaml
  • Vim web-server.yaml

apiVersion: v1

kind: Pod

metadata:

  name: web-server

spec:

  containers:

    - name: nginx

      image: nginx

      volumeMounts:

      - mountPath: /usr/share/nginx.html

        name: mypd

  volumes:

    - name: mypd

      persistentVolumeClaim:

        claimName: pv-volume

  • Kubectl descript pod web-server
  • Kubectl edit pvc pv-volume(将10Mi改成70Mi,保存即可)

第十四题

任务:

使用kubectl config use-context k8s

  • 导出po'd名为foobar的日志查找其中包含file-not-found的错误,并写入到/opt/KUTR00101/foobar。

答案:

切换到kubectl config use-context k8s

  • Kubectl logs foobar | grep file-not-found > /opt/KUTR00101/foobar

第十五题

任务:

使用kubectl config use-context k8s

已经有一个pod,用于存储记录kubectl的logs。

  • 已有的名字为11-factor-app的pod,添加一个容器sidicar,使用busybox镜像,命令为/binsh -c tail -n+1 f /var/log/11-factor-app.log
  • 将新容器(看数据)和老容器(写数据),都挂在存储到/var/log。

答案:

  • kubectl get pod 11-factor-app -o yaml > app.yaml(输出其yaml文件)
  • vim app.yaml(先备份一份,删除managed部分,删除status部分,不删会有问题。)

container下添加:

containers:

  - name: sidecar

    image: busybox

    args: [/bin/sh, -c,

            '"tail -n+1 f /var/log/11-factor-app.log"']

    volumeMounts:

    - name: varlog

      mountPath: /var/log

在原容器下添加:

    volumeMounts:

    - name: varlog

      mountPath: /var/log

注意:podvolumesemptyDir

volumes:

  - name: varlog

    emptyDir: {}

  • kubectl delete pod 11-factor-app
  • kubectl apply -f app.yaml

第十六题

任务:

使用kubectl config use-context k8s

  • 查找label标签name=cpu-utilizer的pod,查看他们的CPU使用率,将使用率最高的pod,写道/opt/KUTR00401/KUTR00401.txt。

答案:

切换到kubectl config use-context k8s

  • Kubectl top pod -l name=cpu-utilizer (查看哪个pod的CPU使用率最高,如pod名为websvr)
  • echo websvr >/opt/KUTR00401/KUTR00401.txt

第十七题

任务:

使用kubectl config use-context wk8s

  • 名字叫做wk8s-node-0的node状态为NotReady,查找原因,并让其状态变为ready。

答案:  

切换到kubectl config use-context wk8s

  • ssh wk8s-node-0
  • sudo -i
  • systemctl status kubelet(查看kubelet为啥没起来)
  • systemctl start kubelt
  • systemctl enable kubelet
  • exit

验证:

kubectl get node(状态为Ready)



最后祝大家都能顺利通过考试,并可以学以致用。

    附件下载

  • 插件.rar 45.82KB 下载次数:14
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。