本文提供了有关Kubernetes认证考试的一份真题
第⼀题:权限控制RBAC
问题权重: 4%
为部署流水线创建一个新的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。
考点:RBAC授权模型的理解。
考点:rbac 🔗
# kubectl config use-context k8s
开始操作 kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
kubectl -n app-team1 create serviceaccount cicd-token
# 题目中要求“限于namespace app-team1中”,则创建rolebinding。没有要求,则创建clusterrolebinding。
kubectl -n app-team1 create rolebinding cicd-token-rolebinding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制 name: lomtom-deployment-clusterrole rules:
- apiGroups: [""] # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets" resources: ["Deployment","StatefulSet","DaemonSet"] verbs: ["create"]
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: # "namespace" 被忽略,因为 ClusterRoles 不受名字空间限制 name: lomtom-deployment-clusterrole rules:
- apiGroups: [""] # 在 HTTP 层面,用来访问 Secret 资源的名称为 "secrets" resources: ["Deployment","StatefulSet","DaemonSet"] verbs: ["create"] [root@dev-user2-96263-y1rby rbac]# cat service-account.yaml apiVersion: v1 kind: ServiceAccount metadata: name: lomtom-cicd-token namespace: lomtom automountServiceAccountToken: false
apiVersion: rbac.authorization.k8s.io/v1
# 此集群角色绑定允许 “manager” 组中的任何人访问任何名字空间中的 Secret 资源
kind: RoleBinding metadata: name: lomtom-role-binding namespace: lomtom subjects:
- kind: ServiceAccount name: lomtom-cicd-token # 'name' 是区分大小写的 namespace: lomtom roleRef: kind: ClusterRole name: lomtom-deployment-clusterrole apiGroup: rbac.authorization.k8s.io
第⼆题:设置节点不可用
问题权重: 4%
Task 将名カek8s-node.1 的node没置カ不可用,并重新凋度该node上所有运行的pods
考点: drain node 🔗
kubectl drain
第三题:升级 kubeadm
- 设置配置环境 kubectl config use-context mk8s
- 现有的 kubernetes 集群正在运行的版本是 1.21.0。仅将主节点上的所有 kubernetes 控制平面 和节点组件升级到版本 1.21.1。
- 另外,在主节点上升级 kubelet 和 kubectl。
确保在升级前 drain 主节点,并在升级后 uncordon 主节点。请不要升级工作节点,etcd,container管理器,CNI 插件,DNS服务或任何其他插件。
第四题:备份还原 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
考点:etcd 🔗
etcdctl --endpoints=https://127.0.0.1:2379 \ --cacert= --cert= --key= \ snapshot save
etcdctl --data-dir snapshot restore snapshotdb
第五题:配置⽹络策略 NetworkPolicy
问题权重: 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的访问
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-port-from-namespace namespace: lomtom spec: podSelector: {} policyTypes: - Egress egress: - to: - namespaceSelector: matchLabels: project: lomtom ports: - protocol: TCP port: 8080
第六题:创建Service
问题权重: 7% 设置配置环境: [student@node-1] $| kubectl config use- context k8s
Task 请重新配置现有的部署front-end以及添加名为http的端口规范来公开现有容器nginx 的端口80/tcp。 创建一个名为front-end-svc的新服务,以公开容器端口http。 配置此服务,以通过在排定的节点上的NodePort来公开各个Pods
kubectl run front-end --image nginx --port 80 -n lomtom
kubectl expose pod front-end --name front-end-svc --port 80 --target-port 80 --type NodePort -n lomtom
第七题:按要求创建 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 /hello
考点:ingerss 🔗
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: pong namespace: lomtom annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - http: paths: - path: /hello pathType: Prefix backend: service: name: hello port: number: 5678
第⼋题:扩容Deployment
问题权重: 4% 设置配置环境: [student@node-1] $ kubeotl corfig use- context k8s Task 将deployment 从loadbalancer 扩展至 5 pods
kubectl create deployment loadbalancer --image=nginx --replicas=1 -n lomtom
考点:deploy 🔗
kubectl scale deployment/loadbalancer --replicas=5 -n lomtom
第九题:调度 pod 到指定节点
问题权重: 4% 设置配置环境: [student@node-1] $ kubectl config use-context k8s Task 按如下要求调度一个 cod: 名称: nginx-kusc00401 Image: nginx Node selector: disk=ssd
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: nginx-kusc00401 name: nginx-kusc00401 namespace: lomtom spec: containers:
- image: nginx name: nginx-kusc00401 nodeSelector: disk: ssd
第⼗题: 统计ready 状态节点数量
问题权重: 4% 设置配置环境: [student@node-1] $ kubectl config use-context k8s
Task 检查有多少worker nodes已准备就绪(不包括被打上Taint: NoSchedule的节点),并将数量写入 /opt/KUSC00402/kusc00402.txt
kubectl describe nodes $(kubectl get nodes | grep Ready| awk '{print $1}') | grep Tain | grep -vc NoSchedule > /opt/KUSC00402/kusc00402.txt
第⼗⼀题:创建多容器的pod
问题权重: 4% 设置配置环境: [student@node-1] $ kubectl config use-context k8s Task 创建一个名为kucc4 的pod, 在pod里面分别为以下每个images单独运行一个app container (可能会有1-4个images) : nginx + redis + memcached
apiVersion: v1 kind: Pod metadata: creationTimestamp: null labels: run: kucc4 name: kucc4 namespace: lomtom spec: containers:
- image: nginx name: nginx
- image: redis name: redis
- image: memcached name: memcached
第⼗⼆题:按要求创建PV
问题权重: 4% 设置配置环境: [student@node-1] $| kubectl config use-context hk8s Task 创建名为app-data 的persistent volume,容量为2Gi,访问模式为ReadWriteOnce 。volume 类型为hostPath, 位于/srv/app-data
考点:volume 🔗
apiVersion: v1 kind: PersistentVolume metadata: name: app-data namespace: lomtom spec: capacity: storage: 1Gi volumeMode: Filesystem accessModes:
- ReadWriteOnce hostPath: path: /srv/app-data
第⼗三题:创建和使⽤PVC
问题权重: 7% 设置配置环境: [student@node-1] $ kubectl config use- context ok8s Task 创建一个新的PersistentVolumeClaim ; 名称: pvc-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,并记录此更改。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-volume labels: type: local spec: storageClassName: csi-hostpath-sc capacity: storage: 1Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data"
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-volume namespace: lomtom spec: storageClassName: csi-hostpath-sc accessModes: - ReadWriteOnce resources: requests: storage: 10Mi
apiVersion: v1 kind: Pod metadata: name: web-server namespace: lomtom spec: volumes: - name: pvc-volume persistentVolumeClaim: claimName: pvc-volume containers: - name: nginx image: nginx ports: - containerPort: 80 name: "http-server" volumeMounts: - mountPath: "/usr/share/nginx/html" name: pvc-volume
第⼗四题:监控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
第⼗五题:添加 sidecar 容器并输出⽇志
问题权重: 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以外,请勿更改现有容器的规格。
第⼗六题:查看 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 (已存在)
第⼗七题:排查集群中故障节点
问题权重: 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