POD基础

一.pod基本概念

pod是kubernetes创建和管理的最小单元。
一个pod由单个或多个容器组成,这些容器共享存储和网络
pod的特点:
  • 一个pod可以理解为一个应用实例,提供服务  
  • pod中的容器部署在Node上
  • pod中的容器共享网络和存储资源
  • kubernetes直接管理pod,而不是容器

二.pod存在的意义

pod主要用法

  • 运行单个容器:最常见的应用场景。在这行情况下,可以把pod看做单个容器的抽象封装
  • 运行多个容器:封装多个紧密耦合且需要共享资源的应用程序

 

三.pod资源实现共享机制

  

pause容器:
  pause容器全称infrastucture container(又叫infra)基础容器
  每个pod里运行着一个特殊的被称为pause的容器,其他容器则为业务容器。这些业务容器共享pause容器的网络栈和Volume挂在卷,因此他们之间通信和数据交换更为高效
  在设计业务架构时,可以充分利用这一特性将一组密切相关的服务进程放入同一个pod中。同一个pod里的容器之间仅需localhost就能互相通信    

四.pod日常管理

创建Pod:
  kubectl apply -f pod.yaml
  或者使用命令 kubectl run nginx --image=nginx
查看Pod:
  kubectl get pods
  kubectl describe pod <Pod名称>
查看日志:
  kubectl logs <Pod名称> [-c CONTAINER]
  kubectl logs <Pod名称> [-c CONTAINER] -f
进入容器终端:
  kubectl exec <Pod名称> [-c CONTAINER] -- bash
删除Pod:
  kubectl delete <Pod名称> 

五、重启策略和健康检查,实现应用自修复

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

健康检查:

  livenessProbe(存活检查):如果检查失败,将杀死容器,根据pod的restartPolicy来操作

  readinessProbe(就绪检查):如果检查失败,kubernetes会把pod从service endpoint中剔除(不分发流量给它)

  startupProbe(启动检查)

三种检查方法:

  httpGET:发送http get请求。返回200-400范围的状态码为成功

  exec:执行shell命令返回状态码是0为成功(echo $?)

  tcpSocket:发起tcp socket建立成功

#exec存活检查示例:

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5     # 启动容器5秒后开始检查
      periodSeconds: 5            # 间隔5秒检查一次


# describe查看event事件验证:
Events:
  Type     Reason     Age                    From                Message
  ----     ------     ----                   ----                -------
  Normal   Scheduled  5m48s                  default-scheduler   Successfully assigned default/liveness-exec to k8s-node1
  Normal   Pulled     5m31s                  kubelet, k8s-node1  Successfully pulled image "busybox" in 14.880201986s
  Normal   Pulled     4m6s                   kubelet, k8s-node1  Successfully pulled image "busybox" in 10.527461536s
  Normal   Created    2m34s (x3 over 5m31s)  kubelet, k8s-node1  Created container liveness
  Normal   Pulled     2m34s                  kubelet, k8s-node1  Successfully pulled image "busybox" in 18.074284946s
  Normal   Started    2m33s (x3 over 5m31s)  kubelet, k8s-node1  Started container liveness
  Normal   Killing    112s (x3 over 4m47s)   kubelet, k8s-node1  Container liveness failed liveness probe, will be restarted
  Normal   Pulling    82s (x4 over 5m46s)    kubelet, k8s-node1  Pulling image "busybox"
  Warning  Unhealthy  37s (x10 over 4m57s)   kubelet, k8s-node1  Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory

参考文档:https://v1-17.docs.kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

 六.向pod中注入环境变量

# 变量的3种定义方式:
  • 自定义变量值
  • 变量值从pod属性中获取
  • 变量值从Secret、ConfigMap中获取
apiVersion: v1
kind: Pod
metadata:
  name: pod-envars
spec:
  containers:
    - name: test
      image: busybox
      command: [ "sh", "-c", "sleep 36000"]
      env:
        - name: MY_NODE_NAME
          valueFrom:
            fieldRef:
              fieldPath: spec.nodeName           
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name           
        - name: MY_POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace       
        - name: MY_POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP              
        - name: nginx 
          value: "/usr/local/nginx/bin"            # 自定义

验证:

    [root@k8s-master yaml]# kubectl exec -it pod-envars -- sh
    / # echo $MY_NODE_NAME
    k8s-node1
    / # echo $MY_POD_NAME
    pod-envars
    / # echo $MY_POD_NAMESPACE
    default
    / # echo $MY_POD_IP
    10.244.36.90
    / # echo $nginx
    /usr/local/nginx/bin

 七.init container

init container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务
  • 支持大部分应用容器的配置,但不支持健康检查
  • 优先应用容器执行
应用场景:
  环境检查:确保应用容器以来的服务启动之后再启动应用容器(nginx需要等待mysql启动后,才能启动)
  初始化配置:给应用容器准备配置文件(从配置中心拉取)

示例:启动一个web服务器前,从指定位置拉取最新代码(网站代码没有打包到镜像中),wget模拟

apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  initContainers:
  - name: download
    image: busybox
    command:
    - wget
    - "-O"
    - "/opt/index.html"
    - http://www.ctnrs.com
    volumeMounts:
    - name: wwwroot
      mountPath: "/opt"
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: wwwroot
      mountPath: /usr/share/nginx/html
  volumes:
  - name: wwwroot
    emptyDir: {}

总结

pod中会有这几种类型的容器

    infra container:基础容器 维护整个pod网络空间
    init container:初始化容器  先于业务容器运行
    containers:业务容器      
posted @ 2020-11-24 15:08  碎梦重拾  阅读(259)  评论(0编辑  收藏  举报