0
点赞
收藏
分享

微信扫一扫

K8s学习三(Pod与探针)

独孤凌雪 04-08 23:00 阅读 1

深入学习Pod

Pod配置文件

  • 写一个自己的配置文件,nginx-po.yaml
apiVersion: v1 #api文档版本
kind: Pod #资源类型对象,也可以配置为像Development,StatefulSet这一类的对象
metadata: # Pod相关的元数据,用于描述Pod的数据
  name: nginx-po # Pod的名称
  labels: # 定义Pod的标签
    type: app # 自定义labels标签,名字为type,值为app
    test: 1.0.0 # 自定义labels标签,描述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个核心,1000m为一个核心
        memory: 128Mi # 限制最少使用128兆内存
      limits: #最多能用多少资源
        cpu: 200m # 限制最多使用0.2个核心
        memory: 256Mi # 限制最多使用256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启 

探针类型

  • 探针有StartupProbe,LivenessProbe,ReadinessProbe三种类型
Liveness Probe(存活性探针):

作用: 用于确定容器是否在运行。
配置: 如果存活性探针失败,Kubernetes 将重启容器。
示例: 使用 HTTP 探针检查 /healthz 路径是否返回成功状态。
Readiness Probe(就绪性探针):

作用: 用于确定容器是否已准备好接收流量。
配置: 如果就绪性探针失败,容器将被从服务负载均衡中移除,直到就绪性探针再次成功。
示例: 使用 HTTP 探针检查 /ready 路径是否返回成功状态。
Startup Probe(启动探针):

作用: 用于确定容器是否已经启动完成。
配置: 在容器启动过程中,只在一定时间内检查,超过这个时间后不再检查。
示例: 使用 HTTP 探针检查 /startup 路径是否返回成功状态。
  • 有ExecAction,TcpSocketAction,HTTPGetAction三种探测方式。
启动探针的使用(StartupProbe)
  • 对上面的配置文件增加内容
apiVersion: v1 #api文档版本
kind: Pod #资源类型对象,也可以配置为像Development,StatefulSet这一类的对象
metadata: # Pod相关的元数据,用于描述Pod的数据
  name: nginx-po # Pod的名称
  labels: # 定义Pod的标签
    type: app # 自定义labels标签,名字为type,值为app
    test: 1.0.0 # 自定义labels标签,描述Pod版本号
  namespace: 'default' # 命名空间的配置
spec: #期望Pod按照这里面的描述进行创建
  containers: # 对Pod里面的容器描述
  - name: nginx # 容器的名字
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地有就用本地的,本地没有就拉取远程的
    startupProbe: # 应用启动探针配置
      # httpGet: # 探测方式,基于http请求路径
      #   path: /index.html #http请求路径
      #   port: 80 # 请求端口
      # tcpSocket: # 基于tcp请求
      #   port: 80
      exec: # 基于exec请求
        command: #执行的命令
        - sh
        - -c
        - "sleep 3; echo success > /inited"
      failureThreshold: 3 # 失败多少次才算真正失败
      periodSeconds: 10 # 间隔时间
      successThreshold: 1 # 多少次检测成功算成功
      timeoutSeconds: 5 # 请求的超时时间
    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个核心,1000m为一个核心
        memory: 128Mi # 限制最少使用128兆内存
      limits: #最多能用多少资源
        cpu: 200m # 限制最多使用0.2个核心
        memory: 256Mi # 限制最多使用256兆
  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启 
  • 在上面增加了启动探针的三种探测方式,如下

在这里插入图片描述

  • 分别执行kubectl describe po nginx-po可以发现Startup不一样的地方,如下:

在这里插入图片描述

  • 对于exec方式,因为有执行的命令,因此可以去容器里面看对应的输出,执行下面的命令
  kubectl exec -it nginx-po -c nginx -- cat /inited
 解释:
kubectl exec: 在运行中的 Pod 内的容器中执行命令。

-it: 两个参数的结合。-i 表示标准输入保持打开,-t 表示分配一个伪终端 (TTY),以便你可以与正在运行的命令进行交互,就像你在本地终端一样。

nginx-po: 目标 Pod 的名称。在这里,Pod 的名称被设置为 nginx-po。

-c nginx: -c 参数用于指定要执行命令的容器名称。在这里,命令将在名为 nginx 的容器内执行。

