【Kubernetes理论篇】2023年最新CKA考题+解析

文章目录

第一题:RBAC授权访问控制

官方参考地址:https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/

考题:创建一个名为deploy-role的clusterrole,该clusterrole只允许对deployment、daemonset、statefulset具有create权限,基于现有的名称空间 topic-1中创建一个名为cicd-token-user的 serviceaccount。

限于名称空间 topic-1中,将clusterrole deploy-role绑定到serviceaccount cicd-token-user。

解题:

1、创建ClusteRrole角色

bash 复制代码
kubectl create clusterrole deploy-role --verb=create --resource=deployments,daemonsets,statefulsets

2、创建ServiceAccount账户

bas 复制代码
kubectl create serviceaccount cicd-token-user -n topic-1

3、创建RoleBinding将角色与账户绑定

bash 复制代码
kubectl create rolebinding cicd-token-bind --clusterrole=deploy-role --serviceaccount=topic-1:cicd-token-user  -n topic-1

4、验证绑定信息

bash 复制代码
kubectl describe rolebinding cicd-token-bind -n topic-1

第二题:Node节点维护

官方参考地址:https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/

考题:将k8s-node-1节点设置为不可用,然后重新调度该节点上的所有Pod

解题:

1、设置节点不可调度

bash 复制代码
kubectl cordon k8s-node-1

2、驱除k8s-node-1节点上Pod

bash 复制代码
kubectl drain k8s-node-1 --ignore-daemonsets --delete-emptydir-data --force

第三题:K8S集群版本升级

官方参考地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

考题:现有的Kubernetes 集群正在运行版本1.23.1。仅将master节点上的所有 Kubernetes控制平面和节点组件升级到版本1.23.2。

确保在升级之前 drain k8s-master-1节点,并在升级后 uncordon k8s-master-1节点。

另外,在主节点上升级kubelet和kubectl,请不要升级工作节点,etcd,container 管理器,CNI插件, DNS服务或任何其他插件。

解题:

1、驱除节点pod

bash 复制代码
kubectl cordon k8s-master-1
kubectl drain k8s-master-1 --delete-emptydir-data --ignore-daemonsets --force

2、将kubeadm升级到1.23.2版本

bash 复制代码
apt-cache show kubeadm|grep 1.23.2
apt-get update
apt-get install kubeadm=1.23.2-00
Do you want to continue? [Y/n] y

3、验证升级计划

bash 复制代码
kubeadm version
kubeadm upgrade plan

5、选择升级的版本 v1.23.2,忽略etcd升级

bash 复制代码
kubeadm upgrade apply v1.23.2 --etcd-upgrade
[upgrade/confirm] Are you sure you want to proceed with the upgrade? [y/N]: y

正确升级完成后会显示下图:

5、升级kubelet、kubectl

bash 复制代码
apt-get install kubelet=1.23.2-00 kubectl=1.23.2-00
Do you want to continue? [Y/n] y
kubelet --version
kubectl version

6、设置节点可调度

bash 复制代码
kubectl uncordon k8s-master-1
kubectl get nodes

第四题:ETCD数据库备份恢复

官方参考地址:https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/

考题:首先,为运行在https://127.0.0.1:2379上的现有 etcd 实例创建快照并将快照保存到 /tmp/etcd-snapshot.db文件

然后还原位于/tmp/etcd-snapshot-previous.db的现有先前快照。

提供了以下TLS证书和密钥,以通过etcdctl连接到服务器。

  • CA 证书: /etc/kubernetes/pki/etcd/ca.crt
  • 客户端证书: /etc/kubernetes/pki/etcd/server.crt
  • 客户端密钥: /etc/kubernetes/pki/etcd/server.key

解题:

1、备份ETCD数据

bash 复制代码
export ETCDCTL_API=3

etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot save  /tmp/etcd-snapshot.db

2、恢复ETCD数据

bash 复制代码
etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key snapshot restore /tmp/etcd-snapshot-previous.db

第五题:NetworkPolicy网络策略

官方参考地址::https://kubernetes.io/docs/concepts/services-networking/network-policies/

考题:基于已经存在的 topic-5 名称空间中创建一个名为allow-port的新NetworkPolicy。

确保新的NetworkPolicy允许echo名称空间中的Pods连接到名称空间topic-5中的Pods的9900端口。

进一步确保新的NetworkPolicy:

  • 不允许对没有在监听端口9900的Pods的访问
  • 不允许非来自名称空间echo中的Pods的访问

解题:

1、给echo名称空间打一个标签

bash 复制代码
kubectl label ns echo project=echo

2、编写资源清单 && 执行资源清单

yaml 复制代码
vim networkpolicy.yaml
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port
  namespace: topic-5
