1. CKA

1.1 RBAC 授权

题目:创建一个名为cicd-team1的 serviceAccount ,使其仅对app-team1命名空间下的 deployment,daemonset,statefulset 资源具有create权限。
答案:

  1. # 创建serviceAccount
  2. kubectl create serviceaccount cicd-team1 -n app-team1
  3. # 创建clusterrole
  4. kubectl create clusterrole deploy-clusterrole --verb=create --resource=deployments,daemonsets,statefulsets
  5. # 创建rolebinding
  6. kubectl create rolebinding cicd-team1 --clusterrole=deploy-clusterrole --serviceaccount=app-team1:cicd-team1 -n app-team1
  7. # 测试验证
  8. kubectl --as=system:serviceaccount:app-team1:cicd-team1 get pod -n app-team1
  9. kubectl --as=system:serviceaccount:app-team1:cicd-team1 create deployment web --image=nginx -n app-team1

RBAC-官方文档参考链接

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