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 容器共享网络和存储卷空间,这意味着它们可以在同一网络命名空间中相互通信,共享文件系统卷

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值