spec:
  podSelector:
    matchLabels: {}
  policyTypes:
    - Ingress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              project: echo
      ports:
        - protocol: TCP
          port: 9900
bash 复制代码
kubectl apply -f networkpolicy.yaml

第六题:Service四层负载

官网参考地址:http://kubernetes.io/docs/concepts/workloads/controllers/deployment

https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/

考题:重新配置一个已经存在的front-end的deployment,在名字为nginx的容器里面添加一个端口配置,名字为http,暴露端口号为80,然后创建一个service,名字为front-svc,暴露该deployment的http端口,并且service的类型为NodePort。

解题:

1、添加deployment暴露端口配置

yaml 复制代码
kubectl edit deployment front-end

2、编写service资源清单 && 执行资源清单

yaml 复制代码
vim front-svc.yml 
---
apiVersion: v1
kind: Service
metadata:
  name: front-svc
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
    - port: 80
      targetPort: http
bash 复制代码
kubectl apply -f front-svc.yml 

3、验证service是否关联到Pod

bash 复制代码
kubectl describe svc front-svc

第七题:Ingress七层负载

官网参考地址::http://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource

考题:如下创建一个nginx Ingress资源满足一下要求:

  • 名称:ingress-topic-7

  • 名称空间:topic-7

  • 使用服务端口 6686在路径 /go 上公开服务 go

解题:

1、创建 ingressclass && 执行

yaml 复制代码
vim ingressclass.yml 
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  labels:
    app.kubernetes.io/component: controller
  name: nginx-example
  namespace: topic-7
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: k8s.io/ingress-nginx
bash 复制代码
kubectl apply -f ingressclass.yml 

2、创建ingress规则 && 执行

yaml 复制代码
vim ingress.yml 
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress.yml 
  namespace: topic-7
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /go
        pathType: Prefix
        backend:
          service:
            name: go
            port:
              number: 6686

第八题:DeployMent管理Pod扩容(送分题)

考题:将loadbalancer的deployment管理的Pod的副本数扩容成6个

解题:

1、修改副本为6

bash 复制代码
kubectl edit deployment loadbalancer

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2、验证副本数

bash 复制代码
kubectl get deployment loadbalancer

第九题:Pod指定调度节点

官方参考地址::https://kubernetes.io/docs/tasks/configure-pod-container/assign-pods-nodes/

考题:创建一个Pod,名字为topic-9,镜像地址是nginx,调度到具有env=uat标签的节点上

解题:

yaml 复制代码
vim topic-9-pods.yml 
---
apiVersion: v1
kind: Pod
metadata:
  name: topic-9
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector:
    env: uat
bash 复制代码
kubectl apply -f topic-9-pods.yml 

第十题:检查可用Node节点数量

考题:检查集群中有多少节点为Ready状态(不包括被打上 Taint:NoSchedule 的节点),之后将数量写到/tmp/kube-node.txt文件中。

解题:

bash 复制代码
k8s_ready=$(kubectl get node|grep -w "Ready"|wc -l)
k8s_noschedule=$(kubectl describe node|grep -w Taints|grep "NoSchedule" |wc -l)
k8s_sum=$(( ${k8s_ready} - ${k8s_noschedule} ))
echo ${k8s_sum} > /tmp/kube-node.txt

第十一题:Pod封装多容器(送分题)

考题:创建一个Pod,名字为topic-11,这个Pod包含4容器,为nginx、redis、memcached、consul

解题:

1、创建Pods

yaml 复制代码
cat topic-11-pods.yml 
---
apiVersion: v1
kind: Pod
metadata:
  name: topic-11
spec:
  containers:
  - name: nginx
    image: nginx
  - name: redis
    image: redis
  - name: memcached
    image: memcached
  - name: consul
    image: consul
bash 复制代码
kubectl apply -f topic-11-pods.yml 

2、验证Pods

bash 复制代码
kubectl get pods topic-11

第十二题:PersistentVolume持久化存储卷

官方参考地址::https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-persistentvolume

考题:创建一个persistentvolume,名字为nginx-config,大小为1Gi,访问权限为ReadWriteMany。Volume的类型为hostPath,路径为/tmp/nginx-config

解题:

yaml 复制代码
cat pv.yaml 
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-config
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/tmp/nginx-config"
bash 复制代码
kubectl apply -f pv.yaml

第十三题:PersistentVolumeClaim

官方参考地址:https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#创建-persistentvolumeclaim

考题:创建一个名字为pvc-volume的pvc,指定storageClass为csi-hostpath-sc,大小为20Mi

然后创建一个Pod,名字为web-server,镜像为nginx,并且挂载该PVC至/usr/share/nginx/html,挂载的权限为ReadWriteOnce。之后通过kubectl edit或者kubectl path将pvc改成70Mi,并且记录修改记录。

