Kubernetes init container

簡介

在不少應用場景中,應用在啓動以前都須要進行以下初始化操做:nginx

  • 等待其餘關聯組件正確運行(例如數據庫或某個後臺服務)
  • 基於環境變量或配置模板生成配置文件
  • 從遠程數據庫獲取本地所需配置,或者將自身註冊到某個中央數據庫中
  • 下載相關依賴包,或者對系統進行一些預配置操做

kubernetes v1.3引入了一些alpha版本的新特性init container(在v1.5版本時被更新爲beta版本),用於在啓動應用容器以前 啓動一個或多個「初始化」容器,完成應用容器所需的預置條件。init container與應用容器本質上是同樣的,但它們是僅運行一次就結束的任務,而且必須在成功執行完成後,系統才能繼續執行下一個容器。根據pod的重啓策略,當init container執行失敗,在設置了RestartPolicy=Never時,pod將自動啓動失敗;而設置RestartPolicy=Always時,Pod將會被系統自動重啓。算法

配置

下面以一個nginx應用爲例,在啓動nginx以前,經過初始化容器busybox爲nginx建立一個index.html的主頁文件。這裏爲init container和nginx設置了一個共享的volume,以供nginx訪問init container設置的index.html文件:數據庫

nginx-init-containers.yaml內容以下:api

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  annotations:
spec:
  initContainers:
  - name: install
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - "http://kubernetes.io"
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  containers:
  - name: workdir
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  dnsPolicy: Default
    volumes:
    - name: workdir
      emptyDir: {}

init container與應用容器的區別

簡單的說明一下二者的區別:安全

  • init container的運行方式與應用容器不一樣,它們必須先於應用容器執行完成,當設置了多個init container時,將按順序逐個運行,而且只有前一個init container運行成功後才能運行後一個init container。當全部init container都成功運行後,kubernetes纔會初始化pod的各類信息,並開始建立和運行應用容器。
  • 在init container的定義中也能夠設置資源限制、volume的使用和安全策略等等。但資源限制的設置與應用容器不一樣:
    • 若是多個init container都定義了資源請求/資源限制,則取最大的值做爲全部init container的資源請求值/資源限制值。
    • pod的有效資源請求值/資源限制值取如下兩者中的較大值:
      • 全部應用容器的資源請求值/限制值之和
      • init container的有效資源請求值/限制值
    • 調度算法將基於pod的有效資源請求值/限制值進行計算,也就是說init container能夠爲初始化操做預留系統資源,即便後續應用容器無須使用這些資源。
    • pod的有效QoS等級適用於init container和應用容器。
    • 資源配額和限制將根據pod的有效資源請求/限制,與調度機制一致。
  • init container不能設置readinessProbe探針,由於必須在它們成功運行之後才能繼續運行pod中定義的普通容器。將pod重啓時,init container將會從新運行,常見的pod重啓場景以下:
    • init container的鏡像被更新時,init container將從新運行,致使pod重啓,僅更新應用容器的鏡像只會使得應用容器被重啓。
    • pod的infrastructure容器更新時,pod將會重啓。
    • 或pod中的全部應用容器都終止了,而且RestartPolicy=Always時,則pod將會重啓。
相關文章
相關標籤/搜索