k8s-pod学习

0.pod概念

1)PodPod是一个容器组,是k8s中最小的可部署的单元。一个Pod其中包含了最少一个应用程序容器,存储资源,一个唯一的网络IP地址,以及一些确定容器该如何运行的配置。一般一个Pod里面运行一个容器即可,k8s通过Pod来管理容器。如果一个Pod里面要运行几个容器,那么要注意容器与容器之间一定是紧耦合的。

1.pod配置文件

1)先创建一个yaml文件用来写配置,这里用配置nginx来举例。

#Step1 先创建一个nginx-demo.yaml文件
touch nginx-demo.yaml

#Step2 向nginx-demo.yamal文件中写入配置
apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo # Pod 的名称
  labels: # 定义 Pod 的标签
    type: app # 自定义 label 标签,名字为 type,值为 app
    test: 1.0.0 # 自定义 label 标签,描述 Pod 版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    env: # 环境变量
     - name: JVM_OPTS # 环境变量名称
      value: '-Xms128m -Xmx128m' # 环境变量的值
    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制 cpu 最少使用 0.1 个核心
        memory: 128Mi # 限制内存最少使用 128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制 cpu 最多使用 0.2 个核心
        memory: 256Mi # 限制 最多使用 256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启
  
  #Step3 进行文件的执行
   kubectl create -f nginx-demo.yaml

2)不出意外,nginx服务已经起来了。

# 查看Pod
kubectl get po
# 查看Pod的详细信息,在这就可以看到nginx的端口地址
kubectl get po -o wide

3)当nginx服务运行结束,那么nginx就成为了completed状态,可以使用以下命令删除已经运行结束的pod

kubectl delete pod <podname>

4)pod配置文件,参数解析,如果看不懂上文中yaml文件的配置,可以查看以下表格。

参数名 类型 字段说明
apiVersion String K8S APl 的版本,可以用 kubectl api versions 命令查询
kind String yam 文件定义的资源类型和角色
metadata Object 元数据对象,下面是它的属性
metadata.name String 元数据对象的名字,比如 pod 的名字
metadata.namespace String 元数据对象的命名空间
Spec Object 详细定义对象
spec.containers[] list 定义 Spec 对象的容器列表
spec.containers[].name String 为列表中的某个容器定义名称
spec.containers[].image String 为列表中的某个容器定义需要的镜像名称
spec.containers[].imagePullPolicy string 定义镜像拉取策略,有 AlwaysNeverIfNotPresent 三个值可选
- Always(默认):意思是每次都尝试重新拉取镜像
- Never:表示仅适用本地镜像
- IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。
spec.containers[].command[] list 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。
spec.containers[].args[] list 指定容器启动命令参数,因为是数组可以指定多个。
spec.containers[].workingDir string 指定容器的工作目录
spec.containers[].volumeMounts[] list 指定容器内部的存储卷配置
spec.containers[].volumeMounts[].name string 指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPath string 指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnly string 设置存储卷路径的读写模式,ture 或者 false,默认是读写模式
spec.containers[].ports[] list 指定容器需要用到的端口列表
spec.containers[].ports[].name string 指定端口的名称
spec.containers[].ports[].containerPort string 指定容器需要监听的端口号
spec.containers[].ports[].hostPort string 指定容器所在主机需要监听的端口号,默认跟上面 containerPort 相同,注意设置了 hostPort 同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocol string 指定端口协议,支持 TCPUDP,默认值为 TCP
spec.containers[].env[] list 指定容器运行前需设置的环境变量列表
spec.containers[].env[].name string 指定环境变量名称
spec.containers[].env[].value string 指定环境变量值
spec.containers[].resources Object 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers[].resources.limits Object 指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpu string 指定 CPU 的限制,单位为 Core 数,将用于 docker run –cpu-shares 参数
spec.containers[].resources.limits.memory string 指定 mem 内存的限制,单位为 MIB、GiB
spec.containers[].resources.requests Object 指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpu string CPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memory string 内存请求,单位为MIB、GiB,容器启动的初始化可用数量
spec.restartPolicy string 定义 pod 的重启策略,可选值为 Always、OnFailure、Never,默认值为 Alway
- Always:pod一旦终止运行,则无论容器是如何终止的,kubelet 服务都将重启它。
- OnFailure:只有 pod 以非零退出码终止时,kubelet 才会重启该容器。如果容器正常结束(退出码为0),则 kubectl 将不会重启它。
- Never:Pod终止后,kubelet 将退出码报告给 master,不会重启该 pod
spec.nodeSelector Object 定义 Node 的 label 过滤标签,以 key:value 格式指定
spec.imagePullSecrets Object 定义 pull 镜像时使用 secret 名称,以 name:secretkey 格式指定
spec.hostNetwork Boolean 定义是否使用主机网络模式,默认值为 false。设置 true 表示使用宿主机网络,不使用 docker 网桥,同时设置了 true将无法在同一台宿主机上启动第二个副本

2.探针

探针就是容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态。

探针有3种类型,分别为StartupProbeLivenessProbeReadinessProbe

1)StartupProbe探针

  • 用来判断程序是否已经启动了。

  • 当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。

  • 由于有时候不能准确预估应用一定是多长时间启动成功,因此配置另外两种方式不方便配置初始化时长来检测,而配置了 statupProbe 后,只有在应用启动成功了,才会执行另外两种探针,可以更加方便的结合使用另外两种探针使用。

  • startupProbe:
      httpGet: # 探测方式为HTTPGetAction
        path: /api/startup
        port: 80
    

