关于kubernetes:cka的考试题目

9次阅读

共计 9191 个字符,预计需要花费 23 分钟才能阅读完成。

1.1 基于角色的访问控制 -RBAC

中文解释:
创立一个名为 deployment-clusterrole 的 clusterrole,该 clusterrole 只容许创立 Deployment、Daemonset、Statefulset 的 create 操作
在名字为 app-team1 的 namespace 下创立一个名为 cicd-token 的 serviceAccount,并且将上一步创立 clusterrole 的权限绑定到该 serviceAccount
解题:

可参考:https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/

https://kubernetes.io/zh/docs…

kubectl create clusterrole deployment-clusterrole –verb=create –resource=deployments,statefulsets,daemonsets

kubectl -n app-team1 create serviceaccount cicd-token

kubectl -n app-team1 create rolebinding cicd-token-binding –clusterrole=deployment-clusterrole –serviceaccount=app-team1:cicd-token

1.2 节点保护 - 指定 node 节点不可用

参考:https://kubernetes.io/docs/re…

中文解释:

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

解题:
$ kubectl config use-context ek8s
$ kubectl cordon ek8s-node-1 #设置节点是不可调度状态
$ kubectl drain ek8s-node-1 –delete-emptydir-data –ignore-daemonsets –force

1.3 K8s 版本升级

翻译:
现有的 Kubernetes 集权正在运行的版本是 1.18.8,仅将主节点上的所有 kubernetes 控制面板和组件降级到版本 1.19.0 另外,在主节点上降级 kubelet 和 kubectl

解题:

参考:https://kubernetes.io/zh/docs/tasks/administer-cluster/kubeadm/kubeadm-upgrade/

设置为保护状态

$ kubectl config use-context mk8s
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 11d v1.19.0
k8s-node01 Ready <none> 8d v1.18.8
k8s-node02 Ready <none> 11d v1.18.8

$ kubectl cordon k8s-master

驱赶 Pod

$ kubectl drain k8s-master –delete-emptydir-data –ignore-daemonsets –force

依照题目提醒 ssh 到一个 master 节点

$ ssh k8s-master
$ apt update
$ apt-cache policy kubeadm | grep 1.19.0 #查看反对哪个版本
$ apt-get install kubeadm=1.19.0-00

验证降级打算

$ kubeadm upgrade plan

看到如下信息,可降级到指定版本

You can now apply the upgrade by executing the following command:

kubeadm upgrade apply v1.19.0

开始降级 Master 节点

$ kubeadm upgrade apply v1.19.0 –etcd-upgrade=false
[upgrade/successful] SUCCESS! Your cluster was upgraded to “v1.19.0”. Enjoy!

[upgrade/kubelet] Now that your control plane is upgraded, please proceed with upgrading your kubelets if you haven’t already done so.

降级 kubectl 和 kubelet

$ apt-get install -y kubelet=1.19.0-00 kubectl=1.19.0-00
$ systemctl daemon-reload
$ systemctl restart kubelet
$ kubectl uncordon k8s-master
node/k8s-master uncordoned
$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 11d v1.19.0
k8s-node01 Ready <none> 8d v1.18.8
k8s-node02 Ready <none> 11d v1.18.8

1.20.0 降级到 1.20.1
$ apt-cache policy kubeadm | grep 1.20.1
$ apt-get install kubeadm=1.20.1-00

$ kubeadm upgrade plan

看到如下信息,可降级到指定版本

You can now apply the upgrade by executing the following command:

kubeadm upgrade apply v1.20.1

kubeadm upgrade apply v1.20.1 –etcd-upgrade=false

降级 kubectl 和 kubelet

$ apt-get install -y kubelet=1.20.1-00 kubectl=1.20.1-00
$ systemctl daemon-reload
$ systemctl restart kubelet

$ kubectl uncordon k8s-master
node/k8s-master uncordoned
$ kubectl get node

1.4 Etcd 数据库备份复原

中文解释:

针对 etcd 实例 https://127.0.0.1:2379 创立一个快照,保留到 /srv/data/etcd-snapshot.db。在创立快照的过程中,如果卡住了,就键入 ctrl+ c 终止,而后重试。而后复原一个曾经存在的快照:/var/lib/backup/etcd-snapshot-previous.db
执行 etcdctl 命令的证书寄存在:ca 证书:/opt/KUIN00601/ca.crt

客户端证书:/opt/KUIN00601/etcd-client.crt
客户端密钥:/opt/KUIN00601/etcd-client.key

解题:

可参考:https://kubernetes.io/zh/docs/tasks/administer-cluster/configure-upgrade-etcd/

#备份

$ export ETCDCTL_API=3
$ etcdctl –endpoints=”https://127.0.0.1:2379″ –cacert=/opt/KUIN000601/ca.crt –cert=/opt/KUIN000601/etcd-client.crt –key=/opt/KUIN000601/etcd-client.key snapshot save /srv/data/etcd-snapshot.db

