跳转至

2019真题演练

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. 然后找到这个位置的配置文件:

  1. 进入到配置文件之后添加一行:
    --manifest-url=/etc/kubernetes/manifest
    
  2. 重新启动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-lolumns=NAME:metatda.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)