-- cat /inited: 要在容器内执行的实际命令。在这个例子中,命令是 cat /inited,它会显示 /inited 文件的内容。
  • 得到输出
    在这里插入图片描述
Liveness探针的应用
  • 下面介绍liveness探针的HTTPGet使用
  • 在原来的配置文件里面加入下面的东西
 livenessProbe: # 应用存活探针配置
      httpGet: # 探测方式,基于http请求路径
        path: /index.html #http请求路径
        port: 80 # 请求端口
      # tcpSocket: # 基于tcp请求
      #   port: 80
      # exec: # 基于exec请求
      #   command: #执行的命令
      #   - sh
      #   - -c
      #   - "sleep 3; echo success > /inited"
      failureThreshold: 3 # 失败多少次才算真正失败
      periodSeconds: 10 # 间隔时间
      successThreshold: 1 # 多少次检测成功算成功
      timeoutSeconds: 5 # 请求的超时时间

  • 如图:
    在这里插入图片描述
Readiness探针的使用
  • 下面介绍readiness探针的HTTPGet使用
  • 在原来的配置文件里面加入下面的东西
 readinessProbe: # 应用就绪探针配置
      httpGet: # 探测方式,基于http请求路径
        path: /started.html #http请求路径
        port: 80 # 请求端口
      # tcpSocket: # 基于tcp请求
      #   port: 80
      # exec: # 基于exec请求
      #   command: #执行的命令
      #   - sh
      #   - -c
      #   - "sleep 3; echo success > /inited"
      failureThreshold: 5 # 失败多少次才算真正失败
      periodSeconds: 10 # 间隔时间
      successThreshold: 1 # 多少次检测成功算成功
      timeoutSeconds: 5 # 请求的超时时间
  • 如图:
    在这里插入图片描述

  • 注:下面讲一下更深入了解一下探针,对于readiness探针而言,里面写的http请求路径是/started.html,如下图:
    在这里插入图片描述

  • 而对于nginx而言是没有这个的,于是会出现下面的情况
    在这里插入图片描述

在这里插入图片描述

  • 但是如果创建了started.html到工作目录里面就会发现又成功了
  • 在终端输入下面的命令
echo success > started.html
kubectl cp started.html nginx-readin-po:/usr/share/nginx/html/
  • 这样就能找到yaml文件里面指定的探测路径,就会有下面的情况
    在这里插入图片描述

  • 同理,对于LivenessProbe也一样,把yaml文件里的index.html 换成started.html,就会有上述一样的步骤和结果

Pod生命周期

  • Pod的生命周期如下图所示:
    在这里插入图片描述

  • 这里一般不用postStart钩子函数,因为可能会和主容器里面的command命令冲突,一般用前面的容器初始化,然后用preStop钩子函数,可以进行注册中心下线,数据销毁,清理数据等操作

  • 这里主要介绍prestop的配置,为了方便在原文件里,将探针删了,加入poststart和prestop,如下

 lifecycle: #生命周期配置
      postStart: # 生命周期启动阶段做的事情,不一定在容器command之前运行
        exec:
          command:
          - sh
          - -c
          - "echo '<h1>post start</h1>' > /usr/share/nginx/html/prestop.html"
      preStop:
        exec:
          command:
          - sh
          - -c
          - "sleep 50; echo 'sleep over' >> /usr/share/nginx/html/prestop.html"

  • 如图:
    在这里插入图片描述

  • 当创建Pod的时候,会执行poststart
    在这里插入图片描述

在这里插入图片描述

  • 这里找到内部的ip地址之后,curl这个prestop.html文件,可以看到内容,因为nginx的工作目录是/usr/share/nginx/html,所以直接curl ip + 文件名称就行了,因为本来就在这个目录下,不需要其他的路径了。
  • 然后看prestop,开另一个master,一个删除,一个持续监视状态,因为变为删除中的状态后,会给 pod 一个宽限期,让 pod 去执行一些清理或销毁操作。这里默认是30s,因此"sleep 50; echo ‘sleep over’ >> /usr/share/nginx/html/prestop.html",这里休眠50秒,是达不到的,因为30s就关闭了
    在这里插入图片描述

在这里插入图片描述

  • 这里可以在配置文件中加入
terminationGracePeriodSeconds: 50
containers:
  - xxx

# 这里terminationGracePeriodSeconds参数就是默认的时间,与containers同级,可以作用于所有的容器
举报

相关推荐

0 条评论