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

注意事项:

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

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

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

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 clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
kubectl create rolebinding app-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token --namespace=app-team1
# app-token-binding 该名未规定可任意取名,叫abc也行
#查看
kubectl describe clusterrole deployment-clusterrole
kubectl describe rolebinding app-token-binding -n app-team1

题目二. Top

[node]$ kubectl config use-context k8s

通过pod label name=cpu-loader 直到运行占用大量cpu的pod,将使用cpu最高的pod名写入到文件 /opt/KUTR00401/KUTR00401.txt

参考答案:

kubectl config use-context k8s  #切换集群
kubectl top pod -l name=cpu-loader --sort-by=cpu -A
echo <使用CPU最高的podname名称> > /opt/KUTR00401/KUTR00401.txt
#注意/opt/KUTR00401/KUTR00401.txt不能手动创建,该文件是已存在的

题目三. 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 get namespace --show-labels   #如果访问的 namespace 没有标签 label,则需要手动打一个。如果有一个独特的标签 label,则也可以直接使用
# kubectl label namespace big-corp project=big-corp      #将命名空间打标签
#
# vim 03.yaml
#03.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: big-corp
      ports:
        - protocol: TCP
          port: 8080

# kubectl apply -f networkpolicy.yaml
# kubectl get networkpolicy -n my-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
ports:
- containerPort: 80
  name: http
  protocol: TCP

#kubectl expose deployment front-end --name=front-end-svc --port=80 --target-port=http --type=NodePort 
#说明,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资源:

名称: ping

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 #文件内容如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ping
  namespace: ing-internal
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - http:
      paths:
      - path: /hello
        pathType: Prefix
        backend:
          service:
            name: hello
            port:
              number: 5678

# 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
# vim 07.yaml  #文件内容如下
apiVersion: v1
kind: Pod
metadata:
  name: nginx-kusc00401
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    disk: ssd

# kubectl apply -f 07.yaml  
# kubectl get pods nginx-kusc004001 -owide

题目八: 统计污点

[node]$ kubectl config use-context k8s

统计有多少个worker nodes 以准备就绪(不包括被打上Taint:NoSchedule的节点),并将数量写入到/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

创建一个名叫kucc1的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 #内容如下:
apiVersion: v1
kind: Pod
metadata:
  name: kucc1
spec:
  containers:
  - name: nginx
    image: nginx
  - name: redis
    image: redis
  - name: memcached
    image: memcached

# 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 #内容如下:
apiVersion: v1
kind: PersistentVolume
metadata:
  name: app-data
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/srv/app-data"

# 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
# vim pvc.yaml  #文件内容如下:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-volume
spec:
  storageClassName: csi-hostpath-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi

# kubectl apply -f pvc.yaml
# vim pod-pvc.yaml #文件内容如下:
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-vollume

# kubectl apply -f pod-pvc.yaml
# kubectl get pvc          #注意,模拟测试因为没有csi这个类,所以状态处于pending是正常的。考试会有csi这个类,csi这个类需要安装对应插件才能使用。
# kubectl edit pvc pv-volume --record     #修改10Mi为70Mi,模拟测试修改会保存不了,因为上面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/
文档-->概念-->集群管理-->日志架构
或 搜索栏输入sidecar
# kubectl config use-context k8s
# kubectl get po leagcy-app -oyaml > 13.yaml       #导出旧pod修改,注意因为要求不对原有pod修改,只能新增辅助sidecar,另外要注意备份
# cp 13.yaml 13.bak.yaml                       #备份
# vim 13.yaml #修改内容
#在volumeMounts:内增加:
    volumeMounts:
    - name: varlog
      mountPath: /var/log
#在volumeMounts:结束后增加新container:
  - name: busybox
    image: busybox:1.28
    args: [/bin/sh, -c, 'tail -n+1 -F /var/log/leagcy-app.log']
    volumeMounts:
    - name: varlog
      mountPath: /var/log
#在status:字段前插入内容:
  volumes:
  - name: varlog
    emptyDir: {}

# kubectl delete 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

题目十四. 升级(升级需要时间,建议最后做现)

设置配置环境:$ kubectl config use-context mk8s

Task

现有的Kubernetes 集群正在运行版本1.28.0.仅将主节点上的所有Kubernetes控制平面和节点给件升级到版本1.28.1.

确保在升级之前drain主节点,并在升级后 uncordon主节点。

可使用以下命令通过 ssh 连接到主节点:

[student@node-1]$ ssh mk8s-master-0

可使用以下命令在该主节点上获取更高权限:

[student@mk8s-master-0] $ sudo -i

另外,在主节点上升级kubelet和kubectl

请不要升级工作节点,etcd,container 管理器,CNI插件, DNS服务或任何其他插件。

参考答案:

官网地址: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 get nodes
kubectl cordon mk8s-master-0
kubectl drain mk8s-master-0 --delete-emptydir-data --ignore=daemonsets --force           #驱逐pod
#升级kubeadm 
ssh mk8s-master-0                            #远程到master节点
sudo -i                                         #提权
apt-get update 
#这里可以先查下的kubeadm版本:apt-cache show|grep kubeadm
apt install kubeadm='1.28.1-*'  #升级kubeadm到指定版本
kubeadm upgrade plan  #验证升级计划
#注意要加上--ectd-ugrade=false 题目要求不升级 etcd; 注意下这2个版本号写法的区别
kubeadm upgrade apply v1.28.1 --etcd-upgrade=false
#升级kubelet、kubectl
apt-get install kubelet=1.20.1-00 kubectl=1.20.1-00 
systemctl daemon-reload
systemctl restart kubelet  #这里要重启下kubelet服务
Exit                  #退出root账户
Exit                  #退出ssh登陆的master节点
kubectl uncordon mk8s-master-0  #解除节点调度驱逐
3、验证
kubectl get node -owide
kubectl --version
kubelet --version

题目十五. Etcd备份

此项目无需更改配置环境,但是,在执行此项目之前,请确保您已返回初始点:

[student@mk8s-master-0]$exit

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
客户端铝·/nnt/K1INnn601/eted-client.key

参考答案:

官网地址:https://kubernetes.io/zh/docs/tasks/administer-cluster/configureupgrade-etcd/
文档主页-->任务-->管理集群-->为Kubernetes运行etcd集群
或搜索etcdctl
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 状态排错(送分题)

设置配置环境:

[student@node-1] $

kubectl config use-context wk8s

Task

名为 wk8s-node-0 的 Kubernetes worker node 处于

NotReady 状态。调查发生这种情况的原因,并采取相应措施将node 恢复为Ready状态,确保所做的任何更改永久有效.

可使用以下命令通过 ssh 连接到故障 node:

[student@node-1] $

ssh wk8s-node-0

可使用以下命令在该 node上获取更高权限:

[student@Bks-node-0] $

sudo -i

参考答案:

# 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

参考文章:https://blog.csdn.net/weixin_72758284/article/details/128142352

版权声明:
作者:WaterBear
链接:https://l-t.top/2582.html
来源:雷霆运维
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>
文章目录
关闭
目 录