6. POD 配置1

文章目录

1. POD 的基本用法

1.1 POD运行说明

K8S 对容器运行的要求是主程序一直要在前台执行,如果使用 nohup 后台运行的话, 在nohup 执行完毕后则认为POD已经执行结束。接下来会立刻销毁POD。
如果这个时候陪配置了 ReplicationController, 监控到POD已经停止,就又有启动一个新的,这样就会陷入不断启动销毁的循环。所以对要求对制作的docker镜像必须以一个前台的命令作为启动命。

1.2 POD封装容器的用法

关于POD对于容器的封装要不要把多个耦合度较高的容器封装到一个POD,还没有定论,两种方式各有优劣。这里只是讲POD如何封装使用一个或容器。
容器定义在POD对象yaml的spec.containers下面。
单个容器示例:

apiVersion: v1
kind: Pod
metadata:
  labels:
    pod-template-hash: 74f56b7695
    workload.user.cattle.io/workloadselector: deployment-pa-dev-haep
  name: haep-74f56b7695-h442r
  namespace: pa-dev
spec:
  containers:
  - name: haep
    image: registry.com/test:2.2.0
    env:
    - name: JAVA_TOOL_OPTIONS
      value: -Xmx512m 
    imagePullPolicy: Always
    ports:
    - containerPort: 8080
      hostPort: 80
      name: 80tcp8080
      protocol: TCP

简单说明:

  • apiVersion(String) ,k8s中 APIServer的版本版本号
  • kind(String), K8S 资源对象的类型,这里是 Pod对象
  • metadata(Object), 定义资源对象的基础属性,对应的label,name和所属的命名空间等
  • spec(Object), 对象的详细属性定义,这里是Pod的详细信息
    下面的就是pod对象的一些详细属性了
  • containers(Object), pod对象的容器定义
  • env (List),表示POD容器使用的环境变量,name表示变量名称,value表示变量值
  • image (String),表示容器所使用的镜像
  • imagePullPolicy (Boolean),表示Pod创建的时候是否总是拉去镜像
  • name (String),表示容器名称
  • ports (List) , 容器需要暴露的端口
  • containerPort(int),暴露容器的端口
  • hostPort (int)暴露所在主机的端口,(每个主机只能暴露一个端口,不然端口冲突)
  • protocol(String) 使用的协议默认TCP
    使用如上的 ports定义则表示把容器的 8080 映射到主机的80

1.3 镜像拉取策略

spec.containers[].imagePullPolicy 有三种

配置 含义
Always 总是拉取
IfNotPresent 镜像不存在才拉取, 这个是默认值
Never 永远不拉取, 本地没有镜像就会报错

示例:
本地不存在镜像, 使用 IfNotPresent

1.4 资源限制

主要由有下面几个配置

配置 含义
spec.containers[].resources.limits.cpu 资源运行过程中需要给的最大的CPU
spec.containers[].resources.limits.memory 资源运行过程中需要给的最大的内存
spec.containers[].resources.request.cpu 资源运行至少要满足的CPU, 是在Node之间调度的基准
spec.containers[].resources.request.memory 资源运行至少要满足的内存, 是在Node之间调度的基准

此处CPU分配单位是 m , 可以理解 1c = 1000m, 既 500m 为 0.5c

1.5 重启机制

spec.restartPolicy 重启机制配置如下

配置 含义
Never 从不重启
Alway 总是重启
onFailure 异常退出才重启, 例如一个批量任务正常结束后就不再重启了

2. POD健康检查

K8S提供了对容器进行应用层面的健康检查, 主要是通过探针实现
主要是以下两种检查

2.1 就绪探针

检查POD是否就绪, 就绪的话就加入Service的负载中, 否则将其移除, 会在POD的整个生命周期运行
spec.containers[].readnessProbe

    spec:
      containers:
      - env:
        - name: JAVA_TOOL_OPTIONS
          value: -Xmx512m
        image: xxxx
        imagePullPolicy: Always
        name: livenessTest
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /actuator/health
            port: 15010
            scheme: HTTP
          initialDelaySeconds: 10
          periodSeconds: 10
          successThreshold: 2
          timeoutSeconds: 5

配置说明:

参数 说明
spec.containers[].readnessProbe.failureThreshold 失败后连续尝试的次数, 最小1, 最大 3, 达到最大次数还是失败, 那么POD就会被标记为为就绪
spec.containers[].readnessProbe.successThreshold 探针需要通过的最小连续成功检查数量。比如上面的配置连续两次成功, 就会把 POD标记为就绪
spec.containers[].readnessProbe.initialDelaySeconds POD启动多少秒之后开始探针检查
spec.containers[].readnessProbe.periodSeconds 检查探针的频率。等待多少秒之后进行下一次检查
          httpGet:
            path: /actuator/health
            port: 15010
            scheme: HTTP

这里表示是使用 http 请求的方式,
使用 HTTP 协议请求 15010 端口的 /actuator/health

2.2存活探针

检查POD是否是存活状态, 为否的话, 将按照重启机制执行
spec.containers[].livenessProbe
示例:

    spec:
      containers:
      - env:
        - name: JAVA_TOOL_OPTIONS
          value: -Xmx512m
        envFrom:
        - configMapRef:
            name: app-nacos-env
            optional: false
        image: xxxx
        imagePullPolicy: Always
        name: livenessTest
        liveinessProbe:
          failureThreshold: 3
          httpGet:
            path: /actuator/health
            port: 15010
            scheme: HTTP
          initialDelaySeconds: 60
          periodSeconds: 10
          successThreshold: 2
          timeoutSeconds: 5

和就绪探针区别的配置

配置说明:

参数 说明
spec.containers[].readnessProbe.failureThreshold 达到最大次数还是失败, 那么POD就会被标记为为未存活, 走重启策略
spec.containers[].readnessProbe.successThreshold 探针需要通过的最小连续成功检查数量。比如上面的配置连续两次成功, 就会把 POD标记为存活

2.3 探针方式的配置

2.3.1 http

  • host:要连接的主机名(默认值:pod 的 IP)。
  • scheme:HTTP(默认)或 HTTPS。
  • path:HTTP/S 服务器上的路径 。
  • httpHeaders:自定义标头(如果需要标头用于身份验证、CORS 设置等) 。
  • port:访问服务器的端口名称或端口号

上面就是使用的案例

2.3.2 TCP

检查是否可以建立TCP链接
示例如下:

        liveinessProbe:
          tcpSocket:
            path: /actuator/health
            port: 21

2.3.3 Command

通过执行Shell命令的结果检查, 如果命令返回的退出代码为 0,则检查通过
示例:

        liveinessProbe:
          exec:
            command:
            	- cat
            	- /temp/health
上一篇:k8s-Ingress


下一篇:第6章:深入理解Pod对象