k8s-Pod

Pod

Pod(容器组)是k8s中最小的可部署单元。一个Pod包含了一个应用程序容器(某些情况下是多个容器)、存储资源、一个唯一的网络IP地址、以及一些确定容器该如何运行的选项。Pod容器组代表了k8s中一个独立的应用程序运行实例,该实例可能由单个容器或者几个紧耦合在一起的容器组成。

k8s集群中的pod存在如下两种使用途径:

  • 一个Pod中只运行一个容器。“one-container-per-pod”是k8s中最常见的使用方式,此时,您可以认为pod容器组是该容器的warpper,k8s通过pod管理容器,而不是直接管理容器。

  • 一个pod中运行多个需要互相协作的容器。可以将多个紧密耦合、共享资源且始终在一起运行的容器编排在同一个Pod中,

配置文件(常见的清单)

apiVersion: v1 #api文档版本
kind: Pod #资源对象类型,也可以配置为Deployment Service StatsfulSet这一类的对象资源
metadata: # Pod相关的元数据,用于描述Pod的数据
  name: nginx-server #Pod的名称
  labels: #定义Pod的标签
    type: app #自定义label标签,名字为type 至为app
    version: 1.0.0 #自定义label标签,描述pod版本号,也可以写其他值,例如 test: xxx
  namespace: 'default' # 命名空间的配置
spec:  #期望Pod按照这里面的描述进行创建
  containers: # 对于Pod中的容器描述
  - name: nginx #容器的名称
    image: nginx:1.14.2 #指定容器的镜像
    imagePullPolicy: IfNotPresent #定义镜像拉取策略,有Always(默认,每次尝试重新拉取镜像)\Never(表示仅适用本地镜像)\IfNotPresent(本地有镜像就用本地镜像,没有则拉取在线镜像) 可选
    command: #指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g 'daemon off;'
    workingDir: /usr/share/nginx/html #指定容器启动后的工作目录
    ports: # 
    - name: http #端口名称
      containerPort: 80 #描述容器内需要暴漏的端口
      protocol: TCP #描述该端口是基于哪种协议通信的 默认TCP 
    env: #指定容器运行前需设置的环境变量列表
    - name: JVM_OPTS #环境变量名称
      value: '-Xms128m -Xmx128m' #环境变量值
    resources: #指定资源限制和资源请求的值
      requests: #最少需要多少资源
        cpu: 100m #限制cpu最少使用0.1c 1c为1000m
        memory: 128Mi #限制内存最少使用128兆
      limits: #最多可以用多少资源
        cpu: 200m #限制cpu最多使用0.2c 1c为1000m
        memory: 256Mi #限制内存最多使用256兆
  restartPolicy: Always #定义pod的重启策略 
   #Always(默认,无论是如何终止,kubelet都将重启他)、
   #Onfailure(只有pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则不重启)      #Never(Pod终止后,kubelet将退出码报告给master,不会重启该Pod)

image-20240130202719828

根据 pod描述(kubectl describe po xxxx)可以看出

image-20240130202854727

探针

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

类型
StartupProbe(启动探针)

k8s 1.16后新增该探针,用于判断应用程序是否已经启动了。

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

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

startupProbe: 
  failureThreshold: 5 #错误次数
  httpGet: 
    path: /api/startup
    port: 80
  initialDelaySeconds: 60  #初始化时间
  periodSeconds: 10 #检测间隔时间
  successThreshold: 1 #检测1次成功就表示成功
  timeoutSeconds: 5 #超时时间

LivenessProbe(存活探针)

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

前提:容器启动成功后

可以根据LivenessProbe实现容器自动恢复

livenessProbe: 
  failureThreshold: 5 #错误次数,检测失败5次就表示失败
  httpGet:  #探测方式 基于http请求探测
    path: /health  #http请求路径
    port: 8080  # 请求端口
    scheme: HTTP
  initialDelaySeconds: 60  #初始化时间
  periodSeconds: 10 #检测间隔时间
  successThreshold: 1 #检测1次成功就表示成功
  timeoutSeconds: 5 #超时时间
