国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【云原生|Kubernetes】08-Pod中的Init容器

這篇具有很好參考價(jià)值的文章主要介紹了【云原生|Kubernetes】08-Pod中的Init容器。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

【云原生Kubernetes】08-Pod中的Init容器

簡(jiǎn)介

  • Init 容器是一種特殊容器,在 Pod內(nèi)的應(yīng)用容器啟動(dòng)之前運(yùn)行。Init 容器可以包括一些應(yīng)用鏡像中不存在的實(shí)用工具和安裝腳本。

  • 你可以在 Pod 的spec中與用來描述應(yīng)用容器的 containers 數(shù)組平行的位置指定 Init 容器。

containers:
  - name: myapp-container
    image: busybox:1.28
  initContainers:
  - name: init-myservice
    image: busybox:1.28
  • Init 容器的狀態(tài)在 status.initContainerStatuses 字段中以容器狀態(tài)數(shù)組的格式返回 (類似 status.containerStatuses 字段)。

理解 Init 容器

  1. 每個(gè) Pod中可以包含多個(gè)容器, 應(yīng)用運(yùn)行在這些容器里面,同時(shí) Pod 也可以有一個(gè)或多個(gè)先于應(yīng)用容器啟動(dòng)的 Init 容器。

Init 容器與普通的容器非常像,除了如下兩點(diǎn):

  • 它們總是運(yùn)行到完成。
  • 每個(gè)都必須在下一個(gè)啟動(dòng)之前成功完成。
  1. 如果 Pod 的 Init 容器失敗,kubelet 會(huì)不斷地重啟該 Init 容器直到該容器成功為止。 然而,如果 Pod 對(duì)應(yīng)的 restartPolicy 值為 “Never”,并且 Pod 的 Init 容器失敗, 則 Kubernetes 會(huì)將整個(gè) Pod 狀態(tài)設(shè)置為失敗。

  2. 如果為一個(gè) Pod 指定了多個(gè) Init 容器,這些容器會(huì)按順序逐個(gè)運(yùn)行。 每個(gè) Init 容器必須運(yùn)行成功,下一個(gè)才能夠運(yùn)行。當(dāng)所有的 Init 容器運(yùn)行完成時(shí), Kubernetes 才會(huì)為 Pod 初始化應(yīng)用容器并像平常一樣運(yùn)行。

與普通容器的不同之處:

  • Init 容器支持應(yīng)用容器的全部字段和特性,包括資源限制、數(shù)據(jù)卷和安全設(shè)置。 然而,Init 容器對(duì)資源請(qǐng)求和限制的處理稍有不同;
  • Init 容器不支持 lifecycle、livenessProbe、readinessProbestartupProbe, 因?yàn)樗鼈儽仨氃?Pod 就緒之前運(yùn)行完成。

Init容器使用場(chǎng)景

因?yàn)?Init 容器具有與應(yīng)用容器分離的單獨(dú)鏡像,其啟動(dòng)相關(guān)代碼具有如下優(yōu)勢(shì):

  • Init 容器可以包含一些安裝過程中應(yīng)用容器中不存在的實(shí)用工具或個(gè)性化代碼。 例如,沒有必要僅為了在安裝過程中使用類似 sed、awk、pythondig 這樣的工具而去 FROM 一個(gè)鏡像來生成一個(gè)新的鏡像。

  • 應(yīng)用鏡像的創(chuàng)建者和部署者可以各自獨(dú)立工作,而沒有必要聯(lián)合構(gòu)建一個(gè)單獨(dú)的應(yīng)用鏡像。

  • 與同一 Pod 中的多個(gè)應(yīng)用容器相比,Init 容器能以不同的文件系統(tǒng)視圖運(yùn)行。因此,Init 容器可以被賦予訪問應(yīng)用容器不能訪問的 Secret 的權(quán)限。

  • 由于 Init 容器必須在應(yīng)用容器啟動(dòng)之前運(yùn)行完成,因此 Init 容器提供了一種機(jī)制來阻塞或延遲應(yīng)用容器的啟動(dòng),直到滿足了一組先決條件。 一旦前置條件滿足,Pod 內(nèi)的所有的應(yīng)用容器會(huì)并行啟動(dòng)。

  • Init 容器可以安全地運(yùn)行實(shí)用程序或自定義代碼,而在其他方式下運(yùn)行這些實(shí)用程序或自定義代碼可能會(huì)降低應(yīng)用容器鏡像的安全性。 通過將不必要的工具分開,你可以限制應(yīng)用容器鏡像的被攻擊范圍。

