成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你的 Pod 是金魚嗎?Kubernetes 鏡像更新的 7 秒記憶陷阱

云計(jì)算 云原生
對(duì)于這種案例,你們的處理思路是怎么樣的呢,是否真正的處理過,如果遇到,你們應(yīng)該怎么處理。我想大多數(shù)人都沒有遇到過。

引言

對(duì)于這種案例,你們的處理思路是怎么樣的呢,是否真正的處理過,如果遇到,你們應(yīng)該怎么處理。

我想大多數(shù)人都沒有遇到過。

最后有相關(guān)的學(xué)習(xí)群,有興趣可以加入。


引言:一場(chǎng)看似“靈異”的更新事故

某個(gè)周五的深夜,A 團(tuán)隊(duì)的 DevOps 工程師小明正準(zhǔn)備上線新功能。他自信地執(zhí)行了滾動(dòng)更新命令:

kubectl set image deployment/myapp myapp=myregistry.com/app:latest

幾分鐘后,監(jiān)控系統(tǒng)突然告警:“部分用戶請(qǐng)求返回舊版數(shù)據(jù)!”

小明檢查 Pod,發(fā)現(xiàn)一些 Pod 的鏡像哈希和倉(cāng)庫(kù)中的最新鏡像不一致,仿佛舊版本代碼在集群中“陰魂不散”。

一場(chǎng)針對(duì)「鏡像鬼影」的偵查就此開始……

第一幕:鏡像鬼影的“作案手法”

1. 鏡像拉取策略的“潛規(guī)則”

Kubernetes 的 imagePullPolicy 控制鏡像拉取行為,共有三個(gè)選項(xiàng):

Always:每次創(chuàng)建 Pod 都強(qiáng)制從倉(cāng)庫(kù)拉取鏡像(無論本地是否存在)。

IfNotPresent:僅當(dāng)本地不存在該鏡像時(shí)拉取(默認(rèn)策略,“鬼影”元兇)。

Never:完全依賴本地鏡像(通常僅用于測(cè)試或離線環(huán)境)。

關(guān)鍵問題:若使用 IfNotPresent 且鏡像標(biāo)簽為 latest,當(dāng)倉(cāng)庫(kù)中的 latest 被覆蓋時(shí),節(jié)點(diǎn)本地緩存的舊版鏡像會(huì)被誤認(rèn)為“最新”

2. 標(biāo)簽覆蓋的“時(shí)空錯(cuò)亂”

CI/CD 流水線的常見錯(cuò)誤

# 每次構(gòu)建都覆蓋 latest 標(biāo)簽
docker build -t myregistry.com/app:latest .
docker push myregistry.com/app:latest

后果latest 標(biāo)簽在不同時(shí)間點(diǎn)指向不同鏡像哈希(例如昨天是 sha256:abcd,今天是 sha256:1234)。Kubernetes 僅通過標(biāo)簽名判斷是否需要更新,無法感知哈希變化

3. 滾動(dòng)更新的“認(rèn)知盲區(qū)”

Deployment 的更新邏輯:Kubernetes 通過對(duì)比 Deployment 中定義的鏡像名稱(如 myapp:latest)和當(dāng)前 Pod 使用的鏡像名稱,決定是否觸發(fā)更新。

致命漏洞: 如果節(jié)點(diǎn)本地已緩存同名標(biāo)簽的舊鏡像,新調(diào)度的 Pod 會(huì)直接使用本地緩存,導(dǎo)致集群中新舊版本共存

第二幕:根因偵查——技術(shù)細(xì)節(jié)全解

1. 復(fù)現(xiàn)路徑:一場(chǎng)“量子態(tài)”的部署

圖片圖片

2. 驗(yàn)證實(shí)驗(yàn):親手制造“鬼影”

步驟 1:初始部署

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: myapp
        image: myregistry.com/app:latest
        imagePullPolicy: IfNotPresent  # 默認(rèn)配置
EOF

步驟 2:推送新鏡像并更新

docker build -t myregistry.com/app:latest .
docker push myregistry.com/app:latest
kubectl set image deployment/myapp myapp=myregistry.com/app:latest

步驟 3:檢查 Pod 鏡像哈希

kubectl get pods -o jsnotallow='{range .items[*]}{.metadata.name}{"\t"}{.status.containerStatuses[0].imageID}{"\n"}{end}'
# 輸出可能為:
# pod-1   myregistry.com/app:latest@sha256:abcd
# pod-2   myregistry.com/app:latest@sha256:1234
# pod-3   myregistry.com/app:latest@sha256:abcd

