CKA认证考题

1.RBAC 4%

Context

为部署管道创建一个新的ClusterRole并将其绑定到范围内特定的namespace的特定ServiceAccount

Task

创建一个名为deployment-clusterrole且仅允许创建以下资源类型的新ClusterRule

Deployment
StatefulSet
DaemonSet
在现有的namespace app-team1中创建一个名为cicd-token的新ServiceAccount
限于namespace app-team1,将新的ClusterRole deployment-clusterrole绑定到新的ServiceAccount cicd-
token

解题思路:

#第一步:命令补全
source < (kubectl completion bash)
#第二步:创建ClusterRole(通过kubectl create clusterrule -h)
kubectl create clusterrole deployment-clusterrole --verb=create --resource=deployments,statefulsets,daemonsets
#第三步:创建ServiceAccount
kubectl create serviceaccount cicd-token -napp-team1
#第四步:将ClusterRole和ServiceAccount进行绑定(指定ns就创建rolebinding,不指定ns就创建clusterrolebinding)
kubectl create rolebinding cicd-token-binding --clusterrole=deployment-clusterrole --serviceaccount=app-team1:cicd-token -napp-team1

kata 容器 验证_kubernetes

2.驱逐节点 4%

Task
将名为ek8s-node-1的节点设置为不可用,并重新调度在其上运行的所有Pod。

解题思路:

#第一步:驱逐node上所有pod,node状态变为noschedule
Kubectl drain ek8s-node-1 --ignore-daemonsets --force

3.集群升级 7%

Task
现有的Kubernetes集群正在运行版本1.18.8.仅将主节点上的所有Kubernetes控制平面和节点组件升级到版本
1.19.0
另外,在主节点上升级Kubelet和Kubectl
确定在升级之前drain主节点,并在升级后uncordon主节点。请不要升级工作节点,etcd,container管理器,
CNI插件,DNS服务或任何其他插件。

解题思路:

#第一步:连接到master节点
ssh k8s-master
#第二步:使用root用户驱逐节点
su root
Kubectl drain k8s-master 
#第三步:安装1.19版本
apt-cache show kubeadm|grep 1.19.0
apt-get install kubeadm=1.19.0-00
#第四步:使用Kubeadm升级K8s 
kubeadm upgrade apply 1.19.0 --etcd-upgrade=false
#第五步:升级kubelet
apt-get install kubectl=1.19.0-00
#第六步:恢复master节点
kubectl uncordon k8s-master

4.ETCD备份恢复 7%

Task
首先,为运行在https://127.0.0.2379上的现有etcd实例创建快照并将快照保到/var/lib/backup/etcd-snapshot.db
然后还原位于 /var/lib/bakup/etcd-snapshot-previous.db
提供了以下TLS证书与密钥,以通过etcdctl连接到服务器
CA证书:/opt/KUIN00601/ca.crt
客户端证书:/opt/KUIN00601/etcd-client.crt
客户端密钥:/opt/KUIN00601/etcd-client.key

解题思路:

#第一步:指定etcdctl版本
export ETCDCTL_API=3
#第二步:给etcd做快照
etcdctl --endpoints=https://127.0.0.2379 --cacert="/opt/KUIN00601/ca.crt" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot save /var/lib/backup/etcd-snapshot.db
#第三步:查看快照是否创建成功
etcdctl --endpoints=https://127.0.0.2379 --cacert="/opt/KUIN00601/ca.crt" --cert="/opt/KUIN00601/etcd-client.crt" --key="/opt/KUIN00601/etcd-client.key" snapshot status /var/lib/backup/etcd-snapshot.db -wtable
#第四步:恢复快照
etcdctl snapshot restore /var/lib/bakup/etcd-snapshot-previous.db
#第五步:查看恢复快照状态
etcdctl snapshot status /var/lib/bakup/etcd-snapshot-previous.db -wtable

PS:做完题目之后退回work节点终端界面

5.网络策略 4%

