pod介绍

一、前言

     Pod 是 Kubernetes 中最小的部署单元,它可以包含一个或多个容器,以及共享的存储卷和网络命名空间,Pod 提供了一种抽象,用于组织和管理容器化的应用程序,并提供了一种灵活、轻量级的方式来部署和管理应用程序

二、生命周期

   什么是生命周期,即pod从创建到终止的这段过程就叫生命周期,下面就来介绍以下pod的生命周期过程

   初始化容器>主容器>容器启动后执行的钩子函数>就绪探针>存活探针>容器终止前执行的钩子函数

 pod的生命周期可以使用以下的几种状态概括

Pending(等待中): Pod 已经被 Kubernetes 系统接受,但是容器尚未创建。这可能是因为调度器还未将 Pod 调度到节点上,或者正在等待其他资源的创建

Running(运行中): Pod 中的至少一个容器已经被创建,并且正在运行中。如果 Pod 中的所有容器都处于该状态,则整个 Pod 将被标记为运行中

Succeeded(已成功): Pod 中的所有容器都已经成功地完成了任务,并且已经退出。这通常在批处理作业完成后发生

Failed(失败): Pod 中的一个或多个容器已经以非正常状态退出。这通常表示应用程序出现了错误或故障

Terminating(终止中): Pod 已经接收到删除请求,正在被终止。这意味着 Pod 中的容器正在被停止,并且正在进行清理操作,例如释放资源

 初始化容器

初始化容器(Init Container)是 Kubernetes 中的一个特殊类型的容器,它与主要的应用容器共同运行在同一个 Pod 内,并在应用容器启动之前执行一些初始化任务,只有当所有的初始化容器成功执行完毕并退出时,主要的应用容器才会启动,如果初始化容器中的任何一个执行失败(即退出状态码非零),整个 Pod 将处于错误状态,Kubernetes 会尝试重新启动整个 Pod,直到所有的初始化容器成功执行为止

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: api-gateway
  name: api-gateway
  namespace: java-service
spec:
  replicas: 2
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: api-gateway
  template:
    metadata:
      labels:
        app: api-gateway
    spec:
      volumes:
      - name: skywalking-agent
        emptyDir: {}
      initContainers:            #定义初始化容器
      - name: skywalking-agent-container
        image: apache/skywalking-java-agent:8.7.0-alpine
        volumeMounts:
        - name: skywalking-agent
          mountPath: /agent
        command: ["/bin/sh"]
        args: ["-c","cp -R /skywalking/agent /agent/"]
      containers:
      - name: api-gateway
        image: harbor.apex.com/jdk/api-gateway:1.0.6
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8888

钩子函数

PostStart 钩子: 在容器创建后立即执行。这个钩子适合于一些初始化操作,如连接到外部服务、加载数据等

PreStop 钩子: 在容器终止之前执行。它允许容器在关闭之前执行清理任务,如保存状态、断开连接等

apiVersion: v1
kind: Pod
metadata:
  name: example
spec:
  containers:
  - name: my-container
    image: my-image
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart hook"]
      preStop:   #这用了一个真实场景的举例,就是java应用服务下线,需要手动清除在ek注册的服务地址
        exec:
          command: ["/bin/sh", "-c", "curl -X PUT http://eureka.tools:8080/eureka/apps/ARZ-OSP-SERVER/$HOSTNAME:arz-osp-server:8080/status?value=OUT_OF_SERVICE"]

三、重启策略

Always(始终重启): 当容器退出时,无论其退出状态是成功还是失败,Kubernetes 都会自动重启该容器。这是默认的重启策略

OnFailure(仅在失败时重启): 仅当容器以非零退出状态(即失败)退出时,Kubernetes 才会重启容器。如果容器以成功状态退出(即退出代码为 0),则不会触发重启

Never(永不重启): Kubernetes 永远不会重启 Pod 中的容器,即使容器失败也不会触发重启

四、优雅退出

在Kubernetes中,Pod的优雅下线(Graceful Termination)是指在终止Pod之前,容器有机会执行清理操作并与正在处理的请求完成。优雅下线确保应用程序可以平滑地终止,避免造成中断或数据丢失

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: api-gateway
  name: api-gateway
  namespace: java-service
spec:
  terminationGracePeriodSeconds: 30   #最多可以容忍的时间,默认30s,超出时间后就会强制关闭pod
  replicas: 2
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: api-gateway
  template:
    metadata:
      labels:
        app: api-gateway
    spec:
      containers:
      - name: api-gateway
        image: harbor.apex.com/jdk/api-gateway:1.0.6
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8888
        lifecycle:
        preStop:   #这用了一个真实场景的举例,就是java应用服务下线,需要提前执行脚本将nacos注册中心中的微服务权重更改为0,不再接收流量,然后等pod优雅下线后,nacos再通过健康检查服务将改微服务剔除
          exec:
            command: ["/bin/sh", "-c", "curl -X PUT http://nacos_ip:8848/nacos/v2/ns/instance?serviceName=api-gateway&ip=${POD_IP}&port=80&weight=0"]

可参考nacos官网: Open API 指南 | Nacos

五、pause

在 Kubernetes 中,Pause 容器是一个特殊的辅助容器,它经常与每个 Pod 一起运行。Pause 容器没有实际的应用程序逻辑,其主要作用是为 Pod 中的其他容器提供网络命名空间和存储卷的共享环境。Pause 容器实际上是一个轻量级的镜像,只包含一个小型的操作系统文件系统和网络配置,占用极少的资源,当创建一个 Pod 时,Kubernetes 会自动在 Pod 中创建一个 Pause 容器。这个 Pause 容器会一直运行,直到 Pod 被删除或终止。其他容器(也称为主容器)与 Pause 容器共享网络和存储卷空间,这意味着它们可以在同一网络命名空间中相互通信,共享文件系统卷

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值