+v ljx97609760
一起溝通學(xué)習(xí)
容器鏡像
容器鏡像(Image)所承載的是封裝了應(yīng)用程序及其所有軟件依賴的二進(jìn)制數(shù)據(jù)。 容器鏡像是可執(zhí)行的軟件包,可以單獨運行
你通常會創(chuàng)建應(yīng)用的容器鏡像并將其推送到某倉庫(Registry),然后在 Pod 中引用它
鏡像名稱
如果你不指定倉庫的主機名,Kubernetes 認(rèn)為你在使用 Docker 公共倉庫
在鏡像名稱之后,你可以添加一個標(biāo)簽(Tag)(與使用 docker 或 podman 等命令時的方式相同)使用標(biāo)簽?zāi)茏屇惚孀R同一鏡像序列中的不同版本
鏡像標(biāo)簽可以包含小寫字母、大寫字母、數(shù)字、下劃線()、句點(.)和連字符(-)。 關(guān)于在鏡像標(biāo)簽中何處可以使用分隔字符(、- 和 .)還有一些額外的規(guī)則。 如果你不指定標(biāo)簽,Kubernetes 認(rèn)為你想使用標(biāo)簽 latest
更新鏡像
當(dāng)你最初創(chuàng)建一個 Deployment、 StatefulSet、Pod 或者其他包含 Pod 模板的對象時,如果沒有顯式設(shè)定的話, Pod 中所有容器的默認(rèn)鏡像拉取策略是 IfNotPresent。這一策略會使得 kubelet 在鏡像已經(jīng)存在的情況下直接略過拉取鏡像的操作
鏡像拉取策略
容器的 imagePullPolicy 和鏡像的標(biāo)簽會影響 kubelet 嘗試?yán)。ㄏ螺d)指定的鏡像
以下列表包含了 imagePullPolicy 可以設(shè)置的值,以及這些值的效果:
IfNotPresent
只有當(dāng)鏡像在本地不存在時才會拉取
Always
每當(dāng) kubelet 啟動一個容器時,kubelet 會查詢?nèi)萜鞯溺R像倉庫, 將名稱解析為一個鏡像摘要。 如果 kubelet 有一個容器鏡像,并且對應(yīng)的摘要已在本地緩存,kubelet 就會使用其緩存的鏡像; 否則,kubelet 就會使用解析后的摘要拉取鏡像,并使用該鏡像來啟動容器
Never
Kubelet 不會嘗試獲取鏡像。如果鏡像已經(jīng)以某種方式存在本地, kubelet 會嘗試啟動容器;否則,會啟動失敗
默認(rèn)鏡像拉取策略
當(dāng)你(或控制器)向 API 服務(wù)器提交一個新的 Pod 時,你的集群會在滿足特定條件時設(shè)置 imagePullPolicy 字段:
- 如果你省略了 imagePullPolicy 字段,并且你為容器鏡像指定了摘要, 那么 imagePullPolicy 會自動設(shè)置為 IfNotPresent
- 如果你省略了 imagePullPolicy 字段,并且容器鏡像的標(biāo)簽是 :latest, imagePullPolicy 會自動設(shè)置為 Always
- 如果你省略了 imagePullPolicy 字段,并且沒有指定容器鏡像的標(biāo)簽, imagePullPolicy 會自動設(shè)置為 Always
- 如果你省略了 imagePullPolicy 字段,并且為容器鏡像指定了非 :latest 的標(biāo)簽, imagePullPolicy 就會自動設(shè)置為 IfNotPresent
必要的鏡像拉取
如果你想總是強制執(zhí)行拉取,你可以使用下述的一中方式:
- 設(shè)置容器的 imagePullPolicy 為 Always
- 省略 imagePullPolicy,并使用 :latest 作為鏡像標(biāo)簽; 當(dāng)你提交 Pod 時,Kubernetes 會將策略設(shè)置為 Always
- 省略 imagePullPolicy 和鏡像的標(biāo)簽; 當(dāng)你提交 Pod 時,Kubernetes 會將策略設(shè)置為 Always。
- 啟用準(zhǔn)入控制器 AlwaysPullImages
ImagePullBackOff
當(dāng) kubelet 使用容器運行時創(chuàng)建 Pod 時,容器可能因為 ImagePullBackOff 導(dǎo)致狀態(tài)為 Waiting
ImagePullBackOff 狀態(tài)意味著容器無法啟動, 因為 Kubernetes 無法拉取容器鏡像(原因包括無效的鏡像名稱,或從私有倉庫拉取而沒有 imagePullSecret)。 BackOff 部分表示 Kubernetes 將繼續(xù)嘗試?yán)$R像,并增加回退延遲
Kubernetes 會增加每次嘗試之間的延遲,直到達(dá)到編譯限制,即 300 秒(5 分鐘)
串行和并行鏡像拉取
默認(rèn)情況下,kubelet 以串行方式拉取鏡像。 也就是說,kubelet 一次只向鏡像服務(wù)發(fā)送一個鏡像拉取請求, 其他鏡像拉取請求必須等待,直到正在處理的那個請求完成
節(jié)點獨立地做出鏡像拉取的決策。即使你使用串行的鏡像拉取,兩個不同的節(jié)點也可以并行拉取相同的鏡像
如果你想啟用并行鏡像拉取,可以在 kubelet 配置 中將字段 serializeImagePulls 設(shè)置為 false
當(dāng)serializeImagePulls 設(shè)置為 false 時,kubelet 會立即向鏡像服務(wù)發(fā)送鏡像拉取請求,多個鏡像將同時被拉動
啟用并行鏡像拉取時,請確保你的容器運行時的鏡像服務(wù)可以處理并行鏡像拉取
kubelet 從不代表一個 Pod 并行地拉取多個鏡像
例如,如果你有一個 Pod,它有一個初始容器和一個應(yīng)用容器,那么這兩個容器的鏡像拉取將不會并行。 但是,如果你有兩個使用不同鏡像的 Pod,當(dāng)啟用并行鏡像拉取時,kubelet 會代表兩個不同的 Pod 并行拉取鏡像
最大并行鏡像拉取數(shù)量
特性狀態(tài): Kubernetes v1.27 [alpha]
當(dāng) serializeImagePulls 被設(shè)置為 false 時,kubelet 默認(rèn)對同時拉取的最大鏡像數(shù)量沒有限制, 如果你想限制并行鏡像拉取的數(shù)量,可以在 kubelet 配置中設(shè)置字段 maxParallelImagePulls, 當(dāng) maxParallelImagePulls 設(shè)置為 n 時,只能同時拉取 n 個鏡像, 超過 n 的任何鏡像都必須等到至少一個正在進(jìn)行拉取的鏡像拉取完成后,才能拉取
當(dāng)啟用并行鏡像拉取時,限制并行鏡像拉取的數(shù)量可以防止鏡像拉取消耗過多的網(wǎng)絡(luò)帶寬或磁盤 I/O
你可以將 maxParallelImagePulls 設(shè)置為大于或等于 1 的正數(shù)。 如果將 maxParallelImagePulls 設(shè)置為大于等于 2,則必須將 serializeImagePulls 設(shè)置為 false。 kubelet 在無效的 maxParallelImagePulls 設(shè)置下會啟動失敗
使用私有倉庫
從私有倉庫讀取鏡像時可能需要密鑰。 憑據(jù)可以用以下方式提供:
在 Pod 上指定 ImagePullSecrets
說明:
運行使用私有倉庫中鏡像的容器時,建議使用這種方法
Kubernetes 支持在 Pod 中設(shè)置容器鏡像倉庫的密鑰。 imagePullSecrets 必須全部與 Pod 位于同一個名字空間中。 引用的 Secret 必須是 kubernetes.io/dockercfg 或 kubernetes.io/dockerconfigjson 類型
使用 Docker Config 創(chuàng)建 Secret
你需要知道用于向倉庫進(jìn)行身份驗證的用戶名、密碼和客戶端電子郵件地址,以及它的主機名。 運行以下命令,注意替換適當(dāng)?shù)拇髮懼?/p>
kubectl create secret docker-registry <name> \
--docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD \
--docker-email=DOCKER_EMAIL
在 Pod 中引用 ImagePullSecrets
在創(chuàng)建 Pod 時,可以在 Pod 定義中增加 imagePullSecrets 部分來引用該 Secret。 imagePullSecrets 數(shù)組中的每一項只能引用同一名字空間中的 Secret
例如:文章來源:http://www.zghlxwxcb.cn/news/detail-570311.html
cat <<EOF > pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
namespace: awesomeapps
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey
EOF
cat <<EOF >> ./kustomization.yaml
resources:
- pod.yaml
EOF
你需要對使用私有倉庫的每個 Pod 執(zhí)行以上操作文章來源地址http://www.zghlxwxcb.cn/news/detail-570311.html
到了這里,關(guān)于【云原生】容器鏡像的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!