第三幕:破解之術(shù)——徹底消滅鬼影

方案一:標(biāo)簽唯一化(治本之策)

操作步驟

1. 為每次構(gòu)建生成唯一標(biāo)簽

COMMIT_SHA=$(git rev-parse --short HEAD)
docker build -t myregistry.com/app:$COMMIT_SHA .
docker push myregistry.com/app:$COMMIT_SHA

2. 更新 Deployment 引用明確版本

containers:
  - name: myapp
    image: myregistry.com/app:abc123  # 使用 Git Commit SHA
    imagePullPolicy: IfNotPresent    # 此時(shí)策略安全

優(yōu)點(diǎn)

? 徹底避免標(biāo)簽覆蓋問題。

? 天然支持版本回滾和審計(jì)。

方案二:強(qiáng)制拉取鏡像(應(yīng)急方案)

適用場(chǎng)景:必須使用 latest 標(biāo)簽時(shí)。操作步驟

1. 修改 Deployment 配置

containers:
  - name: myapp
    image: myregistry.com/app:latest
    imagePullPolicy: Always  # 強(qiáng)制每次拉取

2. 觸發(fā)滾動(dòng)更新

kubectl rollout restart deployment/myapp

注意事項(xiàng)

? 可能增加部署時(shí)間(每次拉取鏡像)。

? 需確保鏡像倉(cāng)庫(kù)訪問權(quán)限和網(wǎng)絡(luò)穩(wěn)定性。

方案三:清理節(jié)點(diǎn)緩存(終極武器)

操作步驟

1. 手動(dòng)清理節(jié)點(diǎn)鏡像緩存

# 登錄到節(jié)點(diǎn)執(zhí)行
docker rmi myregistry.com/app:latest

2. 自動(dòng)清理(慎用)

# 使用 kubectl 在所有節(jié)點(diǎn)執(zhí)行命令(需權(quán)限)
kubectl get nodes -o name | xargs -I{} kubectl debug node/{} --image=alpine -- rm -rf /var/lib/docker/image/overlay2/repositories.json

風(fēng)險(xiǎn)提示

? 可能影響其他服務(wù)的正常運(yùn)行。

? 推薦在維護(hù)窗口期操作。

第四幕:防御工事——預(yù)防鬼影再現(xiàn)

1. 基礎(chǔ)設(shè)施加固

啟用鏡像倉(cāng)庫(kù)的不可變標(biāo)簽(Immutable Tags):多數(shù)鏡像倉(cāng)庫(kù)(如 AWS ECR、Harbor)支持標(biāo)簽不可變?cè)O(shè)置,禁止覆蓋已存在的標(biāo)簽。

鏡像簽名與驗(yàn)簽:使用 Cosign[1] 對(duì)鏡像簽名,并在 Kubernetes 中集成驗(yàn)簽策略:

# 簽名鏡像
cosign sign --key mykey.pem myregistry.com/app:abc123

# 驗(yàn)簽策略(需部署 Kyverno 或 OPA Gatekeeper)
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: check-image-signature
spec:
  validationFailureAction: enforce
  rules:
    - name: verify-image-signature
      match:
        resources:
          kinds:
            - Pod
      verifyImages:
        - image: "myregistry.com/app:*"
          key: |-
            -----BEGIN PUBLIC KEY-----
            YOUR_PUBLIC_KEY
            -----END PUBLIC KEY-----
2. 監(jiān)控與告警

Prometheus 監(jiān)控鏡像版本一致性:通過 kube-state-metrics 采集 Pod 鏡像哈希,配置告警規(guī)則:

- alert: ImageHashMismatch
  expr: |
    count by (deployment) (
      kube_pod_container_info{cnotallow="myapp"} 
      unless on(image) kube_deployment_spec_template_container_image{cnotallow="myapp"}
    ) > 0
  annotations:
    summary: "鏡像哈希不一致:{{ $labels.deployment }}"

Grafana 可視化面板:展示各 Deployment 的 Pod 鏡像哈希分布,快速發(fā)現(xiàn)“鬼影”。

3. 文化規(guī)范:團(tuán)隊(duì)的“防鬼影”守則

禁止使用 latest 標(biāo)簽:在 CI/CD 流程中強(qiáng)制檢查,拒絕推送 latest 標(biāo)簽。

部署前預(yù)檢查腳本

