跳转至

2019考试真题

1.监控 foobar Pod 的日志,提取 pod 相应的行'error'写入到/logs 文件中

kubectl logs foobar | grep error > /logs

2.使用 name 排序列出所有的 PV,把输出内容存储到/opt/文件中 使用 kubectl own 对输出进行排序,并且不再进一步操作它

kubectl get pv --all-namespace --sort-by=.metadata.name > /opt/

3.确保在 kubectl 集群的每个节点上运行一个 Nginx Pod。其中 Nginx Pod 必须使用 Nginx 镜像。不要覆盖当前环境中的任何 traints。 使用 Daemonset 来完成这个任务,Daemonset 的名字使用 ds。

题目对应文档:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/ 删除tolerations字段,复制到image: gcr.io/fluentd-elasticsearch/fluentd:v2.5.1这里即可,再按题意更改yaml文件。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: ds
  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: nginx

4.添加一个 initcontainer 到 lum(/etc/data)这个 initcontainer 应该创建一个名为/workdir/calm.txt 的空文件,如果/workdir/calm.txt 没有被检测到,这个 Pod 应该退出

题目中yaml文件已经给出,只需要增加initcontainers部分,以及emptyDir: {} 即可 init文档位置:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  volumes:
  - name: workdir
    emptyDir: {} 
      containers:
  - name: nginx
    image: nginx
    command: [if ..]
    volumeMounts:
    - name: work
      mountPath: /workdir
      initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: 
    - touch
    - /workdir/calm.txt
      volumeMounts:
    - name: work
      mountPath: /workdir 

5.创建一个名为 kucc 的 Pod,其中内部运行着 nginx+redis+memcached+consul 4 个容器

https://v1-14.docs.kubernetes.io/docs/concepts/workloads/pods/pod-overview/

apiVersion: v1
kind: Pod
metadata:
  name: kucc
spec:
  containers:
  - name: nginx
    image: nginx
  - name: redis
    image: redis
  - name: memcached
    image: memcached
  - name: consul
    image: consul

6.创建 Pod,名字为 nginx,镜像为 nginx,添加 label disk=ssd

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:
    disk: ssd

7.创建 deployment 名字为 nginx-app 容器采用 1.11.9 版本的 nginx 这个 deployment 包含 3 个副本,接下来通过滚动升级的方式更新镜像版本为 1.12.0,并记录这个更新,最后,回滚这个更新到之前的 1.11.9 版本

kubectl run deployment nginx-app --image=nginx:1.11.9 --replicas=3
kubectl set image deployment nginx-app nginx-app=nginx:1.12.0 --record  (nginx-app container名字)
kubectl rollout history deployment nginx-app
kubectl rollout undo deployment nginx-app

8.创建和配置 service,名字为 front-end-service。可以通过 NodePort/ClusterIp 开访问,并且路由到 front-end 的 Pod 上

kubectl expose pod fron-end --name=front-end-service --port=80  --type=NodePort

9.创建一个 Pod,名字为 Jenkins,镜像使用 Jenkins。在新的 namespace website-frontend 上创建

kubectl create ns website-frontend
apiVersion: v1
kind: Pod
metadata:
  name: Jenkins
  namespace: website-frontend
spec:
  containers:
  - name: Jenkins
    image: Jenkins  
kubectl apply -f ./xxx.yaml

10.创建 deployment 的 spec 文件: 使用 redis 镜像,7 个副本,label 为 app_enb_stage=dev deployment 名字为 kual00201 保存这个 spec 文件到/opt/KUAL00201/deploy_spec.yaml完成后,清理(删除)在此任务期间生成的任何新的 k8s API 对象

kubectl run kual00201 --image=redis --labels=app_enb_stage=dev --dry-run -oyaml > /opt/KUAL00201/deploy_spec.yaml

11.创建一个文件/opt/kucc.txt ,这个文件列出所有的 service 为 foo ,在 namespace 为 production 的 Pod这个文件的格式是每行一个 Pod的名字

kubectl get svc -n production --show-labels | grep foo

kubectl get pods -l app=foo(label标签) -o=custom-columns=NAME:.spec.name > kucc.txt

12.创建一个secret,名字为super-secret包含用户名bob,创建pod1挂载该secret,路径为/secret,创建pod2,使用环境变量引用该secret,该变量的环境变量名为ABC