Task
在已有的namespace foobar中创建一个名为allow-port-from-namespace的新NetworkPolicy,以允许
namespace corp-bar访问其Pods的端口9200
解题思路:

#第一步:从k8s官网拷贝yaml模板(粘贴注意格式:set paste)
vim NetworkPolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-port-from-namespace
  namespace: foobar
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          project: corp-bar
    ports:
    - protocol: TCP
      port: 9200
#第二步:创建NetworkPolicy
kubectl apply -f NetworkPolicy.yaml

6.SVC 4%

Task
重新配置现有的deployment front-end,并添加名为HTTP的端口规范,以暴露现有容器nginx的端口80/
tcp。
创建一个名为front-end-svc的新服务,以暴露容器端口HTTP。
配置新服务以通过调度它们的节点上的NodePort暴露各个Pod

解题思路:

#第一步:修改deployment的yaml
添加以下一行:spec.template.spec.containers
name: nginx
ports:
- containerPort: 80
  name: http
#第二步:创建svc
kubectl create svc front-end-svc nodeport --tcp=80:80
#第三步:检查svc和deployment的标签是否一致
kubectl get deployment front-end --show-labels
kubectl get svc front-end-svc --show-labels
#第四步:检查是否成功
kubectl get svc front-end-svc
curl $ClusterIP
curl $nodeIP+随机端口

PS:在检查时一定进入k8s集群中,考试中不能跨集群curl,ssh到任何一个work节点再curl

7.Ingress 7%

Task
创建一个名为nginx的Ingress并遵守以下规则
Name:pong
Namespace:ing-internal
Exposing service hello on path /hello 使用端口5678
验证
curl -KL <INTERNAL_IP>/hello

解题思路:

#第一步:在k8s官网拷贝ingress模板
vim ingress.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
#第二步:创建ingress
kubectl apply -f ingress.yaml
#第三步:验证
kubectl get ingress pong -n ing-internal -o yaml(查看INTERNAL_IP)
curl -KL <INTERNAL_IP>/hello
#返回hello证明成功

8.扩容 4%

Task
将deployment web-server扩容到4个pods

解题思路:

kubectl get deployment -A
kubectl scale --replicas=4 deployment web-server
kubectl get pod

9.通过node标签调度pod 4%

Task
按以下规则调度pod:
name:ngux-kusc00401
image:nginx
Node selector:disk=ssd

解题思路:

#第一步:查看当前集群所有node的标签
kubectl get node --show-labels
#第二步:创建pod
kubectl run --generator=run-pod/v1 ngux-kusc00401 --image=nginx --dry-run -o yaml>nginx1.yaml (V1.17.0)
kubectl run  ngux-kusc00401 --image=nginx --dry-run=client -o yaml>nginx1.yaml (V1.20.0以上)
#第三步:编辑yaml
vim nginx.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: ngux-kusc00401
  name: ngux-kusc00401
spec:
  containers:
  - image: nginx
    name: ngux-kusc00401
    resources: {}
#添加一行:
  nodeSelector:
    disk: ssd
  dnsPolicy: ClusterFirst
  restartPolicy: Always
#第四步:执行yaml并检查是否running
kubectl apply -f nginx.yaml

10.节点数量 4%

Task
检查并查看有多少个节点准备就绪(不包括已获得Noschedule的节点)并将其写
入/opt/KUSC00402/kusc00402.txt

解题思路:

#第一步:查看当前集群中的Node有没有污点
kubectl describe node|grep Taint
#第二步:将结果输入到文件中
echo 2>/opt/KUSC00402/kusc00402.txt

11.创建多容器pod 4%

Task
创建一个名为kucc8的pod,并且使用以下镜像(可能指定了1至4个镜像)
nginx+redis+memcached+consul

解题思路:

#第一步:创建yaml模板文件
kubectl run kucc8 --image=nginx --dry-run=client -o yaml>kucc8.yaml
#第二步:编辑yaml文件
vim kucc8.yaml
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: kucc8
  name: kucc8
