CNCF CKA真题演练

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: CNCF CKA真题演练

真题演练

1. 创建一个符合要求的pod

从官网中搜索pod,然后找到一个标准的模板进行修改即可。

要求:(建一个pod要求名字、镜像这类的要求。)

apiVersion: v1
kind: Pod
metadata:
  name: myapp2
  labels:
    app: myapp2
spec:
  containers:
  - name: nginx
    image: nginx

2. 查看某个标签使用cpu最高的pod

注意需要是在--all-namespace条件下的某个标签下的cpu最高的pod

这里的top会出现所有的pod,这个时候选择最前面的那个pod,即排名最靠前的名称写入文件即可。

终端的复制通过选中后右键可以得到,反应可能比较慢。

kubectl get pod --all-namespace
kubectl top pod -l xxx  (这里是小写的L)

3. 创建secret,并且创建2个pod ,1个pod mount成文件,一个用环境变量

https://kubernetes.io/docs/concepts/configuration/secret/

从该链接中找到最简单的模板,根据要求创建secret

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  password: MWYyZDFlMmU2N2Rm

放入其中的值,需要进行base64加密。可以通过以下操作将一般的值进行加密:

echo -n 'nihaoa' | base64

建立一个pod,并且将secret mount成一个文件

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret

建立一个pod,将secret作为环境变量使用

apiVersion: v1
kind: Pod
metadata:
  name: secret-env-pod
spec:
  containers:
  - name: mycontainer
    image: redis
    env:
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

4. 给指定的deployment扩容(一分)

使用以下命令即可

kubectl scale deployment XXX --replicas=XXX

5. 按要求创建deployment,然后改image(要求record),然后再回滚回去,把最终的deployment spec弄出来 (继续记忆)

//新建一个deployment以供实验
kubectl create deployment redis --image=redis:3.2

//修改deployment的image版本
kubectl set image deployment redis redis=redis:latest --record

//查看redis的历史版本
kubectl rollout history deployment redis
//修改deployment的版本,退回到上一个版本
kubectl rollout undo deployment redis

//修改deployment的版本,退回到指定的版本
kubectl rollout undo deployment redis --to-revision=1

//输出deployment的spec信息拿出来。
kubectl get deployment redis -o=custom-columns=NAME:spec > aim.txt

6. 按照要求创建daemonsets

在官方文旦中找到具体的yaml文件模板
https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/

模板看起来有点复杂的,需要进行一些删减。
题目要求部署 NoSchedual 节点不能部署,因此删去 tolerations.

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: fluentd-logging
spec:
  selector:
    matchLabels:
      name: fluentd-elasticsearch
  template:
    metadata:
      labels:
        name: fluentd-elasticsearch
    spec:
      containers:
      - name: fluentd-elasticsearch
        image: k8s.gcr.io/fluentd-elasticsearch:1.20
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers

7. 在一个新的namespace创建pod

首先要新建一个namespcace,然后按照要求新建一个pod,在建立pod的时候,在后面加上参数来指定要建在哪个namespace中

这里千万不要偷懒使用deployment来代替pod,认为反正一样都会跑一个pod,deployment会有很多副作用的!!!例如命令不是题目中指定的名字,因为他会在后面自动加上一些后缀。

kubectl create namespace new
kubectl create -f pod.yaml -n new

也可以在 yaml 文件中 指定 namespaces

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: new
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent

8. 创建static pod

首先,staticPod是固定在某个node上面,由kubelet管理生成的一种pod。具体生成方式是:kubelet扫描固定的文件,找到yaml文件统一进行生成

  1. 查找到staticPod的固定文件夹。结果为在--config=/var/lib/kubelet/config.yaml这个文件夹中
    systemctl status kubelet
    
    查看该文件的配置。找到
  2. 在该文件夹中添加自己的yaml文件

第二种方法是:

  1. 找到kubelet的配置文件,同样先使用一下命令:
    systemctl status kubelet
    
  2. 然后找到这个位置的配置文件:

  3. 进入到配置文件之后添加一行:

    --manifest-url=/etc/kubernetes/manifest
    
  4. 重新启动kubelet
    systemctl daemon-reload
    systemctl restart kubelet
    
    这样之后,在指定文件夹下面的yaml文件就都会以staticPod的形式运行起来。