https://kubernetes.io/zh/docs/concepts/configuration/secret/#%E8%AF%A6%E7%BB%86 echo -n "bob" | base64

apiVersion: v1
kind: Secret
metadata:
  name: super-secret
type: Opaque
data:
  username: Ym9i

apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
containers:
- name: mypod
  image: redis
  volumeMounts:
- name: foo
  mountPath: "/secret"
  readOnly: true
volumes: secret
- name: foo
  secret:
    secretName: super-secret
apiVersion: v1
kind: Pod
metadata:
  name: pod-evn-eee
spec:
containers:
- name: mycontainer
image: redis
env:
- name: ABC
    valueFrom:
      secretKeyRef:
        name: super-secret
        key: username
restartPolicy: Never

13.在新的ns中创建pv,指定pv名字和挂载路径,镜像等

文档地址:https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-persistentvolume

kubectl create ns new
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0003
spec:
  capacity:
    storage: 5Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: slow
hostPath:
  path: "/etc/data"
kubectlc apply -f ./xxx.yaml --namespace=new

14.为给定deploy websity副本扩容到6

 kubectl scale deployment website --replicas=6

15.查看给定集群ready的node个数(不包含NoSchedule)

1.kubectl get nodes 
2.把所有ready得都执行kubectl describe node $nodename | grep Taint  如果有NoSchedule

16.找出指定ns中使用cup最高的pod名写出到指定文件

   kubectc top pod -l xxx --namespace=xxx

17.创建一个 deployment 名字为:nginx-dns 路由服务名为:nginx-dns 确保服务和 pod 可以通过各自的 DNS 记录访问 容器使用 nginx 镜像,使用 nslookup 工具来解析 service 和 pod 的记录并写入相应的/opt/service.dns 和/opt/pod.dns 文件中,确保你使用 busybox:1.28 的镜像用来测试。

busybox这里找:https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/

1、

kubectl run nginx-dns --image=nginx
kubectl expose deployment nginx-dns --name=nginx-dns --port=80 --type=NodePort
kubectl get pod -owide xxx (查看pod IP)

2、

apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  hostname: busybox-1
  subdomain: default-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox

3、解析

kubectl exec -it busybox -- nslookup nginx-dns
kubectl exec -it busybox -- nslookup 10.244.0.122(pod IP)

18.给定https地址,ca,cert证书,key备份该数据到指定目录

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 给的路径
有些题目下--ca-file会报错,记得看endpoints -h 里的字段怎么要求的

19.在ek8s集群中使name=ek8s-node-1节点不能被调度,并使已被调度的pod重新调度

先切换集群到ek8s    
再执行
kubectl drain node1 --ignore-daemonsets --delete-local-data  

20.给定集群中的一个node未处于ready状态,解决该问题并具有持久性

进入集群
ssh node  

systemctl status kubelet

systemctl start kubelet   
systemctl enable kubelet

21.题目很绕,大致是 在k8s的集群中的node1节点配置kubelet的service服务,去拉起一个由kubelet直接管理的pod(说明了是静态pod),

该文件应该放置在/etc/kubernetes/manifest目录下(给出了pod路径)

创建  1.vi /etc/kubernetes/manifest/static-pod.yaml
      2.systemctl status kubelet   查找kubelet.service路径  考试目录是: /etc/systemd/system/kubernetes.service
      3.vi /etc/systemd/system/kubernetes.service   观察有没有 --pod-manifest-path=/etc/kubernetes/manifest 这句话   没有就加上得
      4.sudo -i   ssh node  sudo -i
      5.systemctl daemon-reload            systemctl restart kubelet.service
      6.systemctl enable kubelet
      7.检查  kubectl get pods -n kube-system | grep static-pod  实际是static-pod+系统  static-pod-kubelet-service

22.某集群中kubelet.service服务无法正常启动,解决该问题,并具有持久性

kubectl 命令能用 kubectl get cs 健康检查  看manager-controller  是否ready   如果不ready   systemctl start kube-manager-controller.service   

23.TLS问题 (一道很长的题目,建议放弃,难度特别大)

24.创建指定大小和路径的pv

https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/#create-a-persistentvolume