spec:
  containers:
  - image: nginx
    name: nginx
#添加以下内容:
  - image: redis
    name: redis
  - image: memcached
    name: memcached
  - image: consul
    name: consul
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}
#第四步:查看结果
kubectl apply -f kucc8.yaml

12.pv 4%

Task
创建一个名为app-config的的pv,1Gi大小,权限为ReadOnlyMany便用hostPath类型挂载本地位置
为/srv/app-config

解题思路:

#第一步:从官网复制模板
vim app-config.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: app-config
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadOnlyMany
  hostPath:
    path: "/srv/app-config"
#第二步:创建pv并检查
kubectl apply -f app-config.yaml
kubectl get pv

13.pvc 7%

Task
创建一个pvc满足以下要求:
Name:pv-volume
Class:csi-hostpath-sc
Capcity: 10Mi
创建一个pod并挂载PVC:
name:test
image.:nginx
Mount path:/usr/share/nginx/html
编辑pod volume权限为ReadWriteOnce
最后,使用kubectl edit或者kubectl patch将pvc大小改为70Mi

解题思路:

#创建pvc
vim pv-volume.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pv-volume
spec:
  storageClassName: csi-hostpath-sc
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Mi

kubectl apply -f vim pv-volume.yaml
#创建pod
apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  volumes:
    - name: pv-volume
      persistentVolumeClaim:
        claimName: pv-volume
  containers:
    - name: nginx
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: pv-volume
kubectl apply -f nginx.yaml
#修改PVC大小
kubectl edit pv-volume --record

14.输出日志 5%

Task
监控bar的日志
并将error字段内容输出到 /opt/KUTR00101/bar

解题思路:

kubectl logs bar |grep error >>/opt/KUTR00101/bar

15.sidecar 13%

Task
在pod big-corp-app中增加一个busybox的sidecar,新的sidecar容器使用以下命令:
/bin/sh -c tail -n+1-f /var/log/big-corp-app.log
挂载一个卷的名字叫logs并确保/var/log/big-corp-app.log文件在sidecar中可达
不要修改已经存在的容器
不要修改日志路径与文件

解题思路:

#编辑yaml文件
kubectl get pod big-corp-app -o yaml>new.yaml
vim new.yaml
#找对位置分别添加以下内容:
    volumeMounts:
    - name: logs
      mountPath: /var/log
  - name: busybox
    image: busybox
    args: [/bin/sh, -c, 'tail -n+1 -f /var/log/big-corp-app.log']
    volumeMounts:
    - name: logs
      mountPath: /var/log
  volumes:
  - name: logs
    emptyDir: {}

kubectl delete -f new.yaml
kubectl apply -f new.yaml
#检查pod状态和日志
kubectl exec big-corp-app -c busybox -- tail -f /var/log/big-corp-app.log

16.top 5%

Task
从pod标签为name=cpu-loader中找到CPU负载最大的pod名称,并输出到
/opt/KUTR00401/KUTR00401.txt(该文件已经存在)

解题思路:

kubectl top pod -A -l name=cpu-loader --sort-by='cpu' 
echo ${pod_name}>>/opt/KUTR00401/KUTR00401.txt

17.kubelet 13%

Task
名为wk8s-node-0的工作节点状态为NotReady,找到并解决此问题

解题思路:

ssh wk8s-node-0
systemctl status kubelet
systemctl start kubelet
systemctl enable kubelet
exit

18. pod 的滚动更新与回滚

Task
将 deployment 的 image 更新为 v2 版本.
验证是否更新完成.
回滚到 v1 版本.
解题思路:
题目yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: ikubernetes/myapp:v1
        resources:
          limits:
            memory: "128Mi"
            cpu: "500m"
        ports:
        - containerPort: 80
# 更新镜像版本 : kubectl set image
kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
# 查看更新过程
kubectl	rollout status deployment myapp
# 版本回滚
kubectl rollout undo deployment myapp