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