InitContainer

InitContainer

初始化容器

在Pod中,容器是共享存儲資源和網絡資源的,因此Init Container容器產生的數據是能夠被其餘容器做用到的。初始化容器有點相似於postStart 鉤子的做用,在Pod沒有啓動以前,爲應用容器作一些準備工做,可是跟鉤子的啓動處於不一樣的階段,在Pod生命週期圖中能夠明顯看出。Pod中能夠啓動一個或多個容器,也能夠有一個或多個initContainer 容器。html

initContainer 容器和普通容器幾乎同樣,除了一下兩點:mysql

  • 老是運行到完成
  • 必須在Pod啓動下一個容器以前運行完成

若是init容器啓動失敗,容器根據restartPolicy策略重啓,若是有多個,它們會按順序,一次執行一個,每一個init容器都必須運行成功了纔會運行下一個。init容器不支持readnessProbe,由於它們必須在Pod就緒前運行完成。web

initContainer能作什麼?

  • 等他其餘容器Ready: 好比web服務器須要等待mysql數據庫服務器啓動完成,能夠啓動一個initContainer 容器檢測mysql服務啓動,成功後退出,運行主容器
  • 環境構建:爲主容器運行提供配置和初始化等操做。
  • 能夠包含運行使用工具:處於安全考慮,在鏡像中是不建議包含這些工具的。
  • 構建工具和代碼:在鏡像中沒有,而服務須要用到的工具能夠用init Container構建
  • 構建和部署分離: 不須要從新將兩步打包成一個鏡像
  • 提供一種阻塞容器啓動的方式:必須在initContainer容器啓動成功後,纔會運行下一個容器,保證了一組條件運行成功的方式

示例

apiVersino: v1
kind: Pod
metadata:
  name: myapp
spec:
  initContainers:
  - name: init-server
    image: busybox
    command: ["/bin/bash","-c","chown -R apache:apache /var/www"]
    volumeMount:
    - name: wwwroot
      mountPath: /var/www
  containers:
  - name: my-service
    image: httpd
    containerPort:
    - name: http
      port: 80
      protocol: TCP
    volumeMount:
    - name: wwwroot
      mountPath: /var/www
  volumes:
  - name: wwwroot
    hostPath:
      path: /home/wwwroot

能夠經過init Container修改主容器應用中的共享存儲文件權限,讓/var/www 路徑成爲apache用戶和組擁有。這是咱們利用initContainer起到的做用之一。sql

官方文檔示例

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: busybox
    command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
相關文章
相關標籤/搜索