当前位置:   article > 正文

CKA 真题

ignore-daemonsets=true

1.列出pod并排序

  1. # 题目一般都是按名字排序
  2. $ kubectl get pod --sort-by .metadata.name

2.找出pod中的错误日志

  1. # 要求是把错误内容输出到某个文件中,可以粘贴,也可以直接重定向文件
  2. $ kubectl logs mypod-798fcd9949-lk9rc | grep error > xx.log

3.创建一个pod ,并调度到某个节点上

  1. $ cat > pod.yaml << EOF
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   name: nginx
  6.   labels:
  7.     env: test
  8. spec:
  9.   containers:
  10.   - name: nginx
  11.     image: nginx
  12.     imagePullPolicy: IfNotPresent
  13.   nodeSelector:
  14.     disktype: ssd
  15. EOF
  16. $ kubectl create -f pod.yaml

4.列出正常节点的个数

$ kubectl get node | grep -w Ready

5.pod中挂载volume

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: test-pd
  5. spec:
  6.   containers:
  7.   - image: k8s.gcr.io/test-webserver
  8.     name: test-container
  9.     volumeMounts:
  10.     - mountPath: /cache
  11.       name: cache-volume
  12.   volumes:
  13.   - name: cache-volume
  14.     emptyDir: {}

更详细用法参考官方文档:https://kubernetes.io/docs/concepts/storage/volumes/

6.提供一个pod,添加init-container ,在container中添加一个空文件,启动的时候。在另一个containre中检测是否有这个文件,否则退出

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   creationTimestamp: null
  5.   labels:
  6.     run: nginx-pod
  7.   name: nginx-pod
  8. spec:
  9.   containers:
  10.   - image: nginx
  11.     name: nginx-pod
  12.     command: ['sh','-c','if [ -f "a.txt" ]; then  echo xx ;fi']
  13.     ports:
  14.     - containerPort: 80
  15.     resources: {}
  16.     volumeMounts:
  17.     - name: workdir
  18.       mountPath: /usr/nginx/html
  19.   dnsPolicy: ClusterFirst
  20.   initContainers:
  21.   - image: busybox
  22.     name: initcheck
  23.     command: ['sh','-c','touch /tmp/index.html']
  24.     volumeMounts:
  25.     - name: workdir
  26.       mountPath: /tmp
  27.   volumes:
  28.   - name: workdir
  29.     emptyDir: {}

7.创建pod,再创建一个service

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: nats
  5.   labels:
  6.     app: nats
  7. spec:
  8.   containers:
  9.     - name: nats
  10.       image: nats
  11. ---
  12. apiVersion: v1
  13. kind: Service
  14. metadata:
  15.   name: nats
  16. spec:
  17.   selector:
  18.     app: nats
  19.   ports:
  20.     - port: 4222
  21.       nodePort: 32222
  22.   type: NodePort

8.在一个pod中创建2个容器,如redis+nginx

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: demo
  5. spec:
  6.   containers:
  7.   - image: nginx
  8.     name: nginx
  9.   - image: redis
  10.     name: redis

9.找到指定service下的pod中,cpu利用率按高到底排序

$ kubectl top pods --selector="app=demo" | grep -v NAME | sort -k 2 -nr

10.创建一个简单的daemonset

  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4.   name: fluentd-elasticsearch
  5.   namespace: kube-system
  6.   labels:
  7.     k8s-app: fluentd-logging
  8. spec:
  9.   selector:
  10.     matchLabels:
  11.       name: fluentd-elasticsearch
  12.   template:
  13.     metadata:
  14.       labels:
  15.         name: fluentd-elasticsearch
  16.     spec:
  17.       tolerations:
  18.       # this toleration is to have the daemonset runnable on master nodes
  19.       # remove it if your masters can't run pods
  20.       - key: node-role.kubernetes.io/master
  21.         effect: NoSchedule
  22.       containers:
  23.       - name: fluentd-elasticsearch
  24.         image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
  25.         resources:
  26.           limits:
  27.             memory: 200Mi
  28.           requests:
  29.             cpu: 100m
  30.             memory: 200Mi
  31.         volumeMounts:
  32.         - name: varlog
  33.           mountPath: /var/log
  34.         - name: varlibdockercontainers
  35.           mountPath: /var/lib/docker/containers
  36.           readOnly: true
  37.       terminationGracePeriodSeconds: 30
  38.       volumes:
  39.       - name: varlog
  40.         hostPath:
  41.           path: /var/log
  42.       - name: varlibdockercontainers
  43.         hostPath:
  44.           path: /var/lib/docker/containers

11.deployment的扩容 ,scale命令

$ kubectl scale --replicas=4 deployment demo

12 创建secret,有一个paasword字段(手动base64加密),创建两个pod引用该secret,一个用env ,一个用volume来调用

  1. $ echo -n 'admin' | base64
  2. YWRtaW4=
  3. $ echo -n '1f2d1e2e67df' | base64
  4. MWYyZDFlMmU2N2Rm

现在可以像这样写一个 secret 对象:

  1. apiVersion: v1
  2. kind: Secret
  3. metadata:
  4.   name: mysecret
  5. type: Opaque
  6. data:
  7.   username: YWRtaW4=
  8.   password: MWYyZDFlMmU2N2Rm

使用 kubectl apply 创建 secret:

$ kubectl apply -f ./secret.yaml

