zoukankan      html  css  js  c++  java
  • k8s 使用 Init Container 确保依赖的服务已经启动

    k8s 使用 Init Container 确保依赖的服务已经启动

    Intro

    最近 helm 3 正式发布了,dotnetcore 3.1 也正式发布了,最近打算把我的活动室预约项目做一个升级,项目已经升级到了 dotnetcore 3.1,最近几天则在准备把项目打包一个 helm 包,使得想要在 k8s 上部署的童鞋可以更方便的部署,目前已经基本完成,本来打算发布到阿里云的 AppHub 上,但是前几天更新的 angular client 的 chart 还没有更新,不知道最近是不更新了还是怎么回事,所以现在暂时还没发布到阿里云的 AppHub。你如果想要现在体验,可以直接拉取 Github 上的 chart 配置,自己打包安装。

    一个 Pod 中可以有多个 container,也可以有多个 init container,init container 会在应用启动之前启动,并且如果有多个应用会依次启动,只有一个运行成功了,才会启动下一个,所有 init container 都运行结束了,应用才会启动,因此,我们可以借助 init container 来检查应用的依赖(如:db/redis/es...)是否已经可用。

    Init Container 使用示例

    apiVersion: v1
    kind: Pod
    metadata:
      name: myapp-pod
      labels:
        app: myapp
    spec:
      containers:
      - name: reservation-server
        image: weihanli/activityreservation:dev
        ports:
          - name: http
            containerPort: 80
            protocol: TCP
        livenessProbe:
            httpGet:
                path: /health
                port: http
            initialDelaySeconds: 60
            periodSeconds: 10
        readinessProbe:
            httpGet:
                path: /api/notice
                port: http
            initialDelaySeconds: 60
            periodSeconds: 10
      initContainers:
        - name: init-redis
          image: busybox:1.31
          command: ['sh', '-c', 'until nslookup redis-server; do echo waiting for redis; sleep 2; done;']
        - name: init-mysql
          image: busybox:1.31
          command: ['sh', '-c', 'until nslookup mysql-server; do echo waiting for mysql; sleep 2; done;']
    

    上面这一示例定义了两个 init container,一个用来检查 redis 是否启动成功,另外一个用来检查 mysql 是否启动成功,开始部署的时候,首先会通过 nslookup 检查 redis 是否成功启动,检测到 redis 启动了之后,域名解析也就会成功,然后会检查 mysql 的状态,mysql 也成功启动之后才会开始启动 reservation-server container

    查看 pod 信息:

    kubectl describe po reservation-server-59fb5447f7-gb5jg
    

    从上面的信息可以看到结果是符合预期的,首先是创建并启动 init-redis 的容器,然后创建并启动 init-mysql 容器,最后创建并启动 reservation-server 容器,从 pod 状态来看,redis 和 mysql 还未 ready 时,resrvation-server 容器也不会启动

    查看 init-redis 的日志

    kubectl logs reservation-server-59fb5447f7-gb5jg -c init-redis
    

    查看 init-mysql 的日志:

    kubectl logs reservation-server-59fb5447f7-gb5jg -c init-mysql
    

    init-mysql

    Memo

    通过 init container 的配置终于可以解决依赖的服务还没有 ready 应用就启动从而导致应用多次重启之后才能正常工作的问题~~

    Reference

  • 相关阅读:
    【LeetCode】Validate Binary Search Tree
    【LeetCode】Search in Rotated Sorted Array II(转)
    【LeetCode】Search in Rotated Sorted Array
    【LeetCode】Set Matrix Zeroes
    【LeetCode】Sqrt(x) (转载)
    【LeetCode】Integer to Roman
    贪心算法
    【LeetCode】Best Time to Buy and Sell Stock III
    【LeetCode】Best Time to Buy and Sell Stock II
    CentOS 6 上安装 pip、setuptools
  • 原文地址:https://www.cnblogs.com/weihanli/p/12018469.html
Copyright © 2011-2022 走看看