1. CKA
1.1 RBAC 授权
题目:创建一个名为cicd-team1的 serviceAccount ,使其仅对app-team1命名空间下的 deployment,daemonset,statefulset 资源具有create权限。
答案:
# 创建serviceAccountkubectl create serviceaccount cicd-team1 -n app-team1# 创建clusterrolekubectl create clusterrole deploy-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets# 创建rolebindingkubectl create rolebinding cicd-team1 --clusterrole=deploy-clusterrole --serviceaccount=app-team1:cicd-team1 -n app-team1# 测试验证kubectl --as=system:serviceaccount:app-team1:cicd-team1 get pod -n app-team1kubectl --as=system:serviceaccount:app-team1:cicd-team1 create deployment web --image=nginx -n app-team1
1.2 节点设置为不可用
题目:将名为ek8s-node1的 node 设置为不可用,并重新调度该 node 上的 Pod。
答案:
kubectl drain node01.k8s --ignore-daemonsets
1.3 升级 K8S 版本(kubeadm)
题目:仅升级 Master 主节点,确保升级前 drain 主节点,升级后 uncordon 主节点。
答案:
# drain master01.k8s节点
kubectl drain master01.k8s --ignore-daemonsets
# 查看kubeadm版本
yum list kubeadm --showduplicates
apt list --all-versions kubeadm
# 升级kubeadm
yum install kubeadm-1.22.4-00
apt -y install kubeadm=1.22.4-00
# 升级前检查
kubeadm upgrade plan
# 升级kubeadm
kubeadm upgrade apply v1.22.4 --etcd-upgrade=false
# 升级kubelet和kubectl
apt install -y kubelet=1.22.4-00 kubectl=1.22.4-00
# 重启kubelet
systemctl daemon-reload
systemctl restart kubelet
# 取消不可调度
kubectl uncordon master01.k8s
1.4 Etcd 备份和恢复
题目:备份 Etcd 数据库到/etc/kubernetes/snap.db,并恢复。
答案:
## 备份
# 查看帮助
ETCDCTL_API=3 etcdctl --help
# 备份Etcd数据库
ETCDCTL_API=3 etcdctl snapshot save /etc/kubernetes/snap.db --endpoints=127.0.0.1:2379 --key=/etc/kubernetes/pki/etcd/server.key --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt
## 恢复
# 停止Etcd
systemctl stop etcd
# 确认数据目录位置
systemctl cat etcd
# 备份现有数据目录
mv /var/lib/etcd/default.etcd /var/lib/etcd/default.etcd.bak
# 重新导入Etcd数据
ETCDCTL_API=3 etcdctl snapshot restore /etc/kubernetes/snap.db --data-dir=/var/lib/etcd
# 修改属主权限
chown -R etcd:etcd /var/lib/etcd/
# 启动Etcd
systemctl start etcd
1.5 网络策略
题目:在现有的 namespace my-app中创建一个名为allow-port-from-namespace的新 NetworkPolicy。确保只允许 namespace my-app中的 Pods 连接到 namespace big-corp 中的端口 8080。
答案:
# 给命名空间打标签
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.6 SVC 应用暴露
题目:修改现有的 Deploymentfront-end,添加名为http的端口规范来公开现有容器 nginx 的端口80/tcp,并创建一个名为front-end-svc的 Service,使用NodePort来对我公开 Pods。
答案:
kubectl edit deployment front-end
......
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
ports:
- name: http
containerPort: 80
protocol: TCP
......
kubectl expose deployment front-end --name=front-end-svc --type=NodePort --port=80 --target-port=80
1.7 Ingress
题目:创建一个名为pong,命名空间ing-internal,使用5678端口的 ingress,并在路径/hello上公开服务 hello。
答案:
# 命令行
$ kubectl create ingress pong --rule=/hello=hello:5678 -n ing-internal
# 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
1.8 扩容 Pod 数量
题目:将 deployment loadbalancer 扩容到 5 个 Pod。
答案:
kubectl scale deployment loadbalancer --replicas=5
1.9 nodeSelector
题目:按如下要求调度一个 Pod。
- 名称: nginx-kusc00401
- image:nginx
- Node selector:disk=ssd
答案:
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
spec:
containers:
- name: nginx
image: nginx
nodeSelector:
disk: ssd
1.10 统计准备就绪的节点数量
题目:检查有多少 worker node 节点已准备就绪(不包括被打上 Taint:NoSchedule 的节点),并将数量写入/rot/KUSC00402/kusc00402.txt。
答案:
kubectl describe node `kubectl get nodes | grep Ready | awk '{print $1}'` | grep Taint | grep -vc NoSchedule > /rot/KUSC00402/kusc00402.txt
1.11 Pod 配置多容器
题目:创建一个名为 kucc4 的 pod,在 pod 里面分别为一下每个 images 单独运行一个app container(可能会有 1-4 个 images): nginx + redis + memcached
答案:
apiVersion: v1
kind: Pod
metadata:
name: kucc4
spec:
containers:
- name: nginx
image: nginx
- name: redis
image: redis
- name: memcached
image: memcached
1.12 创建 PV
题目:创建名为app-data的 persistent volume,容量为2Gi,访问模式为ReadWriteOnce。volume 类型为hostPath,位于/srv/app-data。
答案:
apiVersion: v1
kind: PersistentVolume
metadata:
name: app-data
spec:
accessModes:
- ReadWriteOnce
hostPath:
path: /srv/app-data
capacity:
storage: 2Gi
1.13 Pod 使用 PVC
题目:创建一个 PVC
- 名称:pv-volume
- Class:csi-hostpath-sc
- 容量:10Mi
然后创建一个 pod,挂载使用 PVC
- 名称:web-server
- image:nginx
- 挂载路径:
/usr/share/nginx/html
配置 Pod 对 volume 具有 ReadWriteOnce 权限,最后扩容 PVC 容量到20Mi。
答案:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
storageClassName: csi-hostpath-sc
resources:
requests:
storage: 2Gi
accessModes:
- ReadWriteOnce
---
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
containers:
- name: web-server
image: nginx
ports:
- name: http
containerPort: 80
volumeMounts:
- name: test-pvc
mountPath: /usr/share/nginx/html
volumes:
- name: test-pvc
persistentVolumeClaim:
claimName: pv-volume
# pvc 扩容
kubectl edit pvc pv-volume --save-config
1.14 获取 Pod 错误日志
题目:监控 Podbar的日志并提取包含错误file-not-found的日志行,并将其写入/opt/KUTR00101/bar中。
答案:
kubectl logs bar | grep file-not-found > /opt/KUTR00101/bar
1.15 给 Pod 添加一个 sidecar 容器
题目:使用busyboximage 将名为sidecar的 sidecar 容器添加到现有的 Podlegacy-app中。新的 sidecar 容器必须运行以下命令:
/bin/sh -c tail -n+1 -f /var/log/legacy-app.log
使用安装在`/var/log`的 volume,使日志文件`legacy-app.log`可用于 sidecar 容器。<br />答案:
# 使用命令导出原有的Pod yaml文件。
kubectl get pod legacy-app -o yaml > test-pod.yaml
# 修改导出的yaml文件,添加sidecar容器
vim test-pod.yaml
......
spec:
containers:
- name: count
......
volumeMounts:
- name: log
mountPath:/var/log
- image: busybox
name: sidecar
args: ['/bin/sh', '-c', 'tail -n+1 -f /var/log/legacy-app.log']
volumeMounts:
- name: log
mountPath: /var/log
volumes:
- name: log
emptyDir: {}
......
# 删除原来的Pod
kubectl delete pod legacy-app
# apply 修改后的yaml文件
kubectl apply -f test-pod.yaml
1.16 统计使用CPU最高的Pod
题目:通过 pod labelname=cpu-utilizer,找到运行时占用最大量 CPU的 pod,并将 pod 名称写入/opt/KUTR00401/KUTR00401.txt。
答案:
# 查看最高CPU Pod
kubectl top pod -l name=cpu-utilizer --sort-by="cpu" -A
# 写入Pod名称到文件中
echo "<Pod-Name>" > /opt/KUTR00401/KUTR00401.txt
1.17 节点NotReady处理
题目:名为wk8s-node-0的 Kubernetes worker node 处于 NotReady状态,调查发生这种情况的原因,并将 node 恢复为Ready状态。
答案:
ssh wk8s-node-0
sudo -i
# 查看kubelet状态
systemctl status kubelet
# 启动kubelet服务
systemctl enable --now kubelet