2)LivenessProbe探针

  • 用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。

  • livenessProbe:
      failureThreshold: 5
      httpGet:	# 探测方式为HTTPGetAction
        path: /health
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 60	# 初始化时间	一般使用StartupProbe,因为我们无法确定一个程序多久能跑完
      periodSeconds: 10	 # 监测间隔时间
      successThreshold: 1	 # 检查 1 次成功就表示成功
      failureThreshold: 2 	# 监测失败 2 次就表示失败
      timeoutSeconds: 5	# 超时时间
    

3)ReadinessProbe探针

  • 用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的。

  • readinessProbe:
      failureThreshold: 3 # 错误次数
      httpGet: # 探测方式为HTTPGetAction
        path: /ready
        port: 8181
        scheme: HTTP
      periodSeconds: 10 # 间隔时间
      successThreshold: 1 # 检查 1 次成功就表示成功
      timeoutSeconds: 1 # 超时时间
    

探测方式也有3种类型分别为ExecActionTCPSocketActionHTTPGetAction

1)ExecAction探测方式

  • 在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。

  • livenessProbe:
      exec:
        command:
          - cat
          - /health
    

2)TCPSocketAction探测方式

  • 通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康。

  • livenessProbe:
      tcpSocket:
        port: 80
    

3)HTTPGetAction探测方式

  • 生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。

  • livenessProbe:
      failureThreshold: 5
      httpGet:
        path: /health
        port: 8080
        scheme: HTTP
        httpHeaders:
          - name: xxx
            value: xxx
    

3.探针的使用

1)StartupProbe探针的使用。依旧以上文中编写nginx的为例,只需要在nginx的配置中加入StartupProbe探针的配置即可,以下为3种不同方式探测方式。

# method1 http探测方式

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    #将探针配置加在spec中
    startupProbe: #应用启动探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
# method2 tcp探测方式

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    #将探针配置加在spec中
    startupProbe: #应用启动探针配置
      tcpSocket:  #探测方式基于TCP请求
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
# method3 tcp探测方式

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    #将探针配置加在spec中
    startupProbe: #应用启动探针配置
  	  exec:
      command:
         - cat
         - /health
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间

2)LivenessProbe探针的使用。依旧以上文中编写nginx的为例,只需要在nginx的配置中加入LiveNessProbe探针的配置即可,这里只介绍http的探测方式。其他的2种方式和配置StartupProbe探针大同小异。

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    startupProbe: #应用启动探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
	
	# 这里当nginx程序宕机了的话会重新启动
	# 这里肯定会先启动startupProbe探针,当startupProbe探针启动成功则启动livenessProbe探针。
	# 每次启动去访问/index.html接口,看niginx是否正在运行,如果连续启动3次失败,则失败。
	
    livenessProbe: #应用存活探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
    command: # 指定容器启动时执行的命令

3)ReadinessProbe探针的使用。依旧以上文中编写nginx的为例,只需要在nginx的配置中加入ReadiNessProbe探针的配置即可,这里只介绍http的探测方式。其他的2种方式和配置StartupProbe探针大同小异。

spec: # 期望 Pod 按照这里面的描述进行创建
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    startupProbe: #应用启动探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间
      
	# 这里当nginx程序宕机了的话会重新启动
	# 这里肯定会先启动startupProbe探针,当startupProbe探针启动成功则启动livenessProbe探针。
	# 每次启动去访问/index.html接口,看niginx是否可以接收外部访问,如果连续启动3次失败,则失败。
	
    readinessProbe: #应用就绪探针配置
      httpGet:  #探测方式基于HTTP请求
        path: /index.html
        port: 80
      failureThreshold: 3  # 监测失败 3 次就表示失败
      periodSeconds: 10    # 间隔时间
      successThreshold: 1  # 检查 1 次成功就表示成功
      timeoutSeconds: 1    # 超时时间

4.pod的生命周期

pod的生命周期如下图所示:

  • 首先经过容器的初始化阶段,当初始化结束后会启动postStart回调函数,但是一般来说不会使用到postStart回调函数,因为该函数的主要作用是做初始化的一些操作。
  • 然后就会启动配置的Startup探针,Liveness探针,以及Readiness探针,并加载容器。
  • 最后当pod使用结束时会启动preStop回调函数,该回调函数主要做pod结束时的销毁,数据删除,注册中心下线等一系列操作。
    在这里插入图片描述

1) postStartpreStop的使用。以最初版本的nginx为例,其中主要加入terminationGracePeriodSecondspostStart、和preStop配置。

spec: # 期望 Pod 按照这里面的描述进行创建
  terminationGracePeriodSeconds: 50   #当pod被删除时,给pod50s的处理时间
  containers: # 对于 Pod 中的容器描述
  - name: nginx # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的
    lifecycle: #生命周期的配置
      postStart:  #生命周期启动阶段会做的事情,Pod初始化好后会往poststart.html文件中写入post star
        exec:
          command:
          - sh
          - -c
          - "echo '<h1>post start<h1>' > /usr/share/nginx/html/poststart.html"
      preStop:  #生命周期结束阶段会做的事情,Pod初始化好后会往prestop.html文件中写入post star
        exec:
          command:
          - sh
          - -c
          - sleep 9

2)如下图所示,可以看到初始化pod结束后,可以查到poststart.html中的post start。并且当删除pod时会sleep9秒。

在这里插入图片描述
在这里插入图片描述

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