重启策略+健康检查

重启策略(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:业务容器。
    • 并行启动
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