創(chuàng)建包含Init容器的Pod

  1. 應(yīng)用容器和 Init 容器共享了一個(gè)卷。Init 容器將共享卷掛載到了 /work-dir 目錄,應(yīng)用容器將共享卷掛載到了 /usr/share/nginx/html 目錄。 Init 容器執(zhí)行完下載index.html的指令后就終止;實(shí)現(xiàn)nginx Pod的展示文件,在啟動(dòng)前自動(dòng)在線下載。
apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  # 這些容器在 Pod 初始化期間運(yùn)行
  initContainers:
  - name: install
    image: busybox:1.28
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://info.cern.ch
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  dnsPolicy: Default
  volumes:
  - name: workdir
    emptyDir: {}
  1. Init 容器將共享卷掛載到了 /work-dir 目錄,應(yīng)用容器將共享卷掛載到了 /usr/share/nginx/html 目錄。 Init 容器執(zhí)行完下面的命令就終止:
wget -O /work-dir/index.html http://info.cern.ch
  1. 請(qǐng)注意 Init 容器在 nginx 服務(wù)器的根目錄寫入 index.html。
  2. 創(chuàng)建Pod
kubectl apply -f  init-containers.yaml
  1. 檢查 init-demo Pod運(yùn)行正常:
[root@master pod]# kubectl  get  pods init-demo
NAME        READY   STATUS    RESTARTS   AGE
init-demo   1/1     Running   0          7m34s
[root@master pod]#
  1. 查看Pod中initcontainer的日志
[root@master pod]# kubectl logs init-demo -c install
Connecting to info.cern.ch (188.184.21.108:80)
index.html           100% |*******************************|   646   0:00:00 ETA

[root@master pod]#
  1. 通過 shell 進(jìn)入 init-demo Pod 中的 nginx 容器,在 shell 中,發(fā)送個(gè) GET 請(qǐng)求到 nginx 服務(wù)器,結(jié)果表明 nginx 正在為 Init 容器編寫的 web 頁面服務(wù):
[root@master pod]# kubectl exec -it init-demo -- /bin/bash
Defaulted container "nginx" out of: nginx, install (init)
root@init-demo:/#
root@init-demo:/# curl localhost
<html><head></head><body><header>
<title>http://info.cern.ch</title>
</header>

<h1>http://info.cern.ch - home of the first website</h1>
<p>From here you can:</p>
<ul>
<li><a >Browse the first website</a></li>
<li><a >Browse the first website using the line-mode browser simulator</a></li>
<li><a >Learn about the birth of the web</a></li>
<li><a >Learn about CERN, the physics laboratory where the web was born</a></li>
</ul>
</body></html>
root@init-demo:/# exit
  1. 定義了一個(gè)具有 2 個(gè) Init 容器的簡(jiǎn)單 Pod。 第一個(gè)等待 myservice 啟動(dòng), 第二個(gè)等待 mydb 啟動(dòng)。 一旦這兩個(gè) Init 容器都啟動(dòng)完成,Pod 將啟動(dòng) spec 節(jié)中的應(yīng)用容器。
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app.kubernetes.io/name: MyApp
spec:
  containers:
  - name: myapp-container
    image: busybox:1.28
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busybox:1.28
    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
  1. 通過運(yùn)行下面的命令啟動(dòng) Pod:
kubectl apply -f two-init.yaml
  1. 檢查其Pod狀態(tài):
[root@master pod]# kubectl get pods myapp-pod
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:0/2   0          2s
[root@master pod]#
  1. 如需查看 Pod 內(nèi) Init 容器的日志,請(qǐng)執(zhí)行:
kubectl logs myapp-pod -c init-myservice # 查看第一個(gè) Init 容器
kubectl logs myapp-pod -c init-mydb      # 查看第二個(gè) Init 容器

創(chuàng)建這些 Service 的配置文件

---
apiVersion: v1
kind: Service
metadata:
  name: myservice
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9376
---
apiVersion: v1
kind: Service
metadata:
  name: mydb
spec:
  ports:
  - protocol: TCP
    port: 80
    targetPort: 9377
  1. 創(chuàng)建 mydbmyservice 服務(wù)的命令:
kubectl apply -f services.yaml
  1. 這樣你將能看到這些 Init 容器執(zhí)行完畢,隨后 my-app 的 Pod 進(jìn)入 Running 狀態(tài):