9. 给定一个pod 拿到某行日志

//XXX表示pod名称
kubectl logs XXX

//grep后面可以加上搜索的关键字
kubectl logs|grep YYY

自己补充的(周):列出指定pod的日志中状态为Error的行,并记录在指定的文件上

kubectl logs <podname> | grep error > /opt/KUCC000xxx/KUCC000xxx.txt

10. 诊断集群健康问题

这里的controller不是用pod的形式一键部署的,而是以二进制的文件,以服务的形式在master中部署的,因此可以在这里使用systemctl模式。


在master的配置文件中添加:
--manifest-url=/etc/kubernetes/manifestm

systemctl daemon-reload

systemctl restart kubelet

这道题目这样做了之后,还是有一定的问题。

11. node设置成unscheduler,并且调度到新的node上面去

使用taint将node设置成unscheduler,在官网上面搜索taint,点进去第一个链接即可。
https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/#concepts

kubectl taint nodes node1 key=value:NoExecute

ubectl taint nodes node1 key:NoExecutee-

NoSchedule 与 NoExecute 的区别:NoSchedule 只会保证后面部署的pod不会部署当前节点,而不能驱除之前已经部署在该节点的pod。而 NoExecute 可以。

12. 解决node not ready

ssh进入该node,重启kubelet

systemctl start kubelet

13. 给定pod创建service

直接使用service expose即可

kubectl expose pod myapp --port=80 --target-port=8000 --name=myapp-service

14. 创建deployment,创建service,并且用nslookup 拿到service 和一个pod的解析的结果

要使用nslookup来拿到service,需要创建一个pod并且进入到该pod中使用该命令才可以

具体参见官网https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/

  1. 查看service

    kubectl get service
    
  2. 创建一个pod

    kubectl create -f https://k8s.io/examples/admin/dns/busybox.yaml
    
  3. 进入到pod中,使用nslookup,注意这边不要忘记后面是servicename.namespace

    kubectl exec -ti busybox -- nslookup kubernetes.default
    
  4. 获取要监控的pod的IP

    kubectl describe pod XXX
    
  5. 使用nslookup对pod进行解析

    kubectl exec -ti busybox -- nslookup 1-2-3-4.default.pod.cluster.local(IP)
    

15. 列某个namepsace 下某个service所代表的所有pod的名

//第一步,找到某个service下的labels
kubectl get service --show-labels

//第二步,可以按照po标签,根据-l标签来进行筛选
kubectl get pods -l run=nginx

//第三步,直接找到某个节点名,进行输出
kubectl get pods -l run=nginx -o=custom-columns=NAME:metadata.name > name.yaml

如果没有具体的labels,则通过:

kubectl describe service XXX |grep IP

//找到IP之后,通过IP手动对应找到具体的pod

kubectl get pod -o wide

16. init container

https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
首先,需要使用command命令,新建某个文件
并且一定要挂载文件才可以,不然两个不同的container无法确定文件目录。
其次,需要从container中使用livenessprobe来进行检测,检测新建的文件是否存在,如果存在则启动,不存在则不启动

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: nginx
    volumeMounts:
    - name: data1
      mountPath: /data1
    livenessProbe:
      exec:
        command:
        - cat
        - /data1/test2
  initContainers:
  - name: init-myservice
    image: nginx
    command:
    - touch
    - data1/tets1
    volumeMounts:
    - name: data1
      mountPath: /data1
  restartPolicy: Always
  volumes:
  - name: data1
    emptyDir: {
   
   }

17. 使用nodeselector进行筛选

https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

使用该链接中的模板即可

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  nodeSelector:
    kubernetes.io/hostname: instance-1


    加主节点的情况:damenset
     tolerations:
      - key: node-role.kubernetes.io/master
        effect: NoSchedule

18. 创建一个符合要求的pv 大小 权限 路径

