https://www.ixigua.com/7080166741921235492?&&id=7155098884581097997
https://blog.csdn.net/u014481728/article/details/133421594
1.考核知识:基于角色访问控制 练习记录
题目内容中文解释 Context
为部署流水线创建一个新的 ClusterRole 并将其绑定到范围为特定的 namespace 的特定ServiceAccount。
Task
创建一个名为 deployment-clusterrole 的 clusterrole,该 clusterrole 只允许Deployment、Daemonset、Statefulset 具有 create 权限,在现有的 namespace app-team1 中创建一个名为 cicd-token 的新 ServiceAccount 。限于 namespace app-team1 中,将新的 ClusterRole deployment-clusterrole 绑定到新的 ServiceAccount cicd-token。
官方文档搜索关键字:RBAC
https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/rbac/
1 2 3 4 kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets kubectl create ns app-team1 kubectl create serviceaccount cicd-token -n app-team1 kubectl create clusterrolebinding cicd --clusterrole deployment-clusterrole --serviceaccount app-team1:cicd-token
2.考核知识:节点维护-指定 node 节点不可用 题目内容
题目内容中文解释 Task切换 k8s 集群环境:kubectl config use-context ek8s
将 ek8s-node-1 节点设置为不可用,然后重新调度该节点上的所有 Pod。
官方文档搜索关键字:drain-node
3.考核知识:K8s 版本升级 题目内容 题目内容中文解释 切换 k8s 集群环境:kubectl config use-context mk8s
Task
现有的 Kubernetes 集群正在运行版本 1.23.1。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.23.2。(注意,考试时的集群可能为 1.23.0,会让你从 1.23.0 升级为 1.23.1。甚至是 1.22.1 升级为 1.22.2。所以敲命令时,具体要升级的版本,根据题目要求更改。)
确保在升级之前 drain master 节点,并在升级后 uncordon master 节点。
可以使用以下命令,通过 ssh 连接到 master 节点:
ssh master01
可以使用以下命令,在该 master 节点上获取更高权限:
sudo -i
另外,在主节点上升级 kubelet 和 kubectl。请不要升级工作节点,etcd,container 管理器,CNI 插件, DNS 服务或任何其他插件。
官方文档搜索关键字:upgrade
https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/#determine-which-version-to-upgrade-to
做题解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 kubectl config use-context mk8s kubectl get nodes kubectl cordon master01 kubectl drain master01 --delete-emptydir-data --ignore-daemonsets --force ssh master01 sudo -i apt update apt-cache madison kubeadm | grep 1.23.2 apt-get install kubeadm =1.23.2-00 kubeadm version kubeadm upgrade plan kubeadm upgrade apply v1.23.2 --etcd-upgrade =false apt-get install kubelet =1.23.2-00 kubectl =1.23.2-00 [root @master 01 ] # exit [student @master 01 ] $ exit root@cka-master1:~# kubectl uncordon cka-master1 root@cka-master1:~# kubectl get nodes
4、考核知识:ETCD 数据备份恢复
注意:真实考试时,第 3 题是“升级集群”那道题。建议真正考试时,前 4 道题按照顺序做,特别是第 4 题,且做完后不要再修改,做完第 3 道题,如果没有 exit 退出到 student@node-1,则无法执行 etcdctl 命令,另外这道题没有切换集群,用的是第 3 道题的集群,所以,这道题做完就不要在回来检查或者操作了。etcd 不建议放到最后做,如果最后做,etcd 备份还原可能把所有 pod 都清空了,这个问题有可能会出现,所以前 4 道题按照顺寻做
题目内容
题目内容中文解释 此项目无需更改配置环境,但是,在执行此项目之前,请确保您已返回初始节点。etcd 这道题真实考试为第 4 题,用的集群是真实考试时的上一题的集群,即真题第 3 题 mk8s,所以无需再切换集群了。
Task
首先,为运行在 https://127.0.0.1:2379 上的现有 etcd 实例创建快照并将快照保存到 /srv/data/etcd-snapshot.db 文件。
为给定实例创建快照预计能在几秒钟内完成。 如果该操作似乎挂起,则命令可能有问题。用 CTRL + C 来取消操作然后重试。
然后还原位于 /var/lib/backup/etcd-snapshot-previous.db 的现有先前快照。
提供了以下 TLS 证书和密钥,以通过 etcdctl 连接到服务器:
CA证书: /opt/KUIN00601/ca.crt
客户端证书: /opt/KUIN00601/etcd-client.crt
客户端密钥: /opt/KUIN00601/etcd-client.key
官方文档搜索关键字:upgrade-etcd https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster
做题解答
考试时确认一下 ssh 终端,是在 [student@node-1] $ 下
备份:
如果不使用 export ETCDCTL_API=3,而使用 ETCDCTL_API=3,则下面每条 etcdctl 命令前都要加ETCDCTL_API=3
如果执行时,提示 permission denied,则是权限不够,命令最前面加 sudo 即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 export ETCDCTL_API=3 mkdir -pv /srv/ data/ sudo etcdctl \ --endpoints=https:// 127.0 .0.1 :2379 \ --cacert=/opt/ KUIN00601/ca.crt \ --cert=/opt/ KUIN00601/etcd-client.crt \ --key=/opt/ KUIN00601/etcd-client.key \ snapshot save /srv/ data/etcd-snapshot.db mkdir /opt/ backup -p cd /etc/ kubernetes/manifests && mv kube-* / opt/backup sudo ETCDCTL_API=3 etcdctl \ --endpoints=https:// 127.0 .0.1 :2379 \ --cacert=/opt/ KUIN00601/ca.crt \ --cert=/opt/ KUIN00601/etcd-client.crt \ --key=/opt/ KUIN00601/etcd-client.key \ snapshot restore /var/ lib/backup/ etcd-snapshot-previous.db \ --data-dir=/var/ lib/etcd-restore
–data-dir 是etcd还原到这个指定的目录下,因此要修改etcd.yml文件,etcd挂载的路径
注意:
一定要使用mv命令从 /etc/kubernetes/manifests
把kube-*的yaml文件移走先,这样控制平面就会删除这些pod
1 2 3 4 5 6 7 8 9 10 11 12 13 ## 将volume配置的path:/var/ lib/etcd改成/ var/lib/ etcd-restore volumes: - hostPath: path: /etc/ kubernetes/pki/ etcd type: DirectoryOrCreate name: etcd-certs - hostPath: path: /var/ lib/etcd-restore type: DirectoryOrCreate name: etcd-data 还原组件 mv /opt/ backup
5、考核知识:网络策略 NetworkPolicy 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context hk8s
Task
在现有的 namespace my-app 中创建一个名为 allow-port-from-namespace 的新 NetworkPolicy。
确保新的 NetworkPolicy 允许 namespace 中的 Pods 连接到 namespace my-app 中的Pods 的 9000 端口。
进一步确保新的NetworkPolicy:
不允许对没有在监听端口 9000 的 Pods 的访问
不允许从不在命名空间内部的Pods访问
官方文档搜索关键字: network policy https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/#networkpolicy-resource
做题解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 kubectl config use-context hk8s apiVersion : networking.k8s.io/v1 kind : NetworkPolicy metadata : name : allow-port-from-namespace namespace : my-app spec : podSelector : matchLabels : {} policyTypes : - Ingress ingress : - from: - podSelector: {} ports : - protocol: TCP port : 9000 kubectl apply -f networkpolicy.yaml
6、考核知识:四层代理 service 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context k8s
Task
重新配置一个已经存在的 front-end 的 deployment,在名字为 nginx 的容器里面添加一个端口配置,名字为 http,暴露端口号为 80,然后创建一个 service,名字为 front-end-svc,暴露该deployment 的 http 端,并且 service 的类型为 NodePort。
官方文档搜索关键字:Server https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/#defining-a-service
做题解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 kubectl get deployments front-end kubectl edit deployments front-end ······ imagePullPolicy: Always name: nginx ports: - containerPort: 80 name: http ······ apiVersion: v1 kind: Service metadata: name: front-end-svc spec: type: NodePort selector: app: nginx ports: - port: 80 targetPort: http kubectl apply -f service.yaml
7、考核知识:七层代理 ingress 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context k8s
Task
如下创建一个新的 nginx lngress资源:
名称:pong
Namespace:ing-internal
使用服务端口 5678 在路径 /hi 上公开服务 hi
可以使用以下命令检查服务 hi 的可用性,该命令应返回 hi, curl -kL/hi
官方文档搜索关键字:ingress https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/#the-ingress-resource
做题解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 kubectl get deployments front-end kubectl edit deployments front-end ······ imagePullPolicy: Always name: nginx ports: - containerPort: 80 name: http ······ apiVersion: v1 kind: Service metadata: name: front-end-svc spec: type: NodePort selector: app: nginx ports: - port: 80 targetPort: http kubectl apply -f service.yaml
8、考核知识:Deployment 管理 Pod 扩缩容 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context k8s
Task
将 loadbalancer 的 deployment 管理的 Pod 的副本数扩容成 6 个。
官方文档搜索关键字:deployment https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/#scaling-a-deployment
做题解答 1 2 3 4 5 6 kubectl config use-context k8s kubectl scale deployment loadbalancer --replicas =6 kubectl edit deployment loadbalancer 修改 replicas:6
9、考核知识:Pod 指定节点部署 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context k8s
Task
创建一个 Pod,名字为 nginx-kusc00401,镜像地址是 nginx,调度到具有 disk=spinning 标签的节点上。
官方文档搜索关键字:nodeSelector https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/#%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E5%B0%86%E8%A2%AB%E8%B0%83%E5%BA%A6%E5%88%B0%E4%BD%A0%E9%80%89%E6%8B%A9%E7%9A%84%E8%8A%82%E7%82%B9%E7%9A%84-pod
做题解答 1 2 3 4 5 6 7 8 9 10 11 12 13 kubectl get nodes --show-labels apiVersion : v1 kind : Pod metadata : name : nginx-kusc00401 spec : containers : - name: nginx image : nginx imagePullPolicy : IfNotPresent nodeSelector : disktype : spinning kubectl apply -f nodeselector.yaml
10、考核知识:检查可用节点数量 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context k8s
Task
检查集群中有多少节点为 Ready 状态(不包括被打上 Taint: NoSchedule 的节点),之后将数量写到 /opt/KUSCO0402/kusc00402.txt。
官方文档搜索关键字: 做题解答 1 2 3 4 5 6 7 8 kubectl config use-context k8s 查看集群中状态为 Ready 的节点 kubectl get nodes | grep -w "Ready" kubectl get nodes | grep -w "Ready" | wc -l # 统计具有污点 NoSchedule 的数量 kubectl describe nodes cka-master1 cka-node1 | grep "Taint" | grep "NoSchedule" | wc -l 把结果写入题目中指定的文件 echo "1" > /opt /KUSCO0402/kusc00402.tx
11、考核知识:一个 Pod 封装多个容器 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context k8s
Task
创建一个 Pod,名字为 kucc1,这个 Pod 包含 4 个容器,为 nginx、redis、memcached、consul。
官方文档搜索关键字:Pod https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/#using-pods
做题解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 apiVersion : v1 kind : Pod metadata : name : kucc1 spec : containers : - name: nginx image : nginx - name: redis image : redis - name: memecached image : memecached - name: consul image : consul kubectl config use-context k8s kubectl apply -f pod.yaml
12、考核知识:持久卷 PersistentVolume 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context hk8s
Task
创建一个 pv,名字为 app-config,大小为 2Gi, 访问权限为 ReadWriteMany。Volume 的类型为 hostPath,路径为 /srv/app-config。
官方文档搜索关键字:PV https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-pv
做题解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 apiVersion: v1kind: PersistentVolumemetadata: name: app-config labels: type: localspec: capacity: storage: 2 Gi accessModes: - ReadWriteMany hostPath: path: "/srv/app-config" kubectl config use-context hk8s kubectl apply -f pv.yaml
13、考核知识:PersistentVolumeClaims 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context ok8s
Task
创建一个名字为 pv-volume 的 pvc,指定 storageClass 为 csi-hostpath-sc,大小为 10Mi。然后创建一个 Pod,名字为 web-server,镜像为 nginx,并且挂载该 PVC 至 /usr/share/nginx/html,挂载的权限为 RedWriteOnce。之后通过 kubectl edit 或者 kubectl path 将 pvc 改成 70Mi,并且记录修改记录。
官方文档搜索关键字:pvc https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-pvc
做题解答 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 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: html-volume persistentVolumeClaim: claimName: pv-volume containers: - name: web-server image: nginx volumeMounts: - mountPath: "/usr/share/nginx/html" name: html-volume kubectl config use-context ok8s kubectl apply -f pvc-pod.yaml kubectl edit pvc pv-volume -------- resources: requests: storage: 70Mi storageClassName: csi-hostpath-sc ---------
14、考核知识:查看 Pod 日志 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context k8s
Task
监控名为 foobar 的 Pod 的日志,并过滤出具有 unable-access-website 信息的行,然后将写入到 /opt/KUTR00101/foobar。
官方文档搜索关键字:kubectl logs https://kubernetes.io/zh-cn/docs/reference/kubectl/#%E7%A4%BA%E4%BE%8B-%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C
做题解答 1 2 kubectl config use-context k8s kubectl logs foobar | grep unable-access-website > /opt/ KUTR00101/foobar
15、考核知识:Sidecar 代理 题目内容
题目内容中文解释 Context
将一个现有的 Pod 集成到 Kubernetes 的内置日志记录体系结构中 (例如 kubectl logs)。添加 streaming sidecar 容器是实现此要求的一种好方法。
Task
使用 busybox lmage 来将名为 sidecar 的 sidecar 容器添加到现有的 Pod legacy-app 上,新的 sidecar 容器必须运行以下命令:
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log
使用 volume 挂载 /var/log/ 目录,确保 sidecar 能访问 /var/log/legacy-app.log 文件。
官方文档搜索关键字:logging https://kubernetes.io/zh-cn/docs/concepts/cluster-administration/logging/#%E5%85%B7%E6%9C%89%E6%97%A5%E5%BF%97%E4%BB%A3%E7%90%86%E5%8A%9F%E8%83%BD%E7%9A%84%E8%BE%B9%E8%BD%A6%E5%AE%B9%E5%99%A8
做题解答 16、考核知识:查看 Pod 的 cpu 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context k8s
Task
找出标签是 name=cpu-user 的 Pod,并过滤出使用 CPU 最高的 Pod,然后把它的名字写在已经存在的 /opt/KUTR00401/KUTR00401.txt 文件里(注意他没有说指定 namespace,所以需要使用 -A 指定所有 namespace)。
官方文档搜索关键字:kubectl top pod https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-memory-resource/#specify-a-memory-request-and-a-memory-limit
做题解答 1 2 3 4 5 6 7 8 9 kubectl config use-context k8s kubectl top pod -A -l name =cpu-user --sort-by =cpu -A 将查到的 pod 名字写入 /opt/KUTR00401/KUTR00401.txt 文件中 echo "podname" > /opt/KUTR00401/KUTR00401.txt kubectl top pods -A -l name =cpu-user \ --sort-by =cpu | tail -n +2 | head -1 | awk '{print $2}' \> /opt/KUTR00401/KUTR00401.txt
17、考核知识:集群故障排查 - kubelet 故障 题目内容
题目内容中文解释 切换 k8s 集群环境:kubectl config use-context wk8s
Task
一个名为 wk8s-node-0 的节点状态为 NotReady,让其他恢复至正常状态,并确认所有的更改开机自动完成。
可以使用以下命令,通过 ssh 连接到 wk8s-node-0 节点:ssh wk8s-node-0
可以使用以下命令,在该节点上获取更高权限:sudo -i
做题解答