Init Container(初始化容器)

Init Container(初始化容器)

在很多應(yīng)用場(chǎng)景中,應(yīng)用啟動(dòng)之前都需要進(jìn)行如下初始化操作。

  • 等待其他關(guān)聯(lián)組件正確運(yùn)行(例如數(shù)據(jù)庫(kù)或某個(gè)后臺(tái)服務(wù))。
  • 基于環(huán)境變量配置模板生成配置文件。
  • 遠(yuǎn)程數(shù)據(jù)庫(kù)獲取本地所需配置,或者將自身注冊(cè)到某個(gè)中央數(shù)據(jù)庫(kù)中。
  • 下載相關(guān)依賴(lài)包,或者對(duì)系統(tǒng)進(jìn)行一些預(yù)配置操作。

Kubernetes 1.3引入了一個(gè)Alpha版本的新特性init container(初始化容器,在Kubernetes 1.5時(shí)被更新為Beta版本),用于在啟動(dòng)應(yīng)用!?。∪萜?/strong>(app container)之前啟動(dòng)一個(gè)或多個(gè)初始化?。?!容器,完成應(yīng)用容器所需的預(yù)置條件,如圖所示。

image.png

init container應(yīng)用容器本質(zhì)上是一樣的,但它們是僅運(yùn)行一次?。?!就結(jié)束的任務(wù),并且必須在成功執(zhí)行完成后?。?!,系統(tǒng)才能繼續(xù)執(zhí)行下一個(gè)容器

根據(jù)Pod的重啟策略(RestartPolicy),當(dāng)init container執(zhí)行失敗,而且設(shè)置了RestartPolicy=Never時(shí),Pod將會(huì)啟動(dòng)失?。。。?/strong>;而設(shè)置RestartPolicy=Always時(shí),Pod將會(huì)被系統(tǒng)自動(dòng)重啟。

下面以Nginx應(yīng)用為例,在啟動(dòng)Nginx之前,通過(guò)初始化容器busybox為Nginx創(chuàng)建一個(gè)index.html主頁(yè)文件。這里為init containerNginx設(shè)置了一個(gè)共享的Volume,以供Nginx訪(fǎng)問(wèn)init container設(shè)置的index.html文件:

# nginx-init-containers.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  annotations:
spec:
  initContainers:               # 這個(gè)是重點(diǎn), initcontainers
  - name: install               
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://kubernetes.io
    volumeMounts:
    - name: workdir             # volume mount
      mountPath: "/work-dir"
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir             # nginx使用這個(gè)volume
      mountPath: /usr/share/nginx/html
  dnsPolicy: Default
  volumes:                      # volume
  - name: workdir               
    emptyDir: {}
kubectl apply -f nginx-init-containers.yaml

# 在運(yùn)行init container的過(guò)程中查看Pod的狀態(tài),可見(jiàn)init過(guò)程還未完成
[root@k8s-master01 init_container]# kubectl get pods -o wide
NAME                          READY   STATUS             RESTARTS   AGE       
nginx                         0/1     PodInitializing    0          10s 

# 啟動(dòng)成功后,登錄進(jìn)Nginx容器,可以看到/usr/share/nginx/html目錄下的index.html文件為init container所生成,其內(nèi)容為:
[root@k8s-master01 init_container]# kubectl exec nginx -it -- /bin/sh
# ls /usr/share/nginx/html
index.html

init container與應(yīng)用容器的區(qū)別如下。

(1)init container的運(yùn)行方式與應(yīng)用容器不同,它們必須先于應(yīng)用容器執(zhí)行完成,當(dāng)設(shè)置了多個(gè)init container時(shí),將按順序逐個(gè)運(yùn)行,并且只有前一個(gè)init container運(yùn)行成功后才能運(yùn)行后一個(gè)init container。當(dāng)所有init container都成功運(yùn)行后,Kubernetes才會(huì)初始化Pod的各種信息,并開(kāi)始創(chuàng)建和運(yùn)行應(yīng)用容器。

(2)在init container的定義中也可以設(shè)置資源限制、Volume的使用和安全策略,等等。但資源限制的設(shè)置與應(yīng)用容器略有不同。

  • 如果多個(gè)init container都定義了資源請(qǐng)求/資源限制,則取最大的值作為所有init container的資源請(qǐng)求值/資源限制值。

  • Pod的有效(effective)資源請(qǐng)求值/資源限制值取以下二者中的較大值。

    • a)所有應(yīng)用容器的資源請(qǐng)求值/資源限制值之和。
    • b)init container的有效資源請(qǐng)求值/資源限制值。
  • 調(diào)度算法將基于Pod的有效資源請(qǐng)求值/資源限制值進(jìn)行計(jì)算,也就是說(shuō)init container可以為初始化操作預(yù)留系統(tǒng)資源,即使后續(xù)應(yīng)用容器無(wú)須使用這些資源。

  • Pod的有效QoS等級(jí)適用于init container和應(yīng)用容器。

  • 資源配額和限制將根據(jù)Pod的有效資源請(qǐng)求值/資源限制值計(jì)算生效。

  • Pod級(jí)別的cgroup將基于Pod的有效資源請(qǐng)求/限制,與調(diào)度機(jī)制一致。

(3)init container不能設(shè)置readinessProbe探針,因?yàn)楸仨氃谒鼈兂晒\(yùn)行后才能繼續(xù)運(yùn)行在Pod中定義的普通容器。

在Pod重新啟動(dòng)時(shí),init container將會(huì)重新運(yùn)行,常見(jiàn)的Pod重啟場(chǎng)景如下。

  • init container的鏡像被更新時(shí),init container將會(huì)重新運(yùn)行,導(dǎo)致Pod重啟。僅更新應(yīng)用容器的鏡像只會(huì)使得應(yīng)用容器被重啟。
  • Pod的infrastructure容器更新時(shí),Pod將會(huì)重啟
  • 若Pod中的所有應(yīng)用容器都終止了,并且RestartPolicy=Always,則Pod會(huì)重啟。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容