InitContainer


InitContainer

初始化容器

在Pod中,容器是共享存儲資源和網絡資源的,所以Init Container容器產生的數據是可以被其他容器作用到的。初始化容器有點類似於postStart 鈎子的作用,在Pod沒有啟動之前,為應用容器做一些准備工作,但是跟鈎子的啟動處於不同的階段,在Pod生命周期圖中可以明顯看出。Pod中可以啟動一個或多個容器,也可以有一個或多個initContainer 容器。

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

  • 總是運行到完成
  • 必須在Pod啟動下一個容器之前運行完成

如果init容器啟動失敗,容器根據restartPolicy策略重啟,如果有多個,它們會按順序,一次執行一個,每個init容器都必須運行成功了才會運行下一個。init容器不支持readnessProbe,因為它們必須在Pod就緒前運行完成。

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起到的作用之一。

官方文檔示例

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;']


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM