• cka 英文考试题


    ## CKA真题解析

    #### 1
    **Set configuration context $kubectl config use-context k8s. Monitor the logs of Pod foobar and Extract log lines corresponding to error unable-to-access-website . Write them to /opt/KULM00612/foobar.**

    翻译:设置配置上下文$kubectl config use context k8s,监控Pod foobar的日志,并提取错误“unable-to-access-website”对应的日志行。把它们写到/opt/KULM00612/foobar。

    解析:就是看下一个pod中的日志,把满足条件的日志行保存在某一文件中

    ```bash
    kubectl config use-context k8s
    kubectl logs foobar | grep 'unable-to-access-website' > opt/KULM00612/foobar

    检查:
    kubectl logs foobar    #考试时这个pod输出很少,就7,8行,你可以看到你要的日支行,就一行满足条件
    cat opt/KULM00612/foobar  #看下结果,核对下
    ```
    #### 2
    **Set configuration context $kubectl config use-context k8s. List all PVs sorted by capacity, saving the full kubectl output to /opt/KUCC0006/my_volumes. Use kubectl own functionally for sorting the output, and do not manipulate it any further**
    翻译:设置配置上下文$kubectl config use context k8s。列出按容量排序的所有PV,将完整的kubectl输出保存到/opt/KUCC0006/my_volumes。在功能上使用kubectl 本身对输出进行排序,不要再对其进行任何操作
    解析:pv排序

    ```bash
    kubectl config use-context k8s
    kubectl get pv -A --sort-by={.spec.capacity.storage} > /opt/KUCC0006/my_volumes
    ```
    注意看下,他是要**所有的PV**,所以-A是所有命名空间
    命令怎么查?
    `kubectl get pv --help`




    #### 3
    **Set configuration context $kubectl config use-context k8s. Ensure a single instance of Pod nginx is running on each node of the Kubernetes cluster where nginx also represents the image name which has to be used. Do no override any taints currently in place. Use Daemonset to complete this task and use ds.kusc00612 as Daemonset name**

    翻译:设置配置上下文$kubectl config use context k8s。确保在Kubernetes集群的每个节点上运行Pod nginx的单个实例,其中nginx还表示必须使用的映像名称。不要覆盖当前存在的任何污点。使用Daemonset完成此任务并使用ds.kusc00612作为守护进程名称

    解析:考察DaemonSet,不需要容忍某些节点的污点

    参考网址:https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/

    kubectl config use-context k8s
    ```
    vi ds.kusc00612.yaml
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: ds.kusc00612
      labels:
        k8s-app: ds.kusc00612
    spec:
      selector:
        matchLabels:
          name: ds.kusc00612
      template:
        metadata:
          labels:
            name: ds.kusc00612
        spec:
          containers:
          - name: nginx
            image: nginx
    ```
    运行后看下,一般不是所有节点都有这个pod的,因为有些节点上有污点,你可以使用以下命令看下有几个节点是有污点:
    ```
    kubectl describe nodes | grep Taints
    ```
    一般有几个节点就会输出几行,没污点的节点所在行是空的。然后用kubectl get nodes看下哪个节点是有污点。然后kubectl get po -o wide| grep 0612.看下确实的节点是不是有污点的节点。以此可做检查。


    4、Set configuration context $kubectl config use-context k8s Perform the following tasks: Add an init container to lumpy-koala(which has been defined in spec file /opt/kucc00100/pod-specKUCC00612.yaml). The init container should create an empty file named /workdir/calm.txt. If /workdir/calm.txt is not detected, the Pod should exit. Once the spec file has been updated with the init container definition, the Pod should be created
    翻译:执行以下任务:将init容器添加到lumpy-koala(已在文件/opt/kucc00100/pod-specKUCC00612.yaml中定义)。init容器应该创建一个名为/workdir/calm.txt的空文件. 如果/workdir/calm.txt未检测到,Pod应退出。一旦用init容器定义更新了spec文件,就应该创建Pod
    解析:这道题在/opt/kucc00100/pod-specKUCC00612.yaml路径下已经有写好的Yaml了,但是还未在集群中创建该对象。所以你上去最好先kubectl get po | grep pod名字。发现集群还没有该pod。所以你就先改下这个Yaml,然后apply.先创建Initcontainer,然后在里面创建文件,/workdir目录明显是个挂载进度的目录,题目没规定,你就定义empDir类型。这边还要用到liveness检查。

    参考网址:
    https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#using-init-containers
    https://kubernetes.io/docs/concepts/storage/volumes/#emptydir
    https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
    kubectl config use-context k8s
    ```
    在pod-specKUCC00612.yaml后面添加
      initContainers:
      - name: init-container
        image: busybox
        command: ['sh', '-c', "touch /workdir/calm.txt"]
        volumeMounts:
        - mountPath: /workdir
          name: cache-volume
      volumes:
      - name: cache-volume
        emptyDir: {}
    ```
    kubectl apply -f xxx.yaml
    kubectl get po | grep KUCC00612
    running后
    使用:kubectl exec -ti KUCC00612 -- ls /workdir
    看下有没有calm.txt以做检查

    #### 5
    Set configuration context $kubectl config use-context k8s. Create a pod named kucc6 with a single container for each of the following images running inside(there may be between 1 and 4 images specified):nginx +redis+memcached+consul。
    翻译:创建一个名为kucc6的pod,其中包含运行在其中的以下映像的单个容器(可能会指定1到4个映像):nginx+redis+memcached+consur
    解析:创建pod,有四个镜像
    参考网址:https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/
    kubectl config use-context k8s
    ```
    vi kucc6.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: kucc6
      labels:
        env: kucc6
    spec:
      containers:
      - name: nginx
        image: nginx
      - name: redis
        image: redis
      - name: memcached
        image: memcached
      - name: consul
        image: consul
    ```
    kubectl apply -f xx.yaml
    kubeget get po

    #### 6
    Set configuration context $kubectl config use-context k8s Schedule a Pod as follows: Name: nginxkusc00612 Image: nginx Node selector: disk=ssd
    翻译:创建 Pod,名字为 nginx,镜像为 nginx,部署到 label disk=ssd的node上
    解析:pod调度到指定节点,Nodeselector

    官网搜索nodeselector找yaml文件
    kubectl config use-context k8s
    ```
    apiVersion: v1
    kind: Pod
    metadata:



      name: nginxkusc00612
      labels:
        app: nginxkusc00612
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      nodeSelector:
        disktype: ssd
    ```
    kubectl apply -f nginxkusc00612.yaml
    kubectl get po -o wide | grep nginxkusc00612 看一下所属节点
    kubectl get nodes --show-labels | grep disk  出来的节点看下是不是上面查出来的节点。集群中节点一般就3个,很容易看的。

    #### 7
    Set configuration context $kubectl config use-context k8s. Create a deployment as follows: Name: nginxapp Using container nginx with version 1.11.9-alpine. The deployment should contain 3 replicas. Next, deploy the app with new version 1.12.0-alpine by performing a rolling update and record that update.Finally,rollback that update to the previous version 1.11.9-alpine.
    解析:部署deploy,然后修改进镜像(滚动更新),然后回滚上一版本

    官网搜索Deployment
    ```bash
    kubectl config use-context k8s
    kubectl create deployment nginxapp --image=nginx:1.11.9-alpine
    kubectl scale deployment nginxapp --replicas=3
    kubectl set image deployment/nginxapp nginx=nginx:1.12.0-alpine --record=true #--record加上,现在这样就是滚动更新了
    kubectl rollout history deployment/nginxapp 看下滚动历史
    然后执行 kubectl rollout undo deployment/nginxapp
    ```

    #### 8
    Set configuration context $kubectl config use-context k8s Create and configure the service front-endservice so it’s accessible through NodePort/ClusterIp and routes to the existing pod named front-end
    解析:创建service,指定后端到已有pod: front-end
    先查看下front-end的Pod是否存在
    kubectl get po | grep front-end
    看下front-end的镜像,kubectl get po -o yaml | grep image.我看到是nginx,那后面就可以用来检查了。然后看下label,后面service的selector需要用到
    只要写个service就够了
    参考网址:https://kubernetes.io/docs/tasks/access-application-cluster/connecting-frontend-backend/
    kubectl config use-context k8s
    ```
    apiVersion: v1
    kind: Service
    metadata:
      name: front-end-service
    spec:
      selector:
        app: front-end #这边的标签一定要和front-end的Label一致
      type: NodePort
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
        nodePort: 30080
    ```
    kubectl apply -f xxx.yaml
    检查:
    kubectl get nodes
    ssh nodename
    culr serviceIp:80
    出来nginx的欢迎页,就没啥问题了

    #### 9
    Set configuration context $kubectl config use-context k8s Create a Pod as follows: Name: jenkins Using image: jenkins In a new Kubernetes namespace named pro-test
    解析:在新的命名空间中创建jenkins的pod
    kubectl config use-context k8s
    ```
    看下pro-test命名空间是否存在,一般是不存在
    kubectl get ns | grep pro-test
    kubectl create ns pro-test
    官网搜索Pod
    然后增加namespace字段:
    ```
    apiVersion: v1
    kind: Pod
    metadata:
      name: jenkins
      namespace: pro-test
      labels:
        env: jenkins
    spec:
      containers:
      - name: jenkins
        image: jenkins
    ```
    kubectl apply -f xx.yaml
    kubectl get po -n pro-test | grep jenkins

    10、Set configuration context $kubectl config use-context k8s Create a deployment spec file that will: Launch 7 replicas of the redis image with the label : app_enb_stage=dev Deployment name: kual00612 Save a copy of this spec file to /opt/KUAL00612/deploy_spec.yaml (or .json) When you are done,clean up(delete) any new k8s API objects that you produced during this task
    翻译:设置配置上下文$kubectl config use context k8s创建一个部署规范文件,该文件将:启动redis映像的7个副本,标签为:app_enb_stage=dev deployment name:kual00612将此规范文件的副本保存到/opt/kual00612/deploy_spec.yaml(或.json)完成后,清理(删除)您在此任务期间生成的任何新的k8sapi对象
    解析:创建7副本的redis的deploy,指明标签,然后把yaml保存在指定位置
    参考网址:https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
    kubectl config use-context k8s
    ```
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: kual00612
      labels:
        app_enb_stage: dev
    spec:
      replicas: 7
      selector:
        matchLabels:
          app: kual00612 #标签最好都用deployment的名字
      template:
        metadata:
          labels:
            app: kual00612
        spec:
          containers:
          - name: redis
            image: redis
    ```
    kubectl apply -f xx.yaml
    kuectl get po | grep kual00612   running就ok了
    然后kubectl delete -f xx.yaml 题目要求删除该资源
    cat xx.yaml > /opt/KUAL00612/deploy_spec.yaml
    cat /opt/KUAL00612/deploy_spec.yaml  #检查看下

    11、Set configuration context $kubectl config use-context k8s Create a file /opt/KUCC00612/kucc00612.txt that lists all pods that implement Service foo in Namespace production. The format of the file should be one pod name per line.
    解析:满足foo service选择规则的pod,并把名字写入某个文件
    --------------------------------------------------------------------------------------
    kubectl config use-context k8s
    ```
    kubectl get svc -n production #看下foo在不在
    kubectl get svc -n production -o yaml | grep selector
    一定要看selector的label而不是service的label。selector的label才是选个后端pod的label。然后看到Label是app=blog.
    kubectl get po -n production -l app=blog | grep -v NAME | awk '{print $1}' >/opt/KUCC00612/kucc00612.txt
    看下是不是pod名称 cat /opt/KUCC00612/kucc00612.txt

    12、Set configuration context $kubectl config use-context k8s Create a Kubernetes Secret as follows: Name: super-secret credential: blob, Create a Pod named pod-secrets-via-file using the redis image which mounts a secret named super-secret at /secrets. Create a second Pod named pod-secretsvia-env using the redis image, which exports credential as 
    翻译:创建一个Kubernetes Secret,如下所示:Name:super Secret credential:blob,使用redis映像创建一个名为Pod secrets的Pod,该映像在/secrets处挂载一个名为super Secret的机密。使用redis映像创建第二个名为Pod secretsvia env的Pod,它将凭证导出为凭证
    解析:创建secret,并在pod中通过Volume和环境变量使用该secret
    --------------------------------------------------------------------------------------
    参考网址:https://kubernetes.io/zh/docs/concepts/configuration/secret/
    kubectl config use-context k8s
    ```
    对blob进行base64编码,然后才能放入secret
    echo -n 'blob' | base64
    ```
    创建yaml:
    ```
    apiVersion: v1
    kind: Secret
    metadata:
      name: super-secret
    type: Opaque
    data:
      credential: YWRtaW4=
    ```
    kubectl apply -f secret.yaml
    创建pod:pod-secrets-via-file
    ```
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-secrets-via-file
    spec:
      containers:
      - name: pod-secrets-via-file
        image: redis
        volumeMounts:
        - name: foo
          mountPath: "/secrets"
          readOnly: true
      volumes:
      - name: foo
        secret:
          secretName: super-secret
    ```
    kubectl apply -f pod-secrets-via-file.yaml
    创建pod:pod-secretsvia-env
    ```
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-secretsvia-env
    spec:
      containers:
      - name: mycontainer
        image: redis
        env:
          - name: SECRET_USERNAME
            valueFrom:
              secretKeyRef:
                name: supersecret
                key: username
          - name: CREDENTIAL
            valueFrom:
              secretKeyRef:
                name: supersecret
                key: credential
      restartPolicy: Never
    ```
    kubectl apply -f pod-secretsvia-env.yaml
    检验:
    kubectl exec -ti pod-secretsvia-env -- env ##会打印出很多环境变量,看下你定义的在不在,最后进pod: echo $CREDENTIAL 确认下结果
    kubectl exec -ti pod-secrets-via-file -- ls /secrets

    13、Set configuration context $kubectl config use-context k8s Create a pod as follows: Name: nonpersistent-redis Container image: redis Named-volume with name: cache-control Mount path : /data/redis It should launch in the pre-prod namespace and the volume MUST NOT be persistent.
    解析:创建一个pod,并挂载volume

    官网搜索volume
    kubectl config use-context k8s
    ```
    apiVersion: v1
    kind: Pod
    metadata:
      name: nonpersistent-redis
    spec:
      containers:
      - image: redis
        name: redis
        volumeMounts:
        - mountPath: /data/redis
          name: cache-control
      volumes:
      - name: cache-control
        emptyDir: {}
    ```
    kubectl apply -f xxx.yaml
    kubectl get po | grep nonpersistent。看下是不是running
    kubectl exec -ti nonpersistent-redis -- ls /data    看下是否有redis目录


    #### 14、Set configuration context $kubectl config use-context k8s Scale the deployment webserver to 6 pods
    解析:扩缩容
    ```
    kubectl config use-context k8s
    kubectl scale deployment webserver --replicas=6
    ```

    #### 15、Set configuration context $kubectl config use-context k8s Check to see how many nodes are ready (not including nodes tainted NoSchedule) and write the number to /opt/nodenum.
    解析:有多少节点是ready状态的,不包含被打了NoSchedule污点的节点
    ```
    kubectl config use-context k8s
    kubectl describe nodes (kubectl get nodes|grep Ready|awk '{print $1}')|grep Taints|grep -vc NoSchedule >/opt/nodenum
    ```




    #### 16、Set configuration context $kubectl config use-context k8s From the Pod label name=cpu-utilizer, find pods running high CPU workloads and write the name of the Pod consuming most CPU to the file /opt/cpu.txt (which already exists).
    解析:题目意思是从label是name=cpu-utilizer的pod中找出使用cpu最高的Pod,并把pod的Name写入/opt/cpu.txt。

    ```bash
    kubectl config use-context k8s
    kubectl top --help   查看top的使用
    kubectl top pod -l name=cpu-utilizer --sort-by=cpu
    #应该会出来多个满足条件的Pod,查看pod的cpu小号字段最高的,然后将其名字写入/opt/cpu.txt
    ```


    17、Set configuration context $kubectl config use-context k8s Create a deployment as follows: Name: nginxdns Exposed via a service : nginx-dns Ensure that the service & pod are accessible via their respective DNS records The container(s) within any Pod(s) running as a part of this deployment should use the nginx image. Next, use the utility nslookup to look up the DNS records of the service & pod and write the output to /opt/service.dns and /opt/pod.dns respectively. Ensure you use the busybox:1.28 image (or earlier) for any testing, an the latest release has an upstream bug which impacts the use of nslookup
    解析:创建service和deployment,然后解析service的dns和pod的dns,并把解析记录保存到指定文件
    --------------------------------------------------------------------------------------
    参考网址:https://kubernetes.io/docs/tasks/access-application-cluster/connecting-frontend-backend/
    kubectl config use-context k8s
    ```
    vi deployment.yaml:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginxdns
    spec:
      selector:
        matchLabels:
          app: nginxdns
      replicas: 1
      template:
        metadata:
          labels:
            app: nginxdns
        spec:
          containers:
            - name: nginx
              image: nginx
              ports:
                - name: http
                  containerPort: 80
    ```
    vi service.yaml:
    apiVersion: v1
    kind: Service
    metadata:
      name: ngixdns
    spec:
      selector:
        app: nginxdns
      ports:
      - protocol: TCP
        port: 80
        targetPort: http
    ```
    https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
    vi busybox.yaml:
    apiVersion: v1
    kind: Pod
    metadata:
      name: busybox-test
      labels:
        app: busybox-test
    spec:
      containers:
      - name: myapp-container
        image: busybox:1.28
        command: ['sh', '-c', 'echo The app is running! && sleep 3600'] #sleep 3600一定要啊,不然busybox运行后直接退出
    ```
    kubectl apply -f busybox.yaml
    kubectl apply -f deployment.yaml
    kubectl apply -f service.yaml
    kubectl exec -ti busybox-test -- nslookup nginx-dns > /opt/service.dns
    kubectl exec -ti busybox-test -- nslookup podup > /opt/pod.dns

    18、No configuration context change required for this item Create a snapshot of the etcd instance running at https://127.0.0.1:2379 saving the snapshot to the file path /data/backup/etcd-snapshot.db The etcd instance is running etcd version 3.2.18 The following TLS certificates/key are supplied for connecting to the server with etcdctl CA certificate: /opt/KUCM0612/ca.crt Client certificate: /opt/KUCM00612/etcdclient.crt Client key: /opt/KUCM00612/etcd-client.key
    解析:备份etcd,手册中有该命令,需要指定证书的话,看下etcdctl --help
    --------------------------------------------------------------------------------------
    参考网址:https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/#backing-up-an-etcd-cluster
    需要指定证书,所以你使用etcdctl --help查看下证书相关的字段
    ```
    export ETCDCTL_API=3
    etcdctl snapshot save --help
    etcdctl --endpoints= https://127.0.0.1:2379 --cert="/opt/KUCM000613/etcd-client.crt" --
    cacert="/opt/KUCM00612/ca.crt" --key="/opt/KUCM00612/etcd-client.key" snapshot save
    /data/backup/etcd-snapshot.db
    ```
    接着既可以检查下你备份的文件:
    ```
    ETCDCTL_API=3 etcdctl --write-out=table snapshot status /data/backup/etcd-snapshot.db
    有以下输出,就没问题
    +----------+----------+------------+------------+
    |   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
    +----------+----------+------------+------------+
    | fe01cf57 |       10 |          7 | 2.1 MB     |
    +----------+----------+------------+------------+
    ```

    19、Set configuration context $kubectl config use-context ek8s Set the node labelled with name=ek8s-node-1 as unavailable and reschedule all the pods running on it.
    解析:将标签未name=ek8s-node-1设置成不可用且把这个节点上面的pod调度到其他节点上去。其实就是使用kubectl drain命令
    --------------------------------------------------------------------------------------
    kubectl config use-context ek8s # 切换集群
    kubectl get node --show-labels | grep name=ek8s-node-1
    kubectl get pods -o wide | grep ek9s-node-1
    kubectl cordon  ek9s-node-1 # 先设置为cordon不让其再被调度,就是不再让其有pod,保证下面删除有效.这步考试时我没执行,我觉得不影响,是没人在我操作时操作集群的
    kubectl drain  ek9s-node-1 --ignore-daemonsets
    kubectl get nodes查看下 ek9s-node-1这个节点会有unschedule的标记
    ```
    20、Set configuration context $kubectl config use-context wk8s A Kubernetes worker node,labelled with name=wk8s-node-0 is in state NotReady. Investigate why this is the case, and perform any appropriate steps to bring the node to a Ready state, Ensuring that any changes are made permanent. Hints: You can ssh to the failed node using $ssh wk8s-node-0. You can assume elevated privileges on the node with the following command $sudo -i
    题目解析:wk8s-node-0是NotReady状态,你需要处理下,使其变为ready,别更改需要永久性
    --------------------------------------------------------------------------------------
    kubectl config use-context wk8s
    kubectl get nodes #发现wk8s-node-0是NotReady状态
    ssh wk8s-node-0
    sudo -i
    systemctl status kubelet  #发现没启动
    systemctl start kubelet
    systemctl enable kubelet
    exit #从root切到user
    exit #从wk8s-node-0回到Master节点
    kubectl get nodes # 发现wk8s-node-0是ready状态了
    ```

    #### 21、Set configuration context $kubectl config use-context wk8s Configure the kubelet system managed service,on the node labelled with name=wk8s-node-1, to Launch a Pod containing a single container of image nginx named myservice automatically. Any spec files required should be placed in the /etc/kubernetes/manifests directory on the node. Hints: You can ssh to the failed node using $ssh wk8snode-1. You can assume elevated privileges on the node with the following command $sudo -i
    > 题目解析:考察的是静态Node


    参考网址:https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/
    kubectl config use-context wk8s
    ssh wk8s-node-1
    cd  /etc/kubernetes/manifests
    vi pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
      name: myservice
      labels:
        role: myrole
    spec:
      containers:
        - name: web
          image: nginx
          ports:
            - name: web
              containerPort: 80
              protocol: TCP
    ```
    kubelet照理来说会轮询检查 /etc/kubernetes/manifests下是否有yaml,有的话就会创建为静态pod
    ```
    systemctl status kubelet
    下面是打印出来的东西:
    ● kubelet.service - kubelet: The Kubernetes Node Agent
       Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: disabled)
      Drop-In: /usr/lib/systemd/system/kubelet.service.d
               └─10-kubeadm.conf
       Active: active (running) since 六 2020-04-18 20:44:33 CST; 1 months 30 days ago
         Docs: https://kubernetes.io/docs/
     Main PID: 21185 (kubelet)
        Tasks: 23
       Memory: 106.9M
       CGroup: /system.slice/kubelet.service
               └─21185 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kuber...

    6月 18 07:04:16 master1 kubelet[21185]: W0618 07:04:16.392108   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:04:46 master1 kubelet[21185]: W0618 07:04:46.511713   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:09:36 master1 kubelet[21185]: W0618 07:09:36.698768   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:09:36 master1 kubelet[21185]: W0618 07:09:36.698947   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:17:36 master1 kubelet[21185]: W0618 07:17:36.324375   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:17:36 master1 kubelet[21185]: W0618 07:17:36.324500   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:17:36 master1 kubelet[21185]: W0618 07:17:36.324554   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:17:46 master1 kubelet[21185]: W0618 07:17:46.644361   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:17:46 master1 kubelet[21185]: W0618 07:17:46.644439   21185 watcher.go:87] Error while processing event ...ectory
    6月 18 07:29:26 master1 kubelet[21185]: W0618 07:29:26.400216   21185 watcher.go:87] Error while processing event ...ectory
    Hint: Some lines were ellipsized, use -l to show in full.
    ```
    查看kubelet启动配置文件的内容:
    cat /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
    ```
    [Service]
    Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
    Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
    # This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically
    EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
    # This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use
    # the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file.
    EnvironmentFile=-/etc/sysconfig/kubelet
    ExecStart=
    ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

    ```
    发现里面并没有KUBELET_ARGS参数后面没有指定pod-manifest-path参数,类似这样KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --pod-manifest-path= /etc/kubernetes/manifests"
    然后只能去看下KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml 这个参数指定的yaml里看下有没有指定静态pod的指定路径,要是也没有的话,kubelet是不会自动创建静态Pod的,而且pod-manifest-path没有默认值。
    cat /var/lib/kubelet/config.yaml
    ```
    apiVersion: kubelet.config.k8s.io/v1beta1
    authentication:
      anonymous:
        enabled: false
      webhook:
        cacheTTL: 0s
        enabled: true
      x509:
        clientCAFile: /etc/kubernetes/pki/ca.crt
    authorization:
      mode: Webhook
      webhook:
        cacheAuthorizedTTL: 0s
        cacheUnauthorizedTTL: 0s
    clusterDNS:
    - 10.96.0.10
    clusterDomain: cluster.local
    cpuManagerReconcilePeriod: 0s
    evictionPressureTransitionPeriod: 0s
    fileCheckFrequency: 0s
    healthzBindAddress: 127.0.0.1
    healthzPort: 10248
    httpCheckFrequency: 0s
    imageMinimumGCAge: 0s
    kind: KubeletConfiguration
    nodeStatusReportFrequency: 0s
    nodeStatusUpdateFrequency: 0s
    rotateCertificates: true
    runtimeRequestTimeout: 0s
    streamingConnectionIdleTimeout: 0s
    syncFrequency: 0s
    volumeStatsAggPeriod: 0s
    ```
    发现没有指定静态Pod路径的参数,在最后添加staticPodPath: /etc/kubernetes/manifests
    然后运行:
    ```
    systemctl restart kubelet
    systemctl enable kubelet
    ```
    然后去Master节点上看下,发现静态pod起来了,那就ok了

    22、这题是给你两个节点,master1和node1,和一个admin.conf文件,然后让你在这两个节点上部署集群。
    解析:
    --------------------------------------------------------------------------------------
    官网文档(https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%AE%89%E8%A3%85-kubeadm-kubelet-%E5%92%8C-kubectl)  
    sudo apt-get update && sudo apt-get install -y apt-transport-https curl  
    curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -  
    cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list  
    deb https://apt.kubernetes.io/ kubernetes-xenial main  
    EOF  
    sudo apt-get update  
    sudo apt-get install -y kubelet kubeadm kubectl  
    sudo apt-mark hold kubelet kubeadm kubectl
    ```
    官网文档(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#initializing-your-control-plane-node)  
    ```
    kubeadm init --config /etc/kubeadm.conf ignore-preflight-errors=all  #忽略错误参数和配置文件都有提供,配置文件不用改,注意审题!
    ```
    官网文档(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network)  
    ```
    kubectl apply -f https://docs.projectcalico.org/v3.14/manifests/calico.yaml
    ```
    看下kubectl get nodes是否ready,看下Kube-system命名空间下pod是否都是running

    23、Set configuration context $kubectl configuse-context bk8s Given a partially-functioning Kubernetes cluser, identify symptoms of failure on the cluter. Determine the node, the failing service and take actions to bring up the failed service and restore the health of the cluser. Ensure that any changes are made permanently. The worker node in this cluster is labelled with name=bk8s-node-0 Hints: You can ssh to the relevant nodes using $ssh $(NODE) where $(NODE) is one of bk8s-master-0 or bk8s-node-0. You can assume elevated privileges on any node in the cluster with the following command: $ sudo -i.
    解析:这题的意思是,有个集群部分功能出现问题,需要你去修一下,需要是永久性的修复。
    --------------------------------------------------------------------------------------
    kubectl configuse-context bk8s
    ssh bk8s-master-0
    sudo -i
    kubectl get po    !!!竟然长时间没有返回,我觉得apiserver挂了
    systemctl status kube-apiserver.service !!!发现没有
    ps -ef | grep apiserver !!! 也没有,所以应该不是本地部署的,应该走的是静态pod的部署方式。
    kubectl get po -A | grep apiserver  !!!也没有?master节点上没有apiserver,所以问题肯定处在apiserver没有启动。接着我检查下/etc/kubernetes/manifests,一般静态pod都会放在这个目录下,要是没有,就去查看下Kubelet的配置文件
    ls /etc/kubernetes/manifests   ###发现apiserver,controllermanager的yaml都在这里。
    按21题的方式查看下kubelet的配置,发现静态Pod的路径没配置,就按21题的方式配置好,即在kubelet配置文件中添加staticPodPath: /etc/kubernetes/manifests(说明下可以在两个地方配置这个参数,一个是kubectl.service的配置文件中的KUBELET_ARGS="--cluster-dns=10.254.0.10 --cluster-domain=kube.local --pod-manifest-path= /etc/kubernetes/manifests,一个是KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml 的yaml文件中)
    systemctl restart kubelet
    systemctl enable kubelet

    发现apiserver的pod起来了,kubectl get pod可以正常返回来。

    kubectl get nodes都是ready状态

    #### 24、Set configuration context $kubectl config use-context hk8s Create a persistent volume with name appconfig of capacity 1Gi and access mode ReadWriteMany. The type of volume is hostPath and its locationis /srv/app-config

    解析:官网搜索persistent volume


    ```yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: appconfig
    spec:
      capacity:
        storage: 1Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
      hostPath:
        path: /srv/app-config
    ```

    kubectl apply -f xx.yaml
    kubectl get pv 看下这个pv,status是available的就可以了。
  • 相关阅读:
    字符串的格式化操作
    了解格式化输出,字符串和编码
    面试题2
    面试题1
    设计算法1
    C++ STL容器的理解
    网络是怎样连接的-路由器的附加功能
    网络是怎样连接的-路由器的包转发操作(下)
    网络是怎样连接的-路由器的包转发操作(上)
    网络是怎样连接的-交换机的包转发操作
  • 原文地址:https://www.cnblogs.com/fadewalk/p/13620698.html
Copyright © 2020-2023  润新知