[root@master pod]# kubectl get  pods myapp-pod
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1/1     Running   0          15m
[root@master pod]#

具體行為

  1. 在 Pod 啟動(dòng)過程中,每個(gè) Init 容器會(huì)在網(wǎng)絡(luò)和數(shù)據(jù)卷初始化(即pause容器)之后按順序啟動(dòng)。 kubelet 運(yùn)行依據(jù) Init 容器在 Pod 規(guī)約中的出現(xiàn)順序依次運(yùn)行之。
  2. 每個(gè) Init 容器成功退出后才會(huì)啟動(dòng)下一個(gè) Init 容器。 如果某容器因?yàn)槿萜鬟\(yùn)行時(shí)的原因無法啟動(dòng),或以錯(cuò)誤狀態(tài)退出,kubelet 會(huì)根據(jù) Pod 的 restartPolicy 策略進(jìn)行重試。 然而,如果 Pod 的 restartPolicy 設(shè)置為 “Always”,Init 容器失敗時(shí)會(huì)使用 restartPolicy 的 “OnFailure” 策略。
  3. 在所有的 Init 容器沒有成功之前,Pod 將不會(huì)變成 Ready 狀態(tài)。 Init 容器的端口將不會(huì)在 Service 中進(jìn)行聚集。正在初始化中的 Pod 處于 Pending 狀態(tài), 但會(huì)將狀況 Initializing 設(shè)置為 false。
  4. 如果 Pod 重啟,所有 Init 容器必須重新執(zhí)行。對(duì) Init 容器規(guī)約的修改僅限于容器的 image 字段。 更改 Init 容器的 image 字段,等同于重啟該 Pod。
  5. 因?yàn)?Init 容器可能會(huì)被重啟、重試或者重新執(zhí)行,所以 Init 容器的代碼應(yīng)該是冪等的。 特別地,基于 emptyDirs 寫文件的代碼,應(yīng)該對(duì)輸出文件可能已經(jīng)存在做好準(zhǔn)備。
  6. nit 容器具有應(yīng)用容器的所有字段。然而 Kubernetes 禁止使用 readinessProbe, 因?yàn)?Init 容器不能定義不同于完成態(tài)(Completion)的就緒態(tài)(Readiness)。 Kubernetes 會(huì)在校驗(yàn)時(shí)強(qiáng)制執(zhí)行此檢查。
  7. 在 Pod 上使用 activeDeadlineSeconds 和在容器上使用 livenessProbe 可以避免 Init 容器一直重復(fù)失敗。 activeDeadlineSeconds 時(shí)間包含了 Init 容器啟動(dòng)的時(shí)間。 但建議僅在團(tuán)隊(duì)將其應(yīng)用程序部署為 Job 時(shí)才使用 activeDeadlineSeconds, 因?yàn)?activeDeadlineSeconds 在 Init 容器結(jié)束后仍有效果。 如果你設(shè)置了 activeDeadlineSeconds,已經(jīng)在正常運(yùn)行的 Pod 會(huì)被殺死。
  8. 在 Pod 中的每個(gè)應(yīng)用容器和 Init 容器的名稱必須唯一; 與任何其它容器共享同一個(gè)名稱,會(huì)在校驗(yàn)時(shí)拋出錯(cuò)誤。

資源

在給定的 Init 容器執(zhí)行順序下,資源使用適用于如下規(guī)則:

  • 所有 Init 容器上定義的任何特定資源的 limit 或 request 的最大值,作為 Pod 有效初始 request/limit。 如果任何資源沒有指定資源限制,這被視為最高限制。
  • Pod 對(duì)資源的有效 limit/request是如下兩者中的較大者:
    • 所有應(yīng)用容器對(duì)某個(gè)資源的 limit/request 之和;
    • 對(duì)某個(gè)資源的有效初始 limit/request。
  • 基于有效 limit/request 完成調(diào)度,這意味著 Init 容器能夠?yàn)槌跏蓟^程預(yù)留資源, 這些資源在 Pod 生命周期過程中并沒有被使用。
  • Pod 的 有效 QoS 層,與 Init 容器和應(yīng)用容器的一樣。

Pod 重啟的原因

Pod 重啟會(huì)導(dǎo)致 Init 容器重新執(zhí)行,主要有如下幾個(gè)原因:

  • Pod 的基礎(chǔ)設(shè)施容器 (譯者注:如 pause 容器) 被重啟。這種情況不多見, 必須由具備 root 權(quán)限訪問節(jié)點(diǎn)的人員來完成。
  • 當(dāng) restartPolicy 設(shè)置為 Always,Pod 中所有容器會(huì)終止而強(qiáng)制重啟。 由于垃圾收集機(jī)制的原因,Init 容器的完成記錄將會(huì)丟失。