解题:

1、编写PVC资源清单 && 执行

yaml 复制代码
vim pvc.yaml 
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-volume 
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Mi
  storageClassName: csi-hostpath-sc
bash 复制代码
kubectl apply -f pvc.yaml

2、创建Pod,挂载PV

yaml 复制代码
cat pod-pvc.yaml 
---
apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  volumes:
    - name: pvc-volume
      persistentVolumeClaim:
        claimName: pv-volume
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pvc-volume
bash 复制代码
kubectl apply -f pvc-pods.yaml

3、修改PVC容量为70Mi

第十四题:Pod日志查看(送分题)

考题:监控名为foobar的Pod的日志,并过滤出具有unable-access-website 信息的行,然后将写入到 /tmp/foobar.txt

解题:

bash 复制代码
kubectl logs foobar|grep  unable-access-website >/tmp/foobar.txt

第十五题:Sidecar代理

官方参考地址::http://kubernetes.io/docs/concepts/cluster-administration/logging

考题:使用busybox Image来将名为sidecar的sidecar容器添加到现有的Pod legacy-app上,新的sidecar容器必须运行以下命令:

bash 复制代码
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log

使用volume挂载/var/log/目录,确保sidecar能访问/var/log/legacy-app.log文件

解题:

1、基于legacy-appPod添加新的sidecar容器

bash 复制代码
kubectl get pods legacy-app -o yaml > legacy-app.yml
vim legacy-app.yml

编辑后需要修改以下几个步骤

第一步:添加卷(没有则添加)

第二步:添加自带容器的卷挂着配置

第三步:添加新的容器

2、删除已存在的Pod,执行上面更改完成的配置清单

bash 复制代码
kubectl delete pod legacy-app --force  --grace-period=0
kubectl apply -f legacy-app.yml

3、验证,正常1s会输出一条日志

bash 复制代码
kubectl logs -f  legacy-app -c  sidecar

第十六题:Pod CPU资源使用率

官方参考地址:https://kubernetes.io/docs/reference/kubectl/cheatsheet/#与运行中的-pods-进行交互

考题:找出标签是name=cpu-user的Pod,并过滤出使用CPU最高的Pod,然后把它的名字写在已经存在的/tmp/cpu.txt文件里

解题:

1、查看CPU使用率最高的Pod(name=cpu-user)

bash 复制代码
kubectl top pod -l name=cpu-user --sort-by=cpu -A

2、将查看到Pod名称输出到 /opt/KUTR00401/KUTR00401.txt

bash 复制代码
echo "kube-apiserver-k8s-master-1" > /tmp/cpu.txt

第十七题:K8S集群故障排查(送分题)

考题:一个名为k8s-node-1的节点状态为NotReady,让其他恢复至正常状态,并确认所有的更改开机自动完成。

可以使用以下命令,通过ssh连接到wk8s-node-0节点:

bash 复制代码
ssh qinzt@k8s-node-1

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

bash 复制代码
sudo -i

解题:

1、进入故障节点

bash 复制代码
ssh qinzt@k8s-node-1
sudo -i

2、重启kubelet && 加入开机自启动

bash 复制代码
systemctl status kubelet
systemctl restart kubelet
systemctl enable kubelet

3、退出到原终端

bash 复制代码
exit
exit
相关推荐
蛐蛐蛐1 小时前
在Windows 11上安装Docker的踩坑记录
运维·docker·容器
AI精钢1 小时前
Hermes Agent 整合 OpenCode CLI 的实战经验
人工智能·云原生·aigc
cyber_两只龙宝2 小时前
【Oracle】Oracle之使用DML语言管理表
linux·运维·服务器·数据库·云原生·oracle
古典和浪漫2 小时前
docker file 中设置软链接和在k8s 中配置同步时区 有什么区别,各自优缺点
docker·容器·kubernetes
成为你的宁宁2 小时前
【K8s ServiceAccount 机制原理与 RBAC 权限实战应用】
云原生·容器·kubernetes
尘世壹俗人2 小时前
知识点12---k8s进阶操作方式yaml资源文件
docker·容器·kubernetes
尘世壹俗人2 小时前
知识点13---k8s存储持久化
容器·kubernetes·flask
SilentSamsara2 小时前
Kubernetes 网络模型:CNI 插件与 Pod 间通信的底层实现
网络·云原生·容器·架构·kubernetes·k8s
wuxinyan1233 小时前
Java面试题50:Kubernetes 全栈知识体系之一
java·kubernetes·面试题
牛奶咖啡134 小时前
Docker容器实践——Docker常用基础镜像的解析与选择
docker·容器·docker基础镜像·docker基础镜像选择·docker基础镜像最佳实践·docker基础镜像的分类·docker基础镜像的对比