cka

https://www.ixigua.com/7080166741921235492?&&id=7155098884581097997

https://blog.csdn.net/u014481728/article/details/133421594

1.考核知识:基于角色访问控制

练习记录

img

题目内容中文解释

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 节点不可用

题目内容

image

题目内容中文解释

Task切换 k8s 集群环境:kubectl config use-context ek8s

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

官方文档搜索关键字:drain-node

img

1

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 到 master 节点,并切换到 root 下
ssh master01
sudo -i
#升级控制平面节点
# 升级 kubeadm
apt update
# 找到题目要求升级到的指定版本
apt-cache madison kubeadm | grep 1.23.2
# 安装正常的版本
apt-get install kubeadm=1.23.2-00
# 验证下载操作正常,并且 kubeadm 版本正确
kubeadm version
# 验证升级计划:此命令检查你的集群是否可被升级,并取回你要升级的目标版本。 命令也会显示一个包含组件配置版本状态的表格。
kubeadm upgrade plan
# 排除 etcd,升级其他的
kubeadm upgrade apply v1.23.2 --etcd-upgrade=false
# 升级 kubelet 和 kubectl
apt-get install kubelet=1.23.2-00 kubectl=1.23.2-00
# 考试环境中退出 root,退回到 student@master01
[root @master 01 ] # exit

# 考试环境中退出 master01,退回到 student@node-1
[student @master 01 ] $ exit
# 不要输入 exit 多了,否则会退出考试环境的。
# 解除节点的保护
root@cka-master1:~# kubectl uncordon cka-master1
# 检查 master1 是否为 Ready
root@cka-master1:~# kubectl get nodes

4、考核知识:ETCD 数据备份恢复

注意:真实考试时,第 3 题是“升级集群”那道题。建议真正考试时,前 4 道题按照顺序做,特别是第 4 题,且做完后不要再修改,做完第 3 道题,如果没有 exit 退出到 student@node-1,则无法执行 etcdctl 命令,另外这道题没有切换集群,用的是第 3 道题的集群,所以,这道题做完就不要在回来检查或者操作了。etcd 不建议放到最后做,如果最后做,etcd 备份还原可能把所有 pod 都清空了,这个问题有可能会出现,所以前 4 道题按照顺寻做

题目内容

image

题目内容中文解释

此项目无需更改配置环境,但是,在执行此项目之前,请确保您已返回初始节点。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

image

image

做题解答

考试时确认一下 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
# 先检查考试环境有没有题目说的目录 /srv/data/,没有的话则需要自己创建
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




#备份k8s组件yaml文件,随意新建一个目录存放
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/* /etc/kubernetes/manifests/
systemctl restart kubelet

5、考核知识:网络策略 NetworkPolicy

题目内容

image

题目内容中文解释

切换 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
# 编写一个 yaml 文件,注意先输入 ":set paste",防止复制时 yaml 文件空格错序
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

题目内容

image

题目内容中文解释

切换 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
# 检查 deployment 信息
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 # 题目指定的 service 类型
selector:
app: nginx # deployment 中 pod 的标签
ports:
- port: 80 # 题目指定暴露的端口
targetPort: http # 题目指定暴露的 http 端
kubectl apply -f service.yaml

7、考核知识:七层代理 ingress

题目内容

image

题目内容中文解释

切换 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
# 检查 deployment 信息
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 # 题目指定的 service 类型
selector:
app: nginx # deployment 中 pod 的标签
ports:
- port: 80 # 题目指定暴露的端口
targetPort: http # 题目指定暴露的 http 端
kubectl apply -f service.yaml

8、考核知识:Deployment 管理 Pod 扩缩容

题目内容

image

题目内容中文解释

切换 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 指定节点部署

题目内容

image

题目内容中文解释

切换 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、考核知识:检查可用节点数量

题目内容

image

题目内容中文解释

切换 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 封装多个容器

题目内容

image

题目内容中文解释

切换 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

题目内容

image

题目内容中文解释

切换 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: v1
kind: PersistentVolume
metadata:
name: app-config
labels:
type: local
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteMany
hostPath:
path: "/srv/app-config"
kubectl config use-context hk8s
kubectl apply -f pv.yaml

13、考核知识:PersistentVolumeClaims

题目内容

image

题目内容中文解释

切换 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 日志

题目内容

image

题目内容中文解释

切换 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 代理

题目内容

image

题目内容中文解释

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

题目内容

image

题目内容中文解释

切换 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 故障

题目内容

image

题目内容中文解释

切换 k8s 集群环境:kubectl config use-context wk8s

Task

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

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

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

做题解答