當(dāng) Init 容器的鏡像發(fā)生改變或者 Init 容器的完成記錄因?yàn)槔占仍虮粊G失時(shí), Pod 不會(huì)被重啟。這一行為適用于 Kubernetes v1.20 及更新版本。

調(diào)試Init容器

  • 檢查 Init 容器的狀態(tài)
  1. 顯示你的 Pod 的狀態(tài)
kubectl get pod <pod-name>
如,狀態(tài) Init:1/2 表明兩個(gè) Init 容器中的一個(gè)已經(jīng)成功完成:
NAME         READY     STATUS     RESTARTS   AGE
<pod-name>   0/1       Init:1/2   0          7s
  • 獲取 Init 容器詳情
  1. Init 容器運(yùn)行的更多詳情
kubectl describe pod <pod-name>
  1. 與 Pod 名稱一起傳遞 Init 容器名稱,以訪問容器的日志。
kubectl logs <pod-name> -c <init-container-2>

理解 Pod 的狀態(tài)

Init: 開頭的 Pod 狀態(tài)匯總了 Init 容器執(zhí)行的狀態(tài)。 下表介紹調(diào)試 Init 容器時(shí)可能看到的一些狀態(tài)值示例。文章來源地址http://www.zghlxwxcb.cn/news/detail-483916.html

狀態(tài) 含義
Init:N/M Pod 包含 M 個(gè) Init 容器,其中 N 個(gè)已經(jīng)運(yùn)行完成。
Init:Error Init 容器已執(zhí)行失敗。
Init:CrashLoopBackOff Init 容器執(zhí)行總是失敗。
Pending Pod 還沒有開始執(zhí)行 Init 容器。正在被調(diào)度
PodInitializingorRunning Pod 已經(jīng)完成執(zhí)行 Init 容器。

