zoukankan      html  css  js  c++  java
  • 深入理解pod

    •最小部署单元
    •一组容器的集合
    •一个Pod中的容器共享网络命名空间
    •Pod是短暂的

    一、Pod容器分类

    1、Infrastructure Container:基础容器  (维护整个Pod网络空间)

    [root@node01 cfg]# cat kubelet

    KUBELET_OPTS="--logtostderr=true
    --v=4
    --hostname-override=10.192.27.115
    --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig
    --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig
    --config=/opt/kubernetes/cfg/kubelet.config
    --cert-dir=/opt/kubernetes/ssl
    --pod-infra-container-image=10.192.27.111/library/pause-amd64:3.0  #node节点的kubelet服务已经设置好了基础容器的路径

    维护整个Pod网络空间,启动一个容器时,k8s会自动为我们启动一个基础容器

    2、InitContainers:初始化容器(先于业务容器开始执行)
    官方参考地址:https://kubernetes.io/docs/concepts/workloads/pods/init-containers/

    apiVersion: v1
    kind: Pod
    metadata:
      name: myapp-pod
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp-container
        image: busybox:1.28
        command: ['sh', '-c', 'echo The app is running! && sleep 3600']
      initContainers:
      - name: init-myservice
        image: busybox:1.28
        command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
      - name: init-mydb
        image: busybox:1.28
        command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

    3、Containers:业务容器(并行启动)

    二、镜像拉取策略(imagePullPolicy)

    官方参考地址:https://kubernetes.io/docs/concepts/containers/images/

    •IfNotPresent:默认值,镜像在宿主机上不存在时才拉取
    •Always:每次创建Pod 都会重新拉取一次镜像
    •Never:Pod 永远不会主动拉取这个镜像

    拉取私有镜像仓库的镜像(我使用 在pod上指定ImagePullSecrets)

    官方提供了多种方法可以参考:https://kubernetes.io/zh/docs/concepts/containers/images/

    #要先任意一个node节点登录一下 docker login 10.192.27.115  就用在/root/.docker/config.json下面留下凭据
    [root@node01 image]# cat /root/.docker/config.json  #账号:0216000942 密码:Harbor12345  
    {
        "auths": {
            "10.192.27.111": {
                "auth": "MDIxNjAwMDk0MjpIYXJib3IxMjM0NQ=="
            }
        },
        "HttpHeaders": {
            "User-Agent": "Docker-Client/18.09.4 (linux)"
        }
    }[root@node01 image]# 
    [root@node01 image]# cat /root/.docker/config.json |base64  #base64编码方式
    ewoJImF1dGhzIjogewoJCSIxMC4xOTIuMjcuMTExIjogewoJCQkiYXV0aCI6ICJNREl4TmpBd01E
    azBNanBJWVhKaWIzSXhNak0wTlE9PSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2Vy
    LUFnZW50IjogIkRvY2tlci1DbGllbnQvMTguMDkuNCAobGludXgpIgoJfQp9
    [root@node01 image]# cat /root/.docker/config.json |base64 -w 0 #转化成一行
    ewoJImF1dGhzIjogewoJCSIxMC4xOTIuMjcuMTExIjogewoJCQkiYXV0aCI6ICJNREl4TmpBd01EazBNanBJWVhKaWIzSXhNak0wTlE9PSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTguMDkuNCAobGludXgpIgoJfQp9[root@node01 image]# 
    #master节点上创建一个秘钥配置文件
    [root@master01 yaml_doc]# vim registry-pull-secret.yaml  #创建一个Secret的yaml文件
    apiVersion: v1
    kind: Secret
    metadata:
      name: registry-pull-secret
    data:
      .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxMC4xOTIuMjcuMTExIjogewoJCQkiYXV0aCI6ICJNREl4TmpBd01EazBNanBJWVhKaWIzSXhNak0wTlE9PSIKCQl9Cgl9LAoJIkh0dHBIZWFkZXJzIjogewoJCSJVc2VyLUFnZW50IjogIkRvY2tlci1DbGllbnQvMTguMDkuNCAobGludXgpIgoJfQp9
    type: kubernetes.io/dockerconfigjson
    
    [root@master01 yaml_doc]# kubectl create -f registry-pull-secret.yaml 
    [root@master01 yaml_doc]# kubectl get secrets
    NAME                   TYPE                                  DATA   AGE
    default-token-sj2lw    kubernetes.io/service-account-token   3      9d
    registry-pull-secret   kubernetes.io/dockerconfigjson        1      176m
    [root@master01 yaml_doc]# 
    #master节点上创建一个pod
    [root@master01 yaml_doc]# vim nginx-pod.yaml  #创建一个pod的yaml文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
      namespace: default
      labels:
        app: nginx-pod
    
    spec:
      imagePullSecrets:         #使用密钥配置文件
      - name: registry-pull-secret
      containers:
      - name: nginx
        image: 10.192.27.111/project/nginx:latest
        imagePullPolicy: IfNotPresent
        command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        ports:
        - containerPort: 80
    
    [root@master01 yaml_doc]# kubectl create -f nginx-pod.yaml 
    pod/nginx-pod created
    [root@master01 yaml_doc]# kubectl get pods -o wide  #查看pod分配到哪个node节点 PodIP是172.17.46.2
    NAME        READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES
    nginx-pod   1/1     Running   0          2m26s   172.17.46.2   10.192.27.116   <none>           <none>
    #master节点上创建一个server
    [root@master01 yaml_doc]# vim nginx-service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service-mxxl
    spec:
      type: NodePort  #server负载均衡模式之一:暴露IP端口 默认是ClusterIP
      ports:
      - port: 80  #集群server端口
        nodePort: 30080  #外部端口
      selector:    #匹配便签为nginx-pod的pod
        app: nginx-pod
    [root@master01 yaml_doc]# kubectl create -f nginx-service.yaml 
    service/nginx-service-mxxl created
    [root@master01 yaml_doc]# kubectl get svc
    NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    kubernetes           ClusterIP   10.0.0.1     <none>        443/TCP        9d
    nginx-service-mxxl   NodePort    10.0.0.65    <none>        80:30080/TCP   5s   #分配集群IP(可能对应一组pod)和Port为10.0.0.65:80《---- nodeIP:30080
    访问方式:
    浏览器:http://nodeIP:30080
    [root@node01 ~]# curl 172.17.46.2  #访问podIP
    [root@node01 ~]# curl 10.0.0.65  #访问集群IP

     学习一个命令:

    kubectl edit pod/nginx-pod   #相当于 vim nginx-pod.yaml   kubectl apply -f  nginx-pod.yaml

    三、资源限制

    官方参考地址 https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
    Pod和Container的资源请求和限制:
    •spec.containers[].resources.limits.cpu
    •spec.containers[].resources.limits.memory
    •spec.containers[].resources.requests.cpu
    •spec.containers[].resources.requests.memory

    创建一个资源限制的容器示例

    [root@master01 yaml_doc]# cat resources-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: frontend
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: db
        image: 10.192.27.111/project/mysql:5.7
        imagePullPolicy: IfNotPresent
        command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "Harbor12345"
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi" #最大128M
            cpu: "500m"  #最大半个CPU
      - name: wp
        image: 10.192.27.111/project/wordpress:latest
        imagePullPolicy: IfNotPresent
        command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        resources:
          requests:
            memory: "1G"
            cpu: 0.5
          limits:
            memory: "2G"
            cpu: 1
            
    [root@master01 yaml_doc]# kubectl create -f resources-pod.yaml
    pod/frontend created
    [root@master01 yaml_doc]# kubectl get pods -o wide
    NAME        READY   STATUS    RESTARTS   AGE     IP            NODE            NOMINATED NODE   READINESS GATES
    frontend    2/2     Running   0          8m23s   172.17.43.2   10.192.27.115   <none>           <none>
    nginx-pod   1/1     Running   0          20h     172.17.46.2   10.192.27.116   <none>           <none>
    [root@master01 yaml_doc]# 
    [root@master01 yaml_doc]# kubectl describe pod frontend
    Name:               frontend
    Namespace:          default
    Priority:           0
    PriorityClassName:  <none>
    Node:               10.192.27.115/10.192.27.115
    Start Time:         Thu, 21 Nov 2019 10:55:13 +0800
    Labels:             <none>
    Annotations:        <none>
    Status:             Running
    IP:                 172.17.43.2
    Containers:
      db:
        Container ID:  docker://e01ca1c893378176f31a7c4dc7409e043e0d7a7d8b18f1e2d0bedab3d8d141c1
        Image:         10.192.27.111/project/mysql:5.7
        Image ID:      docker-pullable://10.192.27.111/project/mysql@sha256:5c508e03f7f1987a393816a9ce2358f4abbdd36629972ba870af8f4cfcd031c0
        Port:          <none>
        Host Port:     <none>
        Command:
          /bin/bash
          -ce
          tail -f /dev/null
        State:          Running
          Started:      Thu, 21 Nov 2019 10:55:14 +0800
        Ready:          True
        Restart Count:  0
        Limits:
          cpu:     500m
          memory:  128Mi
        Requests:
          cpu:     250m
          memory:  64Mi
        Environment:
          MYSQL_ROOT_PASSWORD:  Harbor12345
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-sj2lw (ro)
      wp:
        Container ID:  docker://3f0ee5e0d72e7e5c4ac55aa94fa2aee5022c39583576f0c1842f9636cd7c8b39
        Image:         10.192.27.111/project/wordpress:latest
        Image ID:      docker-pullable://10.192.27.111/project/wordpress@sha256:8add16d8bce7fd2f428f21476f642019638ed85921397f62b87e3c9878c79486
        Port:          <none>
        Host Port:     <none>
        Command:
          /bin/bash
          -ce
          tail -f /dev/null
        State:          Running
          Started:      Thu, 21 Nov 2019 10:55:14 +0800
        Ready:          True
        Restart Count:  0
        Limits:
          cpu:     1
          memory:  2G
        Requests:
          cpu:        500m
          memory:     1G
        Environment:  <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-sj2lw (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      default-token-sj2lw:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-sj2lw
        Optional:    false
    QoS Class:       Burstable
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
      Type    Reason     Age   From                    Message
      ----    ------     ----  ----                    -------
      Normal  Scheduled  9m7s  default-scheduler       Successfully assigned default/frontend to 10.192.27.115
      Normal  Pulled     9m6s  kubelet, 10.192.27.115  Container image "10.192.27.111/project/mysql:5.7" already present on machine
      Normal  Created    9m6s  kubelet, 10.192.27.115  Created container
      Normal  Started    9m6s  kubelet, 10.192.27.115  Started container
      Normal  Pulled     9m6s  kubelet, 10.192.27.115  Container image "10.192.27.111/project/wordpress:latest" already present on machine
      Normal  Created    9m6s  kubelet, 10.192.27.115  Created container
      Normal  Started    9m6s  kubelet, 10.192.27.115  Started container
    [root@master01 yaml_doc]# 
    #查看名为frontend 的 pod详细信息

    查看完整的pod信息比较多是,可以只查看创建过程

    grep -A -B -C
    -A -B -C 后面都跟阿拉伯数字
    -A是显示匹配后和它后面的n行。
    -B是显示匹配行和它前面的n行。
    -C是匹配行和它前后各n行。
    总体来说,-C覆盖面最大,这3个开关都是关于匹配行的上下文的(context)。

    [root@master01 yaml_doc]# kubectl describe pod frontend | grep -A 20 Events #查看pod创建情况 :Events后20行信息
    Events:
      Type    Reason     Age   From                    Message
      ----    ------     ----  ----                    -------
      Normal  Scheduled  11m   default-scheduler       Successfully assigned default/frontend to 10.192.27.115
      Normal  Pulled     11m   kubelet, 10.192.27.115  Container image "10.192.27.111/project/mysql:5.7" already present on machine
      Normal  Created    11m   kubelet, 10.192.27.115  Created container
      Normal  Started    11m   kubelet, 10.192.27.115  Started container
      Normal  Pulled     11m   kubelet, 10.192.27.115  Container image "10.192.27.111/project/wordpress:latest" already present on machine
      Normal  Created    11m   kubelet, 10.192.27.115  Created container
      Normal  Started    11m   kubelet, 10.192.27.115  Started container
    [root@master01 yaml_doc]# 
    #查看该节点的所有信息 包括该节点的docker容器  资源占用情况 
    [root@master01 yaml_doc]# kubectl describe nodes 10.192.27.115
    Name:               10.192.27.115
    Roles:              <none>
    Labels:             beta.kubernetes.io/arch=amd64
                        beta.kubernetes.io/os=linux
                        kubernetes.io/hostname=10.192.27.115
    Annotations:        node.alpha.kubernetes.io/ttl: 0
                        volumes.kubernetes.io/controller-managed-attach-detach: true
    CreationTimestamp:  Mon, 11 Nov 2019 15:37:25 +0800
    Taints:             <none>
    Unschedulable:      false
    Conditions:
      Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
      ----             ------  -----------------                 ------------------                ------                       -------
      MemoryPressure   False   Thu, 21 Nov 2019 11:12:03 +0800   Mon, 11 Nov 2019 15:37:25 +0800   KubeletHasSufficientMemory   kubelet has sufficient memory available
      DiskPressure     False   Thu, 21 Nov 2019 11:12:03 +0800   Mon, 11 Nov 2019 15:37:25 +0800   KubeletHasNoDiskPressure     kubelet has no disk pressure
      PIDPressure      False   Thu, 21 Nov 2019 11:12:03 +0800   Mon, 11 Nov 2019 15:37:25 +0800   KubeletHasSufficientPID      kubelet has sufficient PID available
      Ready            True    Thu, 21 Nov 2019 11:12:03 +0800   Mon, 11 Nov 2019 15:37:35 +0800   KubeletReady                 kubelet is posting ready status
    Addresses:
      InternalIP:  10.192.27.115
      Hostname:    10.192.27.115
    Capacity:   #总共的资源
     cpu:                40
     ephemeral-storage:  51175Mi
     hugepages-1Gi:      0
     hugepages-2Mi:      0
     memory:             32656556Ki
     pods:               110
    Allocatable:  #可以给pod的资源
     cpu:                40
     ephemeral-storage:  48294789041
     hugepages-1Gi:      0
     hugepages-2Mi:      0
     memory:             32554156Ki
     pods:               110
    System Info:
     Machine ID:                 9c53ba3f1bcb43e19507d4a2e98730da
     System UUID:                4C4C4544-0053-5A10-8034-B1C04F4B4C32
     Boot ID:                    8ac2ecf8-70bd-44a4-bfee-422c82d68c3a
     Kernel Version:             3.10.0-957.el7.x86_64
     OS Image:                   CentOS Linux 7 (Core)
     Operating System:           linux
     Architecture:               amd64
     Container Runtime Version:  docker://18.9.4
     Kubelet Version:            v1.13.0
     Kube-Proxy Version:         v1.13.0
    Non-terminated Pods:         (1 in total)
      Namespace                  Name        CPU Requests  CPU Limits  Memory Requests  Memory Limits   AGE
      ---------                  ----        ------------  ----------  ---------------  -------------   ---
      default                    frontend    750m (1%)     1500m (3%)  1067108864 (3%)  2084197Ki (6%)  16m  #每个pod资源限制详细
    Allocated resources:  #所有的pod资源限制
      (Total limits may be over 100 percent, i.e., overcommitted.)
      Resource           Requests         Limits
      --------           --------         ------
      cpu                750m (1%)        1500m (3%)       
      memory             1067108864 (3%)  2084197Ki (6%)
      ephemeral-storage  0 (0%)           0 (0%)
    Events:              <none>
    [root@master01 yaml_doc]# 
    
    [root@master01 yaml_doc]# kubectl get ns #查看所有命名空间
    NAME          STATUS   AGE
    default       Active   8d  #默认使用这个
    kube-public   Active   8d
    kube-system   Active   8d
    [root@master01 yaml_doc]#
    #查看该节点的所有信息 包括该节点的docker容器 资源占用情况

    四、重启策略(restartPolicy)

    •Always:当容器终止退出后,总是重启容器,默认策略。
    •OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
    •Never::当容器终止退出,从不重启容器。

    [root@master01 yaml_doc]# cat restart-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: restart-pod
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: nginx
        image: 10.192.27.111/project/nginx:latest
        imagePullPolicy: IfNotPresent
    #    command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        args:
          - /bin/sh
          - -c
          - sleep 30; exit 0
      restartPolicy: Always  #当容器终止退出后,总是重启容器,默认策略。
    [root@master01 yaml_doc]# 
    
    
    [root@master01 yaml_doc]# kubectl apply -f restart-pod.yaml 
    pod/restart-pod created
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    restart-pod   1/1     Running   0          1s            #容器起来花了1秒
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS      RESTARTS   AGE
    restart-pod   0/1     Completed   0          31s     #容器30秒完成任务退出了
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    restart-pod   1/1     Running   1          32s   #退出后又重启了 #RESTARTS的数值为1 说明重启了一次
    Always示例
    [root@master01 yaml_doc]# cat restart-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: restart-pod
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: nginx
        image: 10.192.27.111/project/nginx:latest
        imagePullPolicy: IfNotPresent
    #    command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        args:
          - /bin/sh
          - -c
          - sleep 30; exit 0
      restartPolicy: Never        #当容器终止退出,从不重启容器。
    [root@master01 yaml_doc]# 
    
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    restart-pod   1/1     Running   0          1s            #容器起来花了1秒
    
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS      RESTARTS   AGE
    restart-pod   0/1     Completed   0          31s  #不重启 容器30秒完成Completed任务退出了  
    
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS      RESTARTS   AGE
    restart-pod   0/1     Completed   0          76s  #不重启了 容器可用变为0/1 
    Never
    [root@master01 yaml_doc]# cat restart-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: restart-pod
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: nginx
        image: 10.192.27.111/project/nginx:latest
        imagePullPolicy: IfNotPresent
    #    command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        args:
          - /bin/sh
          - -c
          - sleep 30; exit 0
      restartPolicy: OnFailure
    [root@master01 yaml_doc]# 
    
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    restart-pod   1/1     Running   0          1s            #容器起来花了1秒
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS      RESTARTS   AGE
    restart-pod   0/1     Completed   0          31s  #正常退出不重启 容器30秒完成Completed任务退出了  
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS      RESTARTS   AGE
    restart-pod   0/1     Completed   0          44s
    [root@master01 yaml_doc]# 
    
    
    
    
    [root@master01 yaml_doc]# cat restart-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: restart-pod
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: nginx
        image: 10.192.27.111/project/nginx:latest
        imagePullPolicy: IfNotPresent
    #    command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        args:
          - /bin/sh
          - -c
          - sleep 30; exit 3
      restartPolicy: OnFailure   #当容器异常退出(退出状态码非0)时,才重启容器
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    restart-pod   1/1     Running   0          1s            #容器起来花了1秒
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    restart-pod   0/1     Error     0          31s   ##当容器异常退出(退出状态码非0)时,才重启容器
    [root@master01 yaml_doc]# kubectl get pods
    NAME          READY   STATUS    RESTARTS   AGE
    restart-pod   1/1     Running   1          32s
    OnFailure示例

    学习一个命令# kubectl get ep #service endpoint

    endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个service对应的所有pod的访问地址。service配置selector(关联一组pod),endpoint controller才会自动创建对应的endpoint对象;否则,不会生成endpoint对象。
    例如,k8s集群中创建一个名为nginx-service-mxxl的service,就会生成一个同名的endpoint对象,ENDPOINTS就是service关联的pod的ip地址和端口。

    [root@master01 yaml_doc]# kubectl get ep,svc
    NAME                           ENDPOINTS                               AGE
    endpoints/kubernetes           10.192.27.100:6443,10.192.27.114:6443   10d
    endpoints/nginx-service-mxxl   172.17.46.2:80                          23h
    
    NAME                         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    service/kubernetes           ClusterIP   10.0.0.1     <none>        443/TCP        10d    #对应两个master节点
    service/nginx-service-mxxl   NodePort    10.0.0.65    <none>        80:30080/TCP   23h    # 对应 172.17.46.2:80  
    [root@master01 yaml_doc]# 

     

    五、健康检查(Probe)

    Probe有以下两种类型:
    livenessProbe:如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。 #根据 四、 重启机制
    readinessProbe:如果检查失败,Kubernetes会把Pod从service endpoints中剔除。#剔除endpoints


    官方详细介绍了:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
    Probe支持以下三种检查方法:
    httpGet:发送HTTP请求,返回200-400范围状态码为成功。
    exec:执行Shell命令返回状态码是0为成功。
    tcpSocket:发起TCP Socket建立成功。

    [root@master01 yaml_doc]# cat liveness-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-exec
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: liveness
        image: 10.192.27.111/project/busybox:latest
        args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 600
        livenessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy  #如果这个文件不存在返回的状态码非零  echo $?  就是会重启容器
          initialDelaySeconds: 5  # 容器启动五秒之后启动健康检查
          periodSeconds: 5 #间隔5执行健康检查
        
    [root@master01 yaml_doc]# kubectl get pods
    NAME            READY   STATUS    RESTARTS   AGE
    liveness-exec   1/1     Running   0          52s
    [root@master01 yaml_doc]# 
    NAME            READY   STATUS    RESTARTS   AGE
    liveness-exec   1/1     Running   1          53s   #重启了一次
    liveness检查示例
    [root@master01 yaml_doc]# cat readiness-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: readiness
      name: readiness-exec
    spec:
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: readiness
        image: 10.192.27.111/project/busybox:latest
        args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 600
        readinessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy  #如果这个文件不存在返回的状态码非零  echo $?  就是会重启容器
          initialDelaySeconds: 5  # 容器启动五秒之后启动健康检查
          periodSeconds: 5 #间隔5执行健康检查
    [root@master01 yaml_doc]#     
        
    [root@master01 yaml_doc]# kubectl get pods
    NAME             READY   STATUS    RESTARTS   AGE
    readiness-exec   1/1     Running   0          24s
    [root@master01 yaml_doc]# kubectl get pods
    NAME             READY   STATUS    RESTARTS   AGE
    readiness-exec   0/1     Running   0          25s
    readiness检查示例

    六、调度约束

    nodeName用于将Pod调度到指定的Node名称上
    nodeSelector用于将Pod调度到匹配Label的Node上

    ############没有指定node节点创建pod的情况########
    [root@master01 yaml_doc]# kubectl create -f nginx-pod.yaml 
    pod/nginx-pod created
    [root@master01 yaml_doc]# kubectl get pods
    NAME        READY   STATUS    RESTARTS   AGE
    nginx-pod   1/1     Running   0          9s
    [root@master01 yaml_doc]# kubectl describe pod nginx-pod
    Name:               nginx-pod
    Namespace:          default
    Priority:           0
    PriorityClassName:  <none>
    Node:               10.192.27.116/10.192.27.116
    Start Time:         Thu, 21 Nov 2019 16:29:07 +0800
    Labels:             app=nginx-pod
    Annotations:        <none>
    Status:             Running
    IP:                 172.17.46.2
    Containers:
      nginx:
        Container ID:  docker://78a9dd0bdb54c2dde89e588fa0d09cea265b617f7e5752318d783483086eb2e6
        Image:         10.192.27.111/project/nginx:latest
        Image ID:      docker-pullable://10.192.27.111/project/nginx@sha256:f56b43e9913cef097f246d65119df4eda1d61670f7f2ab720831a01f66f6ff9c
        Port:          80/TCP
        Host Port:     0/TCP
        Command:
          /bin/bash
          -ce
          tail -f /dev/null
        State:          Running
          Started:      Thu, 21 Nov 2019 16:29:08 +0800
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-sj2lw (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      default-token-sj2lw:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-sj2lw
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
      Type    Reason     Age   From                    Message
      ----    ------     ----  ----                    -------
      Normal  Scheduled  15s   default-scheduler       Successfully assigned default/nginx-pod to 10.192.27.116  #这行调用了调度器 
      Normal  Pulled     14s   kubelet, 10.192.27.116  Container image "10.192.27.111/project/nginx:latest" already present on machine
      Normal  Created    14s   kubelet, 10.192.27.116  Created container
      Normal  Started    14s   kubelet, 10.192.27.116  Started container
    [root@master01 yaml_doc]# 
    没有指定node节点创建pod的情况
    ############指定node节点创建pod########
    [root@master01 yaml_doc]# cat nodeName-pod.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-pod
      namespace: default
      labels:
        app: nginx-pod
    
    spec:
      nodeName: 10.192.27.115
      imagePullSecrets:
      - name: registry-pull-secret
      containers:
      - name: nginx
        image: 10.192.27.111/project/nginx:latest
        imagePullPolicy: IfNotPresent
        command: [ "/bin/bash", "-ce", "tail -f /dev/null" ]
        ports:
        - containerPort: 80
    [root@master01 yaml_doc]# 
    
    
    [root@master01 yaml_doc]# kubectl create -f nodeName-pod.yaml 
    pod/nginx-pod created
    [root@master01 yaml_doc]# kubectl get pods
    NAME        READY   STATUS    RESTARTS   AGE
    nginx-pod   1/1     Running   0          2s
    [root@master01 yaml_doc]# kubectl describe pod nginx-pod
    Name:               nginx-pod
    Namespace:          default
    Priority:           0
    PriorityClassName:  <none>
    Node:               10.192.27.115/10.192.27.115
    Start Time:         Thu, 21 Nov 2019 16:26:29 +0800
    Labels:             app=nginx-pod
    Annotations:        <none>
    Status:             Running
    IP:                 172.17.43.2
    Containers:
      nginx:
        Container ID:  docker://18af2f91fd29c78540b294e56111ef5d0c96494cebdf971cc1d4f5876929f61e
        Image:         10.192.27.111/project/nginx:latest
        Image ID:      docker-pullable://10.192.27.111/project/nginx@sha256:f56b43e9913cef097f246d65119df4eda1d61670f7f2ab720831a01f66f6ff9c
        Port:          80/TCP
        Host Port:     0/TCP
        Command:
          /bin/bash
          -ce
          tail -f /dev/null
        State:          Running
          Started:      Thu, 21 Nov 2019 16:26:30 +0800
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-sj2lw (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      default-token-sj2lw:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-sj2lw
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
      Type    Reason   Age   From                    Message
      ----    ------   ----  ----                    -------  #这行没有调度器  因为是直接指定了node节点,就没有显示
      Normal  Pulled   6s    kubelet, 10.192.27.115  Container image "10.192.27.111/project/nginx:latest" already present on machine
      Normal  Created  6s    kubelet, 10.192.27.115  Created container
      Normal  Started  6s    kubelet, 10.192.27.115  Started container
    [root@master01 yaml_doc]# 
    指定node节点创建pod
    [root@master01 yaml_doc]# kubectl get nodes --show-labels
    NAME            STATUS   ROLES    AGE   VERSION   LABELS
    10.192.27.115   Ready    <none>   10d   v1.13.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=10.192.27.115
    10.192.27.116   Ready    <none>   10d   v1.13.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=10.192.27.116
    [root@master01 yaml_doc]# 
    [root@master01 yaml_doc]# kubectl label nodes 10.192.27.115 team=a  #给每个node设置标签
    node/10.192.27.115 labeled
    [root@master01 yaml_doc]# kubectl label nodes 10.192.27.116 team=b
    node/10.192.27.116 labeled
    [root@master01 yaml_doc]# kubectl get nodes --show-labels
    NAME           STATUS   ROLES    AGE   VERSION   LABELS
    10.192.27.115   Ready    <none>   9d    v1.13.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=10.192.27.115,team=a
    10.192.27.116   Ready    <none>   9d    v1.13.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=10.192.27.116,team=b
    [root@master01 yaml_doc]# 
    [root@master01 yaml_doc]# vim pod5.yaml 
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-example
    kind: Pod
    metadata:
      name: pod-example
      labels:
        app: nginx
    spec:
      nodeSelector:
        team: a
      containers:
      - name: nginx
        image: nginx:1.15
    
    [root@master01 yaml_doc]# kubectl apply -f pod5.yaml 
    pod/pod-example created
    
    
    [root@master01 yaml_doc]# kubectl describe pod pod-example
    Name:               pod-example
    Namespace:          default
    Priority:           0
    PriorityClassName:  <none>
    Node:               10.192.27.115/10.192.27.115
    Start Time:         Thu, 12 Sep 2019 22:01:14 +0800
    Labels:             app=nginx
    Annotations:        kubectl.kubernetes.io/last-applied-configuration:
                          {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"pod-example","namespace":"default"},"spec":{...
    Status:             Running
    IP:                 172.17.39.8
    Containers:
      nginx:
        Container ID:   docker://2ce176b032561b1de82a941aacae9127a7bd4dd8439e23480f28289ae2825893
        Image:          nginx:1.15
        Image ID:       docker-pullable://nginx@sha256:670ba067df36460bc89cb0ec333c79795f720639846ad32724d019197afb61e9
        Port:           <none>
        Host Port:      <none>
        State:          Running
          Started:      Thu, 12 Sep 2019 22:01:35 +0800
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-4zq5b (ro)
    Conditions:
      Type              Status
      Initialized       True 
      Ready             True 
      ContainersReady   True 
      PodScheduled      True 
    Volumes:
      default-token-4zq5b:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-4zq5b
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  team=a
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
      Type    Reason     Age   From                   Message
      ----    ------     ----  ----                   -------
      Normal  Scheduled  45s   default-scheduler      Successfully assigned default/pod-example to 10.192.27.115 ####走到了调度器了
      Normal  Pulled     26s   kubelet, 10.192.27.115  Container image "nginx:1.15" already present on machine
      Normal  Created    26s   kubelet, 10.192.27.115  Created container
      Normal  Started    24s   kubelet, 10.192.27.115  Started container
    [root@master01 yaml_doc]# 
    nodeSelector用于将Pod调度到匹配Label的Node上

     七、故障排查

    https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/

    故障排除的方法:
    kubectl describe TYPE/NAME
    kubectl logs TYPE/NAME [-c CONTAINER]
    kubectl exec POD [-c CONTAINER] --COMMAND [args...]

     

  • 相关阅读:
    最常见VC++编译错误信息集合
    网站运营最全总结
    KdPrint/DbgPrint and UNICODE_STRING/ANSI_STRING
    poj 2155 matrix
    【hdu2955】 Robberies 01背包
    【hdu4570】Multi-bit Trie 区间DP
    2014 SCAU_ACM 暑期集训
    qpython 读入数据问题: EOF error with input / raw_input
    【转】Python version 2.7 required, which was not found in the registry
    华农正方系统 登录地址
  • 原文地址:https://www.cnblogs.com/linux985/p/11898029.html
Copyright © 2011-2022 走看看