第一题 RBAC授权
问题权重: 4%
设置配置环境:
[student@node-1] $ kubectl config use-context k8s
Context
为部署管道创建一个新的ClusterRole并将其绑定到范围为特定的namespace 的特定 ServiceAccount .
Task
创建一个名为 deployment-clusterrole 且仅允许创建以下资源类型的新ClusterRole :
Deployment
StatefulSet
DaemonSet
在现有的 namespace app-team1 中创建一个名为 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,daemonsets,statefulsets
kubectl create ns app-team1
kubectl create serviceaccount cicd-token -n app-team1
kubectl create rolebinding cicd-token --serviceaccount=app-team1:cicd-token --clusterrole=deployment-clusterrole -n app-team1
#验证
kubectl --as=system:serviceaccount:app-team1:cicd-token get pods -n app-team1
1
2
3
4
5
6
7
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第二题 节点设置不可用
设置配置环境:
[studentinode-1] $ kubectl config use-context ek8s
问题权重: 4%
Task
将名カek8s-node.1 的node没置カ不可用,并重新凋度该node上所有运行的pods
解题
kubectl config use-context ek8s
kubectl drain k8s21-worker01 --ignore-daemonsets
1
2
注:如果执行drain提示错误,根据提示再加上选项,例如–delete-local-data–force
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第三题 升级K8s版本
问题权重: 7%
设置配置环境:
[student@node-1] $ kubectl config use- context mk8s
Task
现有的Kubernetes集群正在运行版本1.20.0。仅将主节点上的所
有Kubernetes控制平面和节点组件升级到版本1.20.1。
确保在升级之前drain主节点,并在升级后uncordon主节点。
可使用以下命令通过ssh 连接到主节点:
[student@node-1] $| ssh mk8s-master-0
可使用以下命令在该主节点上获取更高权限:
[student@mk8s-master-0] $ sudo -i
另外,在主节点升级kubelet和kubectl。
kubectl config use-context mk8s
kubectl drain mk8s-master-0 --ignore-daemonsets
ssh mk8s-master-0
sudo -i
apt install kubeadm-1.20.1-00 -y
kubeadm upgrade plan
kubeadm upgrade apply v1.20.1 --etcd-upgrade=false # 题目要求不升级etcd
# 升级 kubelet 和 kubectl
apt install kubelet-l.20.1-00 kubectl-l.20.1-00 -y
systemctl restart kubelet
#设置为可调度
kubectl uncordon mk8s-master-0
# 查看升级结果
kubectl get node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第四题 etcd备份与恢复
问题权重: 7%
此项目无需更改配置环境。但是,在执行此项目之前,请确保您已返回初始点:
[student@nk85- master-0] $ exit
Task
首先,为运行在https://127.0.0.1:2379上的现有etcd 实例创建快照并将快照保存到/data/backup/etcd-snapshot.db
为给定实例创建快照预计能在几秒钟内完成。如果该操i作似乎挂起,则命令可能有问题。用CTRL+C 来取消
操作,然后重试。
然后还原位于/data/backup/etcd-snapshot-previous.db的现有先前快照。
提供了以下TLS证书和密钥,以通过etcdctl连接到服务
CA证书: /opt/KUIN00601/ca.crt
客户端证书: /opt/KUIN00601/etcd-client.crt
客户端密钥: /opt/KUIN00601/etcd-client.key
答题:
# 备份
ETCDCTL_API=3 etcdctl snapshot save /data/backup/etcd-snap.db --cacert=/opt/KUIN00601/ca.crt --cert=/opt/KUIN00601/etcd-client.crt --key=/opt/KUIN00601/etcd-client.key --endpoints=https://127.0.0.1:2379
# 恢复
systemctl stop etcd
systemctl cat etcd # 确认下数据目录(--data-dir 值)
mv /var/lib/etcd /var/lib/etcd.bak
ETCDCTL_API=3 etcdctl snapshot restore /data/backup/etcd-snapshot-previous.db --
data-dir=/var/lib/etcd
chown -R etcd:etcd /var/lib/etcd
systemctl start etcd
1
2
3
4
5
6
7
8
9
10
https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第五题 网络策略
问题权重: 7%
设置配置环境:
[studentinode-1] $ kubectl config use-context hk8s
Task
在现有的namespace my-app中创建一个名为allow-port-from-namespace 的新NetworkPolicy 。
确保新的NetworkPolicy 允许namespace my-app 中的Pods来连 接到namespace big-corp 中的端口8080 。
进一步确保新的 NetworkPolicy : 不允许对没有在监听端口8080的Pods的访问 不允午不来自namespace my-app中的Pods的访问
解题:
kubectl config use-context hk8s
#给命名空间打标签:
kubectl label namespace big-corp name=big-corp
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-port-from-namespace
namespace: my-app
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: big-corp
ports:
- protocol: TCP
port: 8080
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
参考文档:https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第六题 SVC 暴露应用
问题权重: 7%
设置配置环境:
[student@node-1] $| kubectl config use- context k8s
Task
请重新配置现有的部署front-end以及添加名为http的端口规范来公开现有容器nginx 的端口80/tcp。
创建一个名为front-end-svc的新服务,以公开容器端口http。
配置此服务,以通过在排定的节点上的NodePort来公开各个Pods
kubectl config use-context k8s
kubectl create deployment --image=nginx --port=80 front-end
kubectl edit deployment front-end修改port的名字
.....
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- containerPort: 80
name: http
protocol: TCP
.......
kubectl expose deployment front-end --port=80 --target-port=80 --type="NodePort" --name=front-end-svc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第七题:Ingress
问题权重: 7%
设置配置环境:
[student@mnode-1] $ kubectl config use-context k8s
Task
如下创建一个新的nginx Ingress 资源:
名称: pong
Namespace: ing-internal使用服务端口5678 在路径/hello. 上公开服务hello
可以使用以下命令检查服务hello 的可用性,该命令应返回hello :
[student@node-1] $| curl -kL <INTERNAL_ IP>/hello
# 以下考试无需要操作
kubectl create ns ing-internal
kubectl create deployment hello --image=nginx --port=80 --namespace=ing-internal
kubectl expose deployment hello --port=5678 --target-port=80 --name=hello --namespace=ing-internal
kubectl exec -it hello-8fd7d4d77-2kdv9 -- /bin/bash -n ing-internal
echo "hello" > /usr/share/nginx/html/index.html
# 以下考试操作
cat 7.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- http:
paths:
- path: /hello
pathType: Prefix
backend:
service:
name: hello
port:
number: 5678
curl -kL <INTERNAL_ IP>/hello
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
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第八题 扩容 Pod 数量
问题权重: 4%
设置配置环境:
[student@node-1] $ kubeotl corfig use- context k8s
Task
将deployment 从loadbalancer 扩展至 5 pods
解题:
#以下考试不需要操作
kubectl create deployment loadbalancer --image=nginx --replicas=1
#以下考试操作
kubectl config use-context k8s
kubectl scale deployment loadbalancer --replicas=5
1
2
3
4
5
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第九题 nodeSelector
问题权重: 4%
设置配置环境:
[student@node-1] $ kubectl config use-context k8s
Task
按如下要求调度一个 cod:
名称: nginx-kusc00401
Image: nginx
Node selector: disk=ssd
解题:
# 以下考试无需要操作
kubectl label node k8s21-worker02 disk=ssd
# 以下考试操作
kubectl config use-context k8s
cat 9.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disk: ssd
kubectl apply -f 9.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第十题统计准备就绪节点数量
问题权重: 4%
设置配置环境:
[student@node-1] $ kubectl config use-context k8s
Task
检查有多少worker nodes已准备就绪(不包括被打上Taint:
NoSchedule的节点),并将数量写入
/opt/KUSC00402/kusc00402.txt
解题:
kubectl config use-context k8s
kubectl describe nodes $(kubectl get nodes | grep Ready| awk '{print $1}') | grep Tain | grep -vc NoSchedule > /opt/KUSC00402/kusc00402.txt
1
2
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第十一题 Pod 配置多容器
问题权重: 4%
设置配置环境:
[student@node-1] $ kubectl config use-context k8s
Task
创建一个名为kucc4 的pod, 在pod里面分别为以下每个images单独运行一个app container (可能会有1-4个images) :
nginx + redis + memcached
解题:
kubectl config use-context k8s
cat 11.yaml
kind: Pod
apiVersion: v1
metadata:
name: kubcc4
spec:
containers:
- name: nginx
image: nginx
- name: redis
image: redis
- name: memcached
image: memcached
kubectl apply -f 11.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第十二题 创建 PV
问题权重: 4%
设置配置环境:
[student@node-1] $| kubectl config use-context hk8s
Task
创建名为app-data 的persistent volume,容量为2Gi,访问模式为ReadWriteOnce 。volume 类型为hostPath, 位于/srv/app-data
答题:
kubectl config use-context hk8s
cat 12.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-data
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/srv/app-data"
kubectl apply -f 12.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第十三题 Pod 使用 PVC
问题权重: 7%
设置配置环境:
[student@node-1] $ kubectl config use- context ok8s
Task
创建一个新的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将PersistentVolumeClaim的容量扩展为70Mi,并记录此更改。
kubectl config use- context ok8s
# cat 12.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: nfs-server
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Mi
---
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: pv-volume
containers:
- name: web-server
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage
kubectl apply -f 12.yaml
# 扩容 PVC 容量
kubectl edit pvc pv-volume --save-config
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
https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第十四题 获取 Pod 错误日志
问题权重: 5%
设置配置环境:
[student@node-1] $ kubectl config use-context k8s
Task
监控pod bar的日志并:
提取与错误file-not-found 相对应的日志行
将这些日志行写入/opt/KUTR00101/bar
kubectl logs bar | grep file-not-found > /opt/KUTR00101/bar
1
https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第十五题 给 Pod 增加一个容器(边车)
问题权重: 7%
设置配置环境:
[studentnode-1] $ kubectl config use- context k8s
Context
将一个现有的Pod集成到Kubernetes的内置日志记录体系结构中(例如kubectl logs) 。添加streaning sidecar容器是实现此要求的一种好方法。
Task
使用busybox Image来将名为sidecar的sidecar容器添加到现有的Pod legacy-app 中。新的sidecar容器必须运行以下命令:
/bin/sh -c tail -n+1 -f /var/1og/legacy-app . log
使用安装在/var/log的Volume,使日志文件legacy-app.log可用于sidecar容器。
除了添加所需的volume mount以外,请勿更改现有容器的规格。
kubectl config use-context k8s
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i: $(date)" >> /var/log/legacy-app.log;
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
volumes: # volumes 块在导出的 yaml 下面已经有了,在已有的添加下面两行即可
- name: varlog
emptyDir: {}
kubectl get pod legacy-app -o yaml > legacy-app.yaml # 导出后修改文件
kubectl delete pod legacy-app
kubectl apply -f legacy-app.yaml
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
https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第十六题 统计使用 CPU 最高的 Pod
问题权重: 5%
设置配置环境:
[student@node-1] $ kubectl config use- context k8s
Task
通过pod label name=cpu-utilizer,找到运行时占用大量CPU的
pod,并将占用CPU最高的pod名称写入文件
/opt/KUTR00401/KUTR00401.txt (已存在)
答题:
kubectl config use-context k8s
kubectl top pod -l name=cpu-utilizer --sort-by="cpu" –A # 然后将第一个 Pod 名称写到文件
echo "<podname>" > /opt/KUR00401.txt
1
2
3
本博客相关视频链接: https://www.ixigua.com/7080166741921235492?id=7151713414783042085
第十七题 节点 NotReady 处理
问题权重: 13%
设置配置环境:
[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@w8ks-node-0] $ sudo -i
1
2
3
4
答题:
kubectl config use-context wk8s
kubectl get node
ssh wk8s-node-0
sudo -i
systemctl status kubelet
systemctl start kubelet
systemctl enable kubelet