到了這里,關(guān)于【云原生|Kubernetes】08-Pod中的Init容器的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 云原生Kubernetes:pod基礎(chǔ)

    云原生Kubernetes:pod基礎(chǔ)

    目錄 一、理論 1.pod 2.pod容器分類 3.鏡像拉取策略 4.pod 的重啟策略 二、實(shí)驗(yàn) 1.Pod容器的分類 2.鏡像拉取策略 三、問題 1.apiVersion 報(bào)錯(cuò) 2.pod v1版本資源未注冊(cè) 3.格式錯(cuò)誤 4.取行顯示指定pod信息 四、總結(jié) (1)? 概念 ?Pod是kubernetes中最小的資源管理組件,Pod也是最小化運(yùn)行容器化應(yīng)

    2024年02月09日
    瀏覽(20)
  • Kubernetes —Pod 和容器日志

    Kubernetes —Pod 和容器日志

    應(yīng)用日志可以讓你了解應(yīng)用內(nèi)部的運(yùn)行狀況。日志對(duì)調(diào)試問題和監(jiān)控集群活動(dòng)非常有用。 大部分現(xiàn)代化應(yīng)用都有某種日志記錄機(jī)制。同樣地,容器引擎也被設(shè)計(jì)成支持日志記錄。 針對(duì)容器化應(yīng)用,最簡(jiǎn)單且最廣泛采用的日志記錄方式就是寫入標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤流。 但是,

    2024年02月13日
    瀏覽(25)
  • Kubernetes中Pod容器的使用

    Pod是K8S系統(tǒng)中可以創(chuàng)建和管理的最小單元,是資源對(duì)象模型中由用戶創(chuàng)建或部署的最小資源對(duì)象模型 有許多組件圍繞Pod進(jìn)行擴(kuò)展和支持,比如控制器對(duì)象是用來管控Pod對(duì)象的,Service或者Ingress資源對(duì)象是用來暴露Pod引用對(duì)象的,PersistentVolume資源對(duì)象是用來為Pod提供存儲(chǔ)等。

    2024年02月15日
    瀏覽(29)
  • 【云原生】Kubernetes之 Pod hook(鉤子)

    Pod hook(鉤子)是由 Kubernetes 管理的 kubelet 發(fā)起的,當(dāng)容器中的進(jìn)程啟動(dòng)前或者容器中的進(jìn)程終止之前運(yùn)行,這是包含在容器的生命周期之中??梢酝瑫r(shí)為 Pod 中的所有容器都配置 hook。 Hook 的類型包括兩種: exec:執(zhí)行一段命令 HTTP:發(fā)送 HTTP 請(qǐng)求 示例如下: 說明: postStar

    2024年02月15日
    瀏覽(20)
  • Kubernetes在容器內(nèi)獲取Pod信息

    我們知道,每個(gè) Pod 在被成功創(chuàng)建出來之后,都會(huì)被系統(tǒng)分配唯一的名字、IP 地址,并且處于某個(gè) Namespace 中,那么我們?nèi)绾卧?Pod 的容器內(nèi)獲取 Pod 的這些重要信息呢?答案就是使用 Downward API。 Downward API 可以通過以下兩種方式將 Pod 信息注入容器內(nèi)部。 (1)環(huán)境變量:用于單

    2024年02月10日
    瀏覽(23)
  • 【云原生】kubernetes深入理解Pod對(duì)象:基本管理

    【云原生】kubernetes深入理解Pod對(duì)象:基本管理

    目錄 一、Pod 基本概念 二、pod 常用命令 三、Pod 資源共享實(shí)現(xiàn)機(jī)制 3.1 共享網(wǎng)絡(luò) 3.2 共享存儲(chǔ) 四、Pod 狀態(tài)管理 五、重啟策略和健康檢查 5.1 基本概念 5.1.1 重啟策略 5.1.2 健康檢查有以下三種類型: 5.1.3 支持以下三種檢查方法: 5.2 示例講解 5.2.1 就緒健康檢查示例 六、Pod環(huán)境變

    2024年02月07日
    瀏覽(29)
  • kubernetes|云原生| 如何優(yōu)雅的重啟和更新pod---pod生命周期管理實(shí)務(wù)

    kubernetes|云原生| 如何優(yōu)雅的重啟和更新pod---pod生命周期管理實(shí)務(wù)

    kubernetes的管理維護(hù)的復(fù)雜性體現(xiàn)在了方方面面,例如,pod的管理,服務(wù)的管理,用戶的管理(RBAC),網(wǎng)絡(luò)的管理等等,因此,kubernetes安裝部署完畢僅僅是萬里長(zhǎng)征的第一步,后面的運(yùn)營(yíng)和維護(hù)工作才是更為關(guān)鍵的東西。 那么,pod的生命周期是什么概念呢?這

    2024年02月04日
    瀏覽(18)
  • 【云原生|Kubernetes】05-Pod的存儲(chǔ)卷(Volume)

    【云原生|Kubernetes】05-Pod的存儲(chǔ)卷(Volume)

    Volume 是Pod 中能夠被多個(gè)容器訪問的共享目錄。 Kubernetes 中的Volume 概念、用 途和目的與 Docke 中的 Vo lume 比較類似,但二者不能等價(jià), 首先 Kubernetes 中的Volume 被定義在 Pod上 ,被一個(gè) Pod 里的多個(gè)容器掛載到具體的文件目錄 ;其次, Kubernete 中的 Volume與 Pod 的生命周期相同,但

    2024年02月07日
    瀏覽(45)
  • 在CSDN學(xué)Golang云原生(Kubernetes Pod)

    在 Kubernetes 中,Pod 是最小的可部署單元,它包含一個(gè)或多個(gè)容器。使用 Golang 來定義和操作 Pod 時(shí),需要使用 kubernetes/client-go 包提供的 API。 以下是 Golang 定義和基本用法 Pod 的示例: 安裝 kubernetes/client-go 包 在 Golang 環(huán)境中安裝 kubernetes/client-go 包,該包提供了訪問 Kubernetes

    2024年02月15日
    瀏覽(29)
  • 在CSDN學(xué)Golang云原生(Kubernetes Pod調(diào)度)

    在 Kubernetes 中,可以使用 NodeSelector 字段來指定 Pod 調(diào)度到哪些節(jié)點(diǎn)上運(yùn)行。NodeSelector 是一個(gè)鍵值對(duì)的 map,其中鍵是節(jié)點(diǎn)的標(biāo)簽名,值是標(biāo)簽值。具體步驟如下: 在節(jié)點(diǎn)上添加標(biāo)簽 首先需要在節(jié)點(diǎn)上添加相應(yīng)的標(biāo)簽,例如: 編寫 Pod 的 YAML 文件 在編寫 Pod 的 YAML 文件時(shí),需

    2024年02月15日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包