ReadinessProbe(就绪探针)

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

前提:容器启动成功后

启动成功则可以允许外部来请求该容器

readinessProbe: 
  failureThreshold: 3 #错误次数
  httpGet: 
    path: /ready
    port: 8181
    scheme: HTTP
  periodSeconds: 10 #间隔时间
  successThreshold: 1
  timeoutSeconds: 5
探测方式
ExecAction

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

livenessProbe:  #在任一探针配置文件中写下列命令
  exec: 
    command: 
     - sh
     - -c
     - "sleep 5; echo 'success' > /inited;"
      
TCPSocketAction

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

livenessProbe:
  tcpSocket:
    port: 80
HTTPGetAction

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

java应用比较广泛,因为端口可能很早就启动了,不适合TCP方式检测

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

生命周期(lifecycle)

postStart: 容器创建完成后执行的动作,不能保证该操作一定在容器的command之前执行,一般不使用。

preStop: 在容器停止前的动作。

spec:
  terminationGracePeriodSeconds: 30 #当pod被删除是,给这个pod宽限多长时间来进行删除操作;默认30 
  container: 
  - name: xxx #容器名称
    lifecycle: #生命周期的配置
      postStart: # 生命周期启动阶段做的事情,不一定在容器的command之前运行
        exec: 
          command: 
          - sh
          - -c
          - "echo '<h1>poststart</h1>' > /usr/share/nginx/html/test.html"
      preStop: #在容器停止前的动作 
        exec: 
          command: 
          - sh
          - -c
          - "sleep 50; echo '<h1>pre stop</h1>' >> /usr/share/nginx/html/test.html"
          # 如果预计preStop中耗时大于30s ,注意修改terminationGracePeriodSeconds 值
          

[参考]  https://www.modb.pro/db/619459

「pod对象从开始创建到终止退出的时间范围称为生命周期」。它主要包含以下的过程

  • pod创建过程

  • 运行初始化容器(init container)过程

  • 运行主容器(main container)

    • 容器启动后钩子(post start)、容器终止前钩子(pre stop)

    • 容器的存活性检测(liveness probe)、就绪性检测(readiness probe)

  • pod终止过程

image-20240131183654978

  • 17
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要将正在 k8s-node1 节点上运行的名为 apache-podpod 扩容到 k8s-node2 节点,并同时在这两个节点上运行 pod,请按照以下步骤操作: 1. 创建一个 deployment,指定 pod 的副本数为 2,并使用 nodeSelector 将这两个 pod 分别调度到 k8s-node1 和 k8s-node2 节点上。可以使用以下 YAML 文件创建 deployment: ``` apiVersion: apps/v1 kind: Deployment metadata: name: apache-pod spec: replicas: 2 selector: matchLabels: app: apache-pod template: metadata: labels: app: apache-pod spec: nodeSelector: kubernetes.io/hostname: k8s-node1 containers: - name: apache-container image: httpd:latest ports: - containerPort: 80 ``` 在这个 YAML 文件中,我们使用 nodeSelector 将第一个 pod 调度到 k8s-node1 节点上,第二个 pod 调度到 k8s-node2 节点上。注意,我们在 template.spec.containers 中指定了容器的镜像和端口号,这里使用的是 httpd 镜像,端口号是 80。 2. 使用 kubectl apply 命令应用这个 YAML 文件: ``` kubectl apply -f deployment.yaml ``` 3. 使用 kubectl get pods 命令检查 pod 状态,确认这两个 pod 都在运行: ``` kubectl get pods -o wide ``` 在输出中,你会看到两个 apache-pod 的副本都在运行,其中一个在 k8s-node1 节点上,另一个在 k8s-node2 节点上。 需要注意的是,使用 nodeSelector 指定 pod 调度到特定节点上可能会降低集群的灵活性,因为这样做会使节点的资源分配不均衡。如果你的集群中有多个节点,最好使用 Kubernetes 的调度器来自动地将 pod 调度到空闲节点上。你可以使用 nodeAffinity 和 podAntiAffinity 等特性来控制 pod 的调度行为。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值