K8S 对容器运行的要求是主程序一直要在前台执行,如果使用 nohup
后台运行的话, 在nohup
执行完毕后则认为POD已经执行结束。接下来会立刻销毁POD。
如果这个时候陪配置了 ReplicationController, 监控到POD已经停止,就又有启动一个新的,这样就会陷入不断启动销毁的循环。所以对要求对制作的docker镜像必须以一个前台的命令作为启动命。
关于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
简单说明:
name
表示变量名称,value
表示变量值spec.containers[].imagePullPolicy
有三种
配置 | 含义 |
---|---|
Always | 总是拉取 |
IfNotPresent | 镜像不存在才拉取, 这个是默认值 |
Never | 永远不拉取, 本地没有镜像就会报错 |
示例:
本地不存在镜像, 使用 IfNotPresent
主要由有下面几个配置
配置 | 含义 |
---|---|
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
spec.restartPolicy
重启机制配置如下
配置 | 含义 |
---|---|
Never | 从不重启 |
Alway | 总是重启 |
onFailure | 异常退出才重启, 例如一个批量任务正常结束后就不再重启了 |
K8S提供了对容器进行应用层面的健康检查, 主要是通过探针实现
主要是以下两种检查
检查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
检查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标记为存活 |
host
:要连接的主机名(默认值:pod 的 IP)。scheme
:HTTP(默认)或 HTTPS。path
:HTTP/S 服务器上的路径 。httpHeaders
:自定义标头(如果需要标头用于身份验证、CORS 设置等) 。port
:访问服务器的端口名称或端口号上面就是使用的案例
检查是否可以建立TCP链接
示例如下:
liveinessProbe:
tcpSocket:
path: /actuator/health
port: 21
通过执行Shell命令的结果检查, 如果命令返回的退出代码为 0,则检查通过
示例:
liveinessProbe:
exec:
command:
- cat
- /temp/health