# 檢查 Deployment 是否使用 latest 標(biāo)簽
if kubectl get deployment myapp -o jsnotallow='{.spec.template.spec.containers[0].image}' | grep -q ":latest"; then
  echo "錯(cuò)誤:禁止使用 latest 標(biāo)簽!"
  exit 1
fi

定期培訓(xùn)與攻防演練:模擬鏡像鬼影場(chǎng)景,訓(xùn)練團(tuán)隊(duì)快速定位和修復(fù)問題。

尾聲:鬼影退散,天下太平

通過唯一標(biāo)簽、強(qiáng)制拉取策略、鏡像簽名和監(jiān)控告警的四重防護(hù),A 團(tuán)隊(duì)終于告別了“鏡像鬼影”。小明在事后復(fù)盤會(huì)上感嘆:“原來 Kubernetes 不是玄學(xué),只是我們對(duì)它的‘潛規(guī)則’了解太少!”

附:快速診斷命令清單

1. 查看 Pod 鏡像哈希

kubectl get pods -o jsnotallow='{range .items[*]}{.metadata.name}{"\t"}{.status.containerStatuses[0].imageID}{"\n"}{end}'

2. 對(duì)比倉(cāng)庫(kù)鏡像元數(shù)據(jù)

docker manifest inspect myregistry.com/app:latest | grep sha256

3. 強(qiáng)制刪除節(jié)點(diǎn)緩存鏡像

# 進(jìn)入節(jié)點(diǎn) Shell
kubectl debug node/<node-name> -it --image=alpine
# 在節(jié)點(diǎn)內(nèi)執(zhí)行
crictl rmi myregistry.com/app:latest

從此,集群再無鬼影,工程師們終于可以安心喝咖啡了 ??。

結(jié)語(yǔ)

以上就是我們今天的內(nèi)容,希望可以幫助到大家。

引用鏈接

[1] Cosign: https://github.com/sigstore/cosign

責(zé)任編輯:武曉燕 來源: 云原生運(yùn)維圈
相關(guān)推薦

2023-02-09 16:47:34

KubernetesPod優(yōu)先級(jí)

2021-06-07 12:40:34

Python代碼陷阱

2022-12-27 14:52:31

Kubernetes云原生開發(fā)

2023-10-19 19:42:25

IstioPodkubernetes

2024-06-04 14:08:51

2020-04-17 14:25:22

Kubernetes應(yīng)用程序軟件開發(fā)

2022-03-17 18:26:42

微前端

2011-08-03 09:00:54

JavaJava 7

2024-06-19 09:33:05

2021-07-08 23:53:44

Go語(yǔ)言拷貝

2023-12-22 16:48:00

Kubernetes容器集群

2018-11-18 16:31:14

Kubernetes監(jiān)控容器

2018-12-29 14:14:32

2020-01-14 17:02:20

Windows 7Windows 10微軟

2023-03-06 00:24:05

Kubernetes項(xiàng)目開源

2012-12-21 16:57:37

手機(jī)安全個(gè)人信息泄漏個(gè)人信息安全

2020-07-28 10:32:56

云計(jì)算容器Kubernetes

2017-12-19 15:20:47

代碼應(yīng)用架構(gòu)

2018-06-22 08:13:21

2021-11-22 08:00:00

Kubernetes容器集群
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 精品国产精品国产偷麻豆 | av电影一区 | 国产男女精品 | 精品视频一区二区三区四区 | 亚洲福利在线观看 | 成人欧美一区二区三区在线播放 | 国产精品视频导航 | av网站免费| 91在线电影| 亚洲一区精品在线 | 亚洲成网 | 欧美一区免费 | 亚洲社区在线 | 欧美中文一区 | 欧美h版| 国产大片一区 | 国产乱精品一区二区三区 | 怡红院怡春院一级毛片 | 久久一二 | 欧美2区 | 日韩欧美在线观看 | jlzzjlzz国产精品久久 | 欧美日韩一区二区在线 | 国产美女自拍视频 | 手机日韩 | 日日夜夜天天久久 | 国产一区二区在线视频 | 国产精品精品久久久 | 久草网站 | 国产精品污污视频 | 久久男人 | 久久噜噜噜精品国产亚洲综合 | 日韩有码在线播放 | 久久久精品一区二区三区 | 日韩国产在线观看 | 国产一区二区三区久久久久久久久 | 日本不卡一区二区 | 欧美日韩在线看 | 黄色免费在线观看网址 | 国产福利在线免费观看 | 亚洲高清av |