Pod 中使用 Secret 作为环境变量的示例:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: secret-env-pod
  5. spec:
  6.   containers:
  7.   - name: mycontainer
  8.     image: redis
  9.     env:
  10.       - name: SECRET_USERNAME
  11.         valueFrom:
  12.           secretKeyRef:
  13.             name: mysecret
  14.             key: username
  15.       - name: SECRET_PASSWORD
  16.         valueFrom:
  17.           secretKeyRef:
  18.             name: mysecret
  19.             key: password
  20.   restartPolicy: Never

Pod 中使用 volume 挂在 secret 的例子:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: mypod
  5. spec:
  6.   containers:
  7.   - name: mypod
  8.     image: redis
  9.     volumeMounts:
  10.     - name: foo
  11.       mountPath: "/etc/foo"
  12.       readOnly: true
  13.   volumes:
  14.   - name: foo
  15.     secret:
  16.       secretName: mysecret

官方链接:https://kubernetes.io/docs/concepts/configuration/secret/

13.先将nginx:1.9的deployment,升级到nginx:1.11,记录下来(—record),然后回滚到1.9

升级

$ kubectl set image deployments demo demo=nginx:1.11 --record

回滚

$ kubectl rollout undo deployment demo

14.使用 nslookup 查看service 和pod的dns

service 和pod 的创建用之前的 yaml

  1. # 查看 dns
  2. $ kubectl run -it --image busybox:1.28.4  dnstest --rm /bin/sh
  3. # 查看 sevice
  4. $ nslookup svc-demo.kube-system.svc.cluster.local
  5. # 查看 pod
  6. # 查看pod ip时,要把1.2.3.4换成1-2-3-4,否则会报错
  7. $ nslookup 1-2-3-4.default.pod.cluster.local

参考文档:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

15.etcdctl 来 备份etcd

  1. # 先声明环境变量ETCDCTL_API=3 ,不然etcdctl 是v2版本
  2. $ ETCDCTL_API=3 etcdctl --cacert=/opt/kubernetes/ssl/ca.pem --cert=/opt/kubernetes/ssl/server.pem --key=/opt/kubernetes/ssl/server-key.pem --endpoints=https://192.168.1.36:2379 snapshot save /data/etcd_backup_dir/etcd-snapshot-`date +%Y%m%d`.db

参考文档地址:https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/

16.static pod 的使用

找到 --pod-manifest-path=/etc/kubelet.d/ 配置的位置,然后把 pod 的 yaml 放进去

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: static-web
  5.   labels:
  6.     role: myrole
  7. spec:
  8.   containers:
  9.     - name: web
  10.       image: nginx
  11.       ports:
  12.         - name: web
  13.           containerPort: 80
  14.           protocol: TCP

参考文档地址:https://kubernetes.io/docs/tasks/administer-cluster/static-pod/

17.在一个新的namespace创建pod

先创建 ns

  1. # 创建 ns
  2. $ kubectl create namespace test

再创建 pod

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: demo
  5.   namespace: test
  6. spec:
  7.   containers:
  8.   - image: nginx
  9.     name: nginx

18.pv 类型 hostpath 位置在/data,大小为1G, readonly 模式

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4.   name: example-pv
  5. spec:
  6.   capacity:
  7.     storage: 1Gi
  8.   volumeMode: Filesystem
  9.   accessModes:
  10.   - ReadOnlyMany
  11.   persistentVolumeReclaimPolicy: Delete
  12.   local:
  13.     path: /data
  14.   nodeAffinity:
  15.     required:
  16.       nodeSelectorTerms:
  17.       - matchExpressions:
  18.         - key: kubernetes.io/hostname
  19.           operator: In
  20.           values:
  21.           - test-node

参考文档地址:https://kubernetes.io/docs/concepts/storage/persistent-volumes/

20.给pod创建service

Pod 配置文件

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: nginx
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   containers:
  9.   - name: nginx
  10.     image: nginx
  11.     imagePullPolicy: IfNotPresent

service 配置文件,通过 labels app=nginx 关联 pod

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4.   name: nginx
  5.   labels:
  6.     app: nginx
  7. spec:
  8.   ports:
  9.   - port: 80
  10.     protocol: TCP
  11.   selector:
  12.     app: nginx

21.使用node selector,选择disk为ssd的机器调度

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.   name: nginx
  5.   labels:
  6.     env: test
  7. spec:
  8.   containers:
  9.   - name: nginx
  10.     image: nginx
  11.     imagePullPolicy: IfNotPresent
  12.   nodeSelector:
  13.     disktype: ssd

22.排查apiserver连接不上问题:

下面例举一些可能导致的原因:

  • 1、apiserver 有负载均衡,负载均衡服务有问题,或者负载均衡服务连接不上后端apiserver

  • 2、TLS证书过期,分两种情况:

    • 2.1、整个集群证书过期

    • 2.2、ETCD证书和K8S集群证书分开颁发,只有ETCD集群证书过期,或者k8s内部证书过期

  • 3、apiserver 服务连接过多,导致连接不上

  • 4、k8s集群规则大,导致etcd集群响应慢,apiserver接口服务也受到影响(因为 apiserver 是k8s集群唯一数据查询与写入口)

还有其它原因,本文只例举这些。

23.把一个node弄成unavailable 并且把上边的pod重新调度去新的node上

$ kubectl drain ${node-name} --delete-local-data=true --ignore-daemonsets=true

真题日期

  • 日期:2019年5月

  • 版本:k8s 1.13

参考链接

  • https://www.jianshu.com/p/f81d191ee03b

往期精彩文章

您的关注是小站的动力

欢迎大家关注交流,定期分享自动化运维、DevOps、Kubernetes、Service Mesh和Cloud Native

扫码『加群』交流技术

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/171414
推荐阅读
相关标签
  

闽ICP备14008679号