k8s中的最小部署单元Pod 包含一个或多个容器Pod 中的容器共享网络命名空间Pod 有多个容器,一个容器运行一个应用程序Pod 主要有两大机制 共享网络、共享存储;如下:
Volumn 概念;进行存储共享(数据卷也可做实体化宿主机数据)我们可以使用资源文件的 yaml 文件对容器的镜像拉取策略进行限制;如下:
spec:
containers:
- name: xxx
image: xxx
imagePullPolicy: Always
# 拉取策略如下:
# IfNotPresent: 默认值,镜像在宿主机不存在时进行拉取
# Always: 每次创建Pod时都会进行拉取
# Never: 从来都不进行拉取
我们在进行 containers 进行配置容器时,进行资源限制;如下:
spec:
containers:
- name: xxx
image: xxx
imagePullPolicy: Always
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
# 其中 requests 中的 memory、cpu 是创建 pod 的最低限制,而 limits 中的则是最大限制
# 这里的 cpu: 1c = 1000m
配置容器的重启策略,如下:
spec:
containers:
- name: xxx
image: xxx
imagePullPolicy: Always
restartPolicy: Always
# 重启策略:
# Always: 默认值,容器终止退出后,总是重启
# OnFailure: 容器异常退出(退出状态码非0)时,重启
# Never: 当容器终止退出,从不重启容器
Pod 有2种探测类型:
livenessProbe(存活性探测):检测容器是否处于 Running 状态;若 liveness 探测到容器不健康时,通过 kubelet 杀掉该容器,并根据重启策略进行后续处理readinessProbe(就绪性探测):检测容器是否能正常对外提供服务;若 readiness 探测结果为不健康,则会将这个容器从接入层 service 的 Endpoint 中移除掉,直到下一次判断成功,才会将这个容器再次挂回到相应的 Endpoint 上探测方式有 3 种方式:
exec:通过执行容器中的一个命令来判断服务是否正常,命令返回值为0则表示容器是健康的httpGet:通过发送http Get请求来进行判断,若返回200-399状态码时,则表示容器是健康的tcpSocket:通过探测容器的 IP 和 Port,执行TCP健康检查,若这个TCP的链接能够正常被建立,则表示容器是健康的有 3 种探测结果:
Success:表示 container 通过了健康检查Failure:表示 container 没有通过健康检查。若未通过检查,则会做一个相应处理,Readiness 处理方式就是,在 service 层将没有通过 Readiness 检查的 pod 进行摘除,而 Liveness 就是将这个 pod 进行重新拉起或删除Unknown:表示说当前这次检查操作没有完整执行,可能是因为超时或一些脚本没有及时返回。此时Readiness-probe 或 Liveness-probe 不做任何操作,会等待下一次的机制来进行检验探测相关参数:
Exec方式:
条件:当探测到Pod容器里的/tmp/healthy文件不存在时,认为容器运行不正常;
场景:创建Pod后,等30s,/tmp/healthy文件被删掉后,liveness就会检测到POD容器运行不正常,并尝试重启容器
spec:
containers:
- name: liveness-test
image: busybox:latest
command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"]
livenessProbe:
exec:
command: ["test","-e","/tmp/healthy"]
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: Always
# readinessProbe 探测只需要将 livenessProbe 替换为 readinessProbe
httpGet方式:
条件:当探测到 http://容器:80/index.html 网页不能访问时,认为容器运行不正常
场景:创建 Pod 后,进入 Pod 容器,手动删除index.html文件。由于网页不能访问,所以会检测到Pod容器运行不正常(处于终止状态),并尝试重启容器
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-http
spec:
containers:
- name: liveness
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
livenessProbe:
httpGet:
port: http
path: /index.html
initialDelaySeconds: 1
periodSeconds: 3
restartPolicy: Always
# readinessProbe 探测只需要将 livenessProbe 替换为 readinessProbe
另一种方式用的不多暂时不做演示