天天看點

k8s 使用 Init Container 確定依賴的服務已經啟動

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
           
k8s 使用 Init Container 確定依賴的服務已經啟動

從上面的資訊可以看到結果是符合預期的,首先是建立并啟動

init-redis

的容器,然後建立并啟動

init-mysql

容器,最後建立并啟動

reservation-server

容器,從 pod 狀态來看,redis 和 mysql 還未

ready

時,

resrvation-server

容器也不會啟動

檢視 init-redis 的日志

kubectl logs reservation-server-59fb5447f7-gb5jg -c init-redis
           
k8s 使用 Init Container 確定依賴的服務已經啟動

檢視 init-mysql 的日志:

kubectl logs reservation-server-59fb5447f7-gb5jg -c init-mysql
           
k8s 使用 Init Container 確定依賴的服務已經啟動

Memo

通過 init container 的配置終于可以解決依賴的服務還沒有 ready 應用就啟動進而導緻應用多次重新開機之後才能正常工作的問題~~

Reference

  • https://kubernetes.io/docs/concepts/workloads/pods/init-containers
  • https://github.com/WeihanLi/ActivityReservation/blob/dev/k8s/charts/reservation-server/templates/deployment.yaml
  • https://github.com/WeihanLi/ActivityReservation/tree/dev/k8s/charts/reservation-server

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

k8s

繼續閱讀