kubernetes里面那些事————pod资源生命周期

一,Pod重启策略

yaml中与containers同级

containers:
restartPolicy: Never

取值
Always:只要退出就重启,默认策略
OnFailure:失败退出(exit code不等于0)时重启
Never:只要退出就不再重启

二,健康检查类型

1,(存活检查)livenessProbe:如果检测失败,将杀死容器,根据pod的restartPolicy来操作
2,(就绪检查)readinessProbe:如果检查失败,Kubernetes会把pod从service endpoints中剔除
3,(启动检查)startupProbe:使用启动检查时默认禁用其他检查机制,检查成功才由存活检查接手,用于保护慢启动容器

三,健康检查方法

httpGet: 发送http请求,返回状态码200-400成功
#http探测任何大于或等于 200 且小于 400 的代码都表示成功,其他代表失败
exec:执行shell命令返回状态码0成功
tcpSocket: 发起TCP Socket建立成功

httpget对指定端口指定url发起http请求

    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
        livenessProbe:  #http方式存活检查,默认重启pod
          httpGet:
            port: 80
            path: /
          initialDelaySeconds: 10
          periodSeconds: 10
        readinessProbe: #http就绪检查,默认从service摘除pod
          httpGet:
            port: 80
            path: /
          initialDelaySeconds: 10 #initialDelaySeconds 表示在容器启动后多少秒开始探测
          periodSeconds: 10 #periodSeconds 表示探针的探测周期,默认情况下是 10 秒

tcpsocket对指定端口建立tcp连接

spec:
  containers:
  - name: mysql-01
    image: mysql:5.6
    resources:
      limits:
        memory: "512Mi"
        cpu: "1500m"
    ports:
    - containerPort: 3306
    readinessProbe:
      tcpSocket:
        port: 3306
      initialDelaySeconds: 30
      periodSeconds: 20
    livenessProbe:
      tcpSocket:
        port: 3306
      initialDelaySeconds: 30
      periodSeconds: 20

exec运行一次命令

    spec:
...
      containers:
        - image: 'gluster/gluster-centos:latest'
          readinessProbe:
            timeoutSeconds: 3
            initialDelaySeconds: 60
            exec:
              command:
                - /bin/bash
                - '-c'
                - systemctl status glusterd.service
          livenessProbe:
            timeoutSeconds: 3
            initialDelaySeconds: 60
            exec:
              command:
                - /bin/bash
                - '-c'
                - systemctl status glusterd.service
          startupProbe:
            tcpSocket:
              port: 24007
            failureThreshold: 10       #表示运行探测失败的次数
            initialDelaySeconds: 10    #表示在容器启动后多少秒开始探测
            periodSeconds: 10          #表示探针的探测周期,默认情况下是 10 秒        
四,钩子函数

钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码。

kubernetes在主容器的启动之后和停止之前提供了两个钩子函数:
post start:容器创建之后执行,如果失败了会重启容器
pre stop :容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作
钩子处理器支持使用下面三种方式定义动作:

Exec命令:在容器内执行一次命令

spec:
  containers
  - names:
  ...
    lifecycle:
      postStart: 
        exec:
          command:
          - cat
          - /tmp/healthy

TCPSocket:在当前容器尝试访问指定的socket

spec:
  containers
  - names:
  ...
    lifecycle:
      postStart:
        tcpSocket:
          port: 8080

HTTPGet:在当前容器中向某url发起http请求

spec:
  containers
  - names:
  ...
    lifecycle:
      postStart:
        httpGet:
          path: / #URI地址
          port: 80 #端口号
          host: 192.168.5.3 #主机地址
          scheme: HTTP #支持的协议,http或者https

为pod设置额外的命令,有可能覆盖默认的Entrypoint和Cmd时,将应用以下规则:
如果不为容器提供command或args参数,则使用Docker镜像中定义的默认值。
如果提供command但没有提供args参数,则仅使用提供的command。Docker镜像中定义的默认EntryPoint和默认Cmd将被忽略。
如果仅为容器提供args,则Docker镜像中定义的默认Entrypoint将与您提供的args一起运行。
如果提供command和args,则将忽略Docker镜像中定义的默认Entrypoint和默认Cmd。 您的command与 args一起运行。

spec:
  containers:
  - name: main-container
...
    lifecycle:
      postStart:
        exec:    # 在容器启动的时候执行一个命令,修改nginx默认首页内容
          command: ["/bin/sh","-c","echo postStart... > /usr/share/nginx/html/index.html"]
      preStop:
        exec:    # 在容器停止之前停止nginx服务
          command: ["/usr/sbin/nginx","-s","quit"]
五,init初始化

初始化容器是在pod的主容器启动之前运行的容器,做一些主容器的前置工作。
应用场景:

  • 检查并等待其他关联组件运行(例如:数据库或某个后台服务)。
  • 基于环境变量(env)或者配置模板生成配置文件。
  • 从远程数据库获取本地所需的配置信息(类似配置中心),或者将自身注册到某个中央数据库中(类似服务注册)。
  • 下载相关依赖包,或者对系统进行一些预配置操作,比如设置文件、目录权限。
  • 应用 Init Container 对集群环境进行故障排查。与其他几种应用场景相比较特殊。

它具有两大特征:
1.初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成
2.初始化容器必须按照定义的顺序执行,当且仅当前一个成功之后,后面的一个才能运行
初始化容器有很多的应用场景,下面列出的是最常见的:

  • 提供主容器镜像中不具备的工具程序或自定义代码
  • 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足
    #项目环境,pod启动前先用初始化容器测试连接数据库和缓存是否存活
apiVersion: v1
kind: Pod
metadata:
  name: pod-initcontainer
  namespace: dev
spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    ports: 
    - name: nginx-port
      containerPort: 80
  initContainers:
  - name: test-mysql
    image: busybox:1.30
    command: ['sh', '-c', 'until ping 192.168.90.14 -c 1 ; do echo waiting for mysql...; sleep 2; done;']
  - name: test-redis
    image: busybox:1.30
    command: ['sh', '-c', 'until ping 192.168.90.15 -c 1 ; do echo waiting for reids...; sleep 2; done;']
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

背锅攻城师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值