还原
$ mkdir /opt/backup/ -p
$ cd /etc/kubernetes/manifests && mv kube-* /opt/backup
$ export ETCDCTL_API=3
$etcdctl –endpoints=”https://127.0.0.1:2379″ –cacert=/opt/KUIN000601/ca.crt –cert=/opt/KUIN000601/etcd-client.crt –key=/opt/KUIN000601/etcd-client.key snapshot restore /var/lib/backup/etcd-snapshot-previous.db –data-dir=/var/lib/etcd-restore

$ vim etcd.yaml

将 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

还原 k8s 组件

$ mv /opt/backup/* /etc/kubernetes/manifests
$ systemctl restart kubelet

1.5 网络策略 NetworkPolicy

中文解释:

创立一个名字为 all-port-from-namespace 的 NetworkPolicy,这个 NetworkPolicy 容许 internal 命名空间下的 Pod 拜访该命名空间下的 9000 端口。并且不容许不是 internal 命令空间的下的 Pod 拜访
不容许拜访没有监听 9000 端口的 Pod。

解题:

参考:https://kubernetes.io/zh/docs/concepts/services-networking/network-policies/

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: all-port-from-namespace
namespace: internal
spec:
ingress:

  • from:

    • podSelector: {}
      ports:
    • port: 9000
      protocol: TCP
      podSelector: {}
      policyTypes:
  • Ingress

1.6 四层负载平衡 service

中文解释:

重新配置一个曾经存在的 deployment front-end,在名字为 nginx 的容器外面增加一个端口配置,名字为 http,裸露端口号为 80,而后创立一个 service,名字为 front-end-svc,裸露该 deployment 的 http 端口,并且 service 的类型为 NodePort。

解题:

本题能够参考:https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/

$ kubectl edit deploy front-end

增加如下配置,次要是在 name 为 nginx 的容器下

增加 service:
$
kubectl expose deploy front-end –name=front-end-svc –port=80 –target-port=http –type=NodePort

1.7 七层负载平衡 Ingress

中文解释:

在 ing-internal 命名空间下创立一个 ingress,名字为 pong,代理的 service hi,端口为 5678,配置门路 /hi。验证:拜访 curl -kL <INTERNAL_IP>/hi 会返回 hi

解题:

本地可参考:https://kubernetes.io/zh/docs/concepts/services-networking/ingress/

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: pong
namespace: ing-internal
spec:
rules:

  • http:
    paths:

    • path: /hi
      pathType: Prefix
      backend:
      service:

      name: hi
      port:
        number: 5678
      

1.8 Deployment 治理 pod 扩缩容

中文解释:

扩容名字为 loadbalancer 的 deployment 的正本数为 6 

解题:
$ kubectl config use-context k8s

$ kubectl scale –replicas=6 deployment loadbalancer

或者用 $ kubectl edit deployment loadbalancer 间接在线扩容也能够

1.9 pod 指定节点部署

中文解释:

创立一个 Pod,名字为 nginx-kusc00401,镜像地址是 nginx,调度到具备 disk=spinning 标签的节点上,该题能够参考链接:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/

参考:

https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-pods-nodes/

解题:
$ vim pod-ns.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-kusc00401
labels:

role: nginx-kusc00401

spec:
nodeSelector:

disk: spinning

containers:

- name: nginx
  image: nginx

$ kubectl create -f pod-ns.yaml

1.10 查看 Node 节点的衰弱状态

中文解释:

查看集群中有多少节点为 Ready 状态,并且去除蕴含 NoSchedule 污点的节点。之后将数字写到 /opt/KUSC00402/kusc00402.txt

解题:
$ kubectl config use-context k8s
$ kubectl get node | grep -i ready # 记录总数为 A
$ kubectl describe node | grep Taint | grep NoSchedule # 记录总数为 B

将 A 减 B 的值 x 导入到 /opt/KUSC00402/kusc00402.txt

$ echo x >> /opt/KUSC00402/kusc00402.txt

grep -i: 疏忽字符大小写的差异。

1.11 一个 Pod 封装多个容器

中文解释:

创立一个 Pod,名字为 kucc1,这个 Pod 可能蕴含 1 - 4 容器,该题为四个:nginx+redis+memcached+consul

解题:
apiVersion: v1
kind: Pod
metadata:
name: kucc1
spec:
containers:

  • image: nginx
    name: nginx
  • image: redis
    name: redis
  • image: memchached
    name: memcached
  • image: consul
    name: consul

1.12 长久化存储卷 PersistentVolume

中文解释:

创立一个 pv,名字为 app-config,大小为 2Gi,拜访权限为 ReadWriteMany。Volume 的类型为 hostPath,门路为 /srv/app-config

解题:

参考:https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/

apiVersion: v1
kind: PersistentVolume
metadata:
name: app-config
labels:

type: local

spec:
storageClassName: manual #能够写也能够不写
capacity:

storage: 2Gi

accessModes:

- ReadWriteMany

hostPath:

path: "/srv/app-config"

1.13 PersistentVolumeClaim

中文文档:

创立一个名字为 pv-volume 的 pvc,指定 storageClass 为 csi-hostpath-sc,大小为 10Mi

而后创立一个 Pod,名字为 web-server,镜像为 nginx,并且挂载该 PVC 至 /usr/share/nginx/html,挂载的权限为 ReadWriteOnce。之后通过 kubectl edit 或者 kubectl path 将 pvc 改成 70Mi,并且记录批改记录。
解题:

参考:https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/
创立 PVC:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-volume
spec:
accessModes:

  • ReadWriteOnce
    resources:
    requests:
    storage: 10Mi
    storageClassName: csi-hostpath-sc

创立 Pod:
apiVersion: v1
kind: Pod
metadata:
name: web-server
spec:
containers:

- name: nginx
  image: nginx
  volumeMounts:
  - mountPath: "/usr/share/nginx/html"
    name: pv-volume

volumes:

- name: pv-volume
  persistentVolumeClaim:
    claimName: pv-volume

扩容:

形式一 Patch 命令:kubectl patch pvc pv-volume  -p '{"spec":{"resources":{"requests":{"storage":"70Mi"}}}}' --record

    形式二 edit:

kubectl edit pvc pv-volume

1.14 监控 Pod 日志

中文解释:

监控名为 foobar 的 Pod 的日志,并过滤出具备 unable-access-website 信息的行,而后将写入到 /opt/KUTR00101/foobar

解题:
$ kubectl config use-context k8s
$ kubectl logs foobar | grep unable-access-website > /opt/KUTR00101/foobar

1.15 Sidecar 代理

中文解释:

增加一个名为 busybox 且镜像为 busybox 的 sidecar 到一个曾经存在的名为 legacy-app 的 Pod 上,这个 sidecar 的启动命令为 /bin/sh, -c, 'tail -n+1 -f /var/log/legacy-app.log'。并且这个 sidecar 和原有的镜像挂载一个名为 logs 的 volume,挂载的目录为 /var/log/

解题:

本题答案:https://kubernetes.io/zh/docs/concepts/cluster-administration/logging/
首先将 legacy-app 的 Pod 的 yaml 导出,大抵如下:

$ kubectl get po legacy-app -oyaml > c-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
spec:
containers:

  • name: count
    image: busybox
    args:

    • /bin/sh
    • -c
    • i=0;
      while true;
      do
      echo “$(date) INFO $i” >> /var/log/legacy-ap.log;
      i=$((i+1));
      sleep 1;
      done

再此 yaml 中增加 sidecar 和 volume
$ vim c-sidecar.yaml
apiVersion: v1
kind: Pod
metadata:
name: legacy-app
spec:
containers:

  • name: count
    image: busybox
    args:

    • /bin/sh
    • -c
    • i=0;
      while true;
      do
      echo “$(date) INFO $i” >> /var/log/legacy-ap.log;
      i=$((i+1));
      sleep 1;
      done
      volumeMounts:

    • name: logs
      mountPath: /var/log
  • name: busybox
    image: busybox
    args: [/bin/sh, -c, ‘tail -n+1 -f /var/log/legacy-ap.log’]
    volumeMounts:

    • name: logs
      mountPath: /var/log
      volumes:
  • name: logs
    emptyDir: {}

$ kubectl delete -f c-sidecar.yaml ; kubectl create -f c-sidecar.yaml

1.16 监控 Pod 度量指标

中文解释:

找出具备 name=cpu-user 的 Pod,并过滤出应用 CPU 最高的 Pod,而后把它的名字写在曾经存在的 /opt/KUTR00401/KUTR00401.txt 文件里(留神他没有说指定 namespace。所以须要应用 - A 指定所以 namespace)

解题:
$ kubectl config use-context k8s
$ kubectl top po -A -l name=cpu-user
NAMESPACE NAME CPU(cores) MEMORY(bytes)
kube-system coredns-54d67798b7-hl8xc 7m 8Mi
kube-system coredns-54d67798b7-m4m2q 6m 8Mi

留神这里的 pod 名字以理论名字为准,依照 CPU 那一列进行抉择一个最大的 Pod,另外如果 CPU 的数值是 1 2 3 这样的。是大于带 m 这样的,因为 1 颗 CPU 等于 1000m,留神要用 >> 而不是 >

$ echo “coredns-54d67798b7-hl8xc” >> /opt/KUTR00401/KUTR00401.txt

1.17 集群故障排查 – kubelet 故障

中文解释:

一个名为 wk8s-node- 0 的节点状态为 NotReady,让其余复原至失常状态,并确认所有的更改开机主动实现

解题:
$ ssh wk8s-node-0
$ sudo -i

systemctl status kubelet

systemctl start kubelet

systemctl enable kubelet

主节点故障排查:– 之前的考试题,当初考试应该没有这个题了。
https://kubernetes.io/zh/docs…

正文完
 0