https://kubernetes.io/docs/concepts/storage/persistent-volumes/

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  hostPath:
    path: "/etc/data"

19. 给etcd做个snapshot 3.0 版本 要加环境变量用etcdctl 带证书,并且需要指定端口的。

https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/

首先,进入到具体的节点上面去

这一步可以根据题目中的ssh的操作来进行

创建自己的snapshot

ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:1111 --ca-file=/pki/ca.crt --cert-file=/pki/cert.crt --key-file=/pki/key.crt snapshot save 给的路径

将创建好的snapshot输出,如果题目中没有要求输出,则不需要做这一步,但是为了保证解题正确,可以自己输出一下来进行检验。

TCDCTL_API=3 etcdctl --write-out=table snapshot status snapshotdb >aim.txt

20. 列不含某个标签的node的数量

使用下面命令然后数一下

kubectl get node --show-labels

我考到的题目是查看node中ready的个数,即不被taints的个数,答案是2个,但是为了以防万一还是需要进行查看。
可以通过下述命令来进行查看。

kubectl desceibe node (node name) |grep Taints

21. 创建个带volume带pod,不可以是persistent的

https://kubernetes.io/docs/concepts/storage/volumes/

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {
   
   }

22. 将pv按照名称排序

很简单,在kubectl的命令提示中查找即可。

kubectl get pv --sort-by=.spec.capacity.storage

a23. 在一个pod中添加4个容器

直接按照pod的模板参加即可

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
  - name: myapp-container2
    image: nginx
  - name: consul
    image: consul
  - name: memcache
    image: memcached

24. 把deployment输出成json文件,最后删除创建的deployment

kubectl get deploy -o json > json.json

25. 给定ca.crt,配置好kubelet,同时还要配置好ratation cerficate证书轮换

考试期间仅可查阅资料: https://kubernetes.io/docs/

自动补全:

source <(kubectl completion bash)

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
运维 Kubernetes 监控
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
169 0
CKA备考攻略:掌握Pod日志收集,事半功倍的秘诀!
|
Kubernetes API 调度
21道题帮你轻松拿捏 Kubernetes 面试
21道题帮你轻松拿捏 Kubernetes 面试
|
6月前
|
Kubernetes Cloud Native 调度
云原生|kubernetes|CKA真题解析-------(1-5题)
云原生|kubernetes|CKA真题解析-------(1-5题)
768 0
|
6月前
|
Kubernetes 应用服务中间件 nginx
CKA考生注意:这些Deployment要点能助你一臂之力!
CKA考生注意:这些Deployment要点能助你一臂之力!
38 0
|
6月前
|
Kubernetes Cloud Native Linux
云原生|kubernetes|CKA备考和一些应试小技巧
云原生|kubernetes|CKA备考和一些应试小技巧
173 0
|
6月前
|
Kubernetes Cloud Native 固态存储
云原生|kubernetes|CKA真题解析-------(6-10题)
云原生|kubernetes|CKA真题解析-------(6-10题)
157 0
|
6月前
|
存储 Kubernetes Cloud Native
云原生|kubernetes|CKA真题解析-------(11-17题)
云原生|kubernetes|CKA真题解析-------(11-17题)
149 0
|
存储 Kubernetes Cloud Native
一图揭开 Kubernetes Pod 活动面纱
毫不夸张地说,Kubernetes 是一个颠覆性云原生生态编排平台,因为它为云部署提供了可扩展性、速度、可移植性以及可观察性。尽管它带来了一个包含强大功能和选项的完整生态系统并简化了复杂的部署,但它也有其自身的挑战。
80 0
|
Kubernetes 安全 Cloud Native
KCNA考试 第四章:学习kubernetes需要掌握的基础知识
KCNA考试 第四章:学习kubernetes需要掌握的基础知识
KCNA考试 第四章:学习kubernetes需要掌握的基础知识
|
存储 Kubernetes Cloud Native
KCNA考试 第五章:kubernetes学习实践(2)
KCNA考试 第五章:kubernetes学习实践(2)
KCNA考试 第五章:kubernetes学习实践(2)