重启策略+健康检查
重启策略(restartPolicy)
- Always:只要容器终止退出后,就一直尝试重启容器,默认策略(适用于:mysql、nginx、redis等)。
- OnFailure:只有容器异常退出后(退出状态码非0),才重启容器(适用于:定时任务)。
- Never:当容器终止退出后,不重启容器(适用于:一次性任务)
健康检查类型
- livenessProbe(存活检查):当检查容器中应用无法访问时,就杀死容器,根据pod中的restartPolicy来操作。
- readinessProbe(就绪检查):当检查容器中应用无法访问时,kubernetes会把pod从service endpoints中剔除。
- startupProbe(启动检查):检查成功才由存活检查接手,用于保护慢启动容器。
检测机制
- exec:执行shell命令,返回状态码为0是成功。
- httpGet:发送http请求,返回200。
- TcpSocket:发送TCP Socket建立成功。
重启实例
[root@k8s-master ~]# vim httpGet.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: zhao
name: zhao
spec:
replicas: 3
selector:
matchLabels:
app: zhao
strategy: {}
template:
metadata:
labels:
app: zhao
spec:
containers:
- image: nginx
name: nginx
livenessProbe: # 存活检查
httpGet:
path: / # 一般需要开发写一个简单的页面去做检查
port: 80
initialDelaySeconds: 10 # 启动容器后多久后进行健康检查 (单位以秒)
periodSeconds: 10 # 每隔多少秒检测一次 (单位以秒)
readinessProbe: # 就绪检查,从Service中剔除容器
httpGet:
path: /
port: 80
initialDelaySeconds: 10
periodSeconds: 10
[root@k8s-master ~]# kubectl expose deployment zhao --port=80 --target-port=80 # 创建deployment nginx service端
[root@k8s-master ~]# kubectl apply -f httpGet.yaml
[root@k8s-master ~]# kubectl get pod,service,ep
[root@k8s-master ~]# kubectl logs zhao-64898f87fb-d282k -f # 检查容器日志,查看是否是10秒检测一次
[root@k8s-master ~]# kubectl exec -it zhao-64898f87fb-d282k -- bash
root@zhao-64898f87fb-d282k:/# rm -fr /usr/share/nginx/html/index.html
验证方法:退出容器后,查看容器日志,看看是否会抛出异常状态,在等待重启后,查看日志是否恢复正常
init Container
init Container:一般用于初始化工作,执行一次性任务。
- 支持大部分应用容器配置,但是不支持健康检查机制。
- 优先应用容器执行。
应用场景
- 环境检查:例如确保应用容器依赖的服务启动后在启动应用容器。
- 初始化配置:给应用容器准备配置文件。
初始容器和主容器没有先后之分,有初始容器就会先运行初始容器,在执行主容器
[root@k8s-master ~]# vim initContainers.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-web
spec:
initContainers: #初始容器
- name: download
image: busybox
command:
- wget
- "-O"
- "/opt/index.html"
- http://www.baidu.com
volumeMounts:
- name: mount-dir
mountPath: "/opt"
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- name: mount-dir
mountPath: /usr/share/nginx/html
volumes:
- name: mount-dir
emptyDir: {}
[root@k8s-master ~]# kubectl apply -f initContainers.yaml
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
huawei 2/2 Running 5 (<invalid> ago) 2d19h
nginx-web 1/1 Running 0 119m
[root@k8s-master ~]# kubectl exec -it nginx-web -- bash #进入nginx容器
root@nginx-web:/# cd /usr/share/nginx/html/
root@nginx-web:/usr/share/nginx/html# cat index.html
# 查看是否已经替换成了百度页面
Pod中包含以下几种类型的容器
- infrastructure Container:基础容器。
- 维护整个Pod网络空间
- init Container:初始化容器。
- 先于业务容器 开始执行
- Containers:业务容器。
- 并行启动