การซื้อบัญชี Google Cloud: Pods มักรายงานไปยัง ImagePullBackOff / ErrImagePull

เมฆ 2026-08-05 阅读 5
cloud

ในการเปิดตัว Google Kubernetes Engine (GKE) ประจำวันและการเปิดตัว CI/CD สิ่งที่ลำบากที่สุดคือบรรทัดที่น่าตื่นตาในแถบสถานะของ Pod

ErrImagePull

หรือ

ImagePullBackOff

พูดง่ายๆก็คือ

ErrImagePull

เป็นข้อผิดพลาดเฉพาะที่เกิดจากความพยายามครั้งแรกของ Kubelet ในการดึงมิเรอร์และล้มเหลวและ

ImagePullBackOff

เป็นกลไกการป้องกันตนเองของ K8s-เมื่อพบว่าไม่สามารถดึงมิเรอร์ได้มันจะเข้าสู่สถานะ "หลีกเลี่ยงการลองใหม่" (ช่วงการลองใหม่ที่เพิ่มขึ้น)

หากคุณพบปัญหานี้อย่าตกใจต่อไปนี้เป็นชุดของการกด

ไม่รวมลำดับความสำคัญจากสูงไปต่ำ

แผนการสืบสวนการต่อสู้จริงที่จัดขึ้นจะช่วยให้คุณเข้าถึงรอยโรคได้โดยตรง

ขั้นตอนที่1: การวินิจฉัยภาคสนามครั้งแรกการบันทึกข้อผิดพลาดอย่างแม่นยำ

การเดาสิทธิ์หรือเครือข่ายแบบสุ่มสี่สุ่มห้าเป็นการเสียเวลาก่อนอื่นให้รับข้อมูลข้อผิดพลาดโดยตรงที่บันทึกโดย Kubernetes ผ่านบรรทัดคำสั่ง

1.ดูเหตุการณ์ Pod (Events)

เรียกใช้คำสั่งต่อไปนี้และดึงไปที่มุมมองสุดท้าย

เหตุการณ์

บล็อก:

แบช

Kubectl descripbe pod <pod-name> -n <namespace>

ระวัง

ล้มเหลว

ผลลัพธ์เฉพาะของเหตุการณ์มักจะเปิดเผยโดยตรง:

ไม่รู้ตัวหรือไม่พบ: เส้นทาง/แท็กมิเรอร์เขียนผิดหรือไม่มีอยู่ในคลังสินค้าเลย

PermissionDenied หรือ Unauthorized: สิทธิ์ IAM ไม่เพียงพอโหนดไม่สามารถผ่านคลังสินค้าได้

เชื่อมต่อหรือ i/o timeout: เครือข่ายไม่สามารถเข้าถึงได้ (พบได้ทั่วไปในการบล็อกคลัสเตอร์ส่วนตัวหรือไฟร์วอลล์)

ขั้นตอนที่2: การตรวจสอบและแก้ไขสาเหตุหลัก5ประการ

จากประสบการณ์ของสภาพแวดล้อมการผลิตมากกว่า90% ของความล้มเหลวในการดึงกระจก GKE เกิดจากสาเหตุ5ประการต่อไปนี้:

1.เส้นทางกระจกหรือแท็กสะกดผิด (ข้อผิดพลาดระดับต่ำที่พบบ่อยที่สุด)

รูปแบบเส้นทางค่อนข้างเข้มงวดหลังจากบริการมิเรอร์ Google Cloud เปลี่ยนไปใช้ Artifact Registry (GAR):

Plaintext

[REGION]-docker.pkg.de v/[PROJECT-ID]/[REPOSITORY]/[IMAGE]:[TAG]

# ตัวอย่าง: asia-east1-docker.pkg.dev/my-gcp-project/my-repo/my-app:v1.0.0

การแก้ไขปัญหาและการซ่อมแซม:

ตรวจสอบการสะกด: ตรวจสอบ

คำนำหน้าภูมิภาค (เช่น asia-east1) รหัสรายการชื่อคลังสินค้าและชื่อมิเรอร์มีข้อผิดพลาดในการสะกดตัวอักษรหรือไม่

ตรวจสอบว่ามีแท็กอยู่หรือไม่: เรียกใช้ gcloud ในเทอร์มินัลเพื่อตรวจสอบว่าเวอร์ชันมิเรอร์มีอยู่จริงในระบบคลาวด์: Bashgcloud artifacts docker images list asia-east1-docker.pkg.dev/my-project/my-repo

ให้ความสนใจกับความแปรปรวนของแท็ก: หากคลังสินค้าของคุณเปิด "แท็กความแปรปรวนของแท็ก" การส่งแท็กที่มีชื่อเดียวกันจะล้มเหลวซึ่งจะทำให้คลัสเตอร์ไม่สามารถดึงมิเรอร์ล่าสุดได้

2.สิทธิ์ GCP IAM ไม่เพียงพอ (Service Account ไม่ได้รับอนุญาต)

เมื่อโหนด GKE (Node) ขอให้ Artifact Registry ดึงมิเรอร์ก็อาศัย

บัญชีบริการ GCP (บัญชีบริการ Node) ที่ผูกไว้กับโหนดพูล

แทนที่จะเป็น Workload Identity จากบัญชีส่วนตัวหรือ Pod ของคุณ

หากคุณใช้บัญชีบริการเริ่มต้นเมื่อสร้างพูลโหนด GKE หรือใช้บัญชีบริการที่กำหนดเองแต่ไม่ได้รับสิทธิ์ในการอ่านของ Artifact Registry คุณจะรายงาน

PermissionDenied

การแก้ไขปัญหาและการซ่อมแซม:

รับบัญชีบริการที่ใช้โดยคลัสเตอร์โหนดพูล: Bashgcloud container node-pools descripbe <node-pool-name> \-cluster <cluster-name> \-zone <zone> \-format = "value(config. serviceAccount)"

ให้สิทธิ์การอ่าน Artifact Registry แก่บัญชีบริการ (Artifact Registry Reader / roles/artifactregistry.reader):Bashgcloud projects add-iam-policy-binding <PROJECT-ID> \ -- member = "บัญชีบริการ:<NODE-SERVICE-ACCOUNT-EMAIL>" \-roele = "rostone"

* (หมายเหตุ: หากคลัสเตอร์ GKE ของคุณอยู่ในโครงการ A และคลังสินค้ามิเรอร์อยู่ในโครงการ B ให้แน่ใจว่าอยู่ในโครงการ B (คลังสินค้า

โครงการ) *

ให้สิทธิ์ Artifact Registry Reader แก่บัญชีบริการโหนดของโครงการ A!)

3.การเชื่อมต่อเครือข่ายส่วนตัว (Private GKE Networking Issue)

หากคุณใช้

คลัสเตอร์ส่วนตัว GKE (Private Cluster)

โหนดไม่มีที่อยู่ IP เครือข่ายสาธารณะหากคลัสเตอร์ไม่ได้กำหนดค่าการส่งออกเครือข่ายภายนอกหรือเปิดการเข้าถึง Google ส่วนตัวโหนดจะไม่สามารถเชื่อมต่อได้

* .Pkg.de v

ดาวน์โหลดกระจก

การตรวจสอบและแก้ไข:

หากคุณกำลังดึงอิมเมจภายในของ Google (Artifact Registry): คุณต้องเปิด Private Google Access (Private Google Access) ในเครือข่ายย่อยเพื่อให้การเข้าชมสามารถเข้าถึง GAR ได้โดยตรงผ่านเครือข่ายภายในของ Google โดยไม่ต้องผ่านเครือข่ายสาธารณะ Bashgcloud compute networks subnetts update <SUBNET-NAME> \ -- region <REGION> \ -- enable-private-google-access

หากคุณดึงมิเรอร์ภายนอก (เช่น Docker Hub, GitHub Packages): โหนดส่วนตัวต้องใช้ Cloud NAT เพื่อเข้าถึงเครือข่ายภายนอกตรวจสอบให้แน่ใจว่าคุณได้กำหนดค่าเกตเวย์ Cloud NAT ที่ถูกต้องใน VPC และภูมิภาคที่คลัสเตอร์ตั้งอยู่

4.ดึงข้อมูลส่วนตัวจากคลังสินค้าของบุคคลที่สามที่หายไป imagePullSecrets

หากมิเรอร์ของคุณถูกเก็บไว้ในคลังสินค้าส่วนตัวของบุคคลที่สาม (เช่น Harbor ที่สร้างขึ้นเอง, Docker Hub ส่วนตัว, GitLab Registry ฯลฯ) โหนด GKE จะไม่สามารถใช้การยืนยันตัวตนในตัว GCP ได้

การตรวจสอบและแก้ไข:

สร้างคีย์ Docker ที่สอดคล้องกันใน K8s: bashkubectl create secret docker-registry my-registry-key \ -- docker-server =<YOUR-PRIVATE-REGISTRY> \ -- docker-username = <USockNAME> \ --

อ้างอย่างชัดเจนใน Deployment / Pod YAML secret:YAMLspec: imagePullSecr

Ets:-name: my-registry-key containers: - name: my-app image: your-registry.com/team/app:v1

5.ทรัพยากรเกินขีดจำกัดหรือปัญหาโควต้าโครงการ (บริการถูกปิดใช้งานเนื่องจากบัญชีค้างชำระ)

บางครั้งปัญหาไม่ได้อยู่ที่การกำหนดค่า K8s แต่อยู่ที่ฐานโครงสร้างพื้นฐานหากโครงการ GCP พบข้อจำกัดโควต้าการล็อกโควต้าหรือที่พบบ่อยที่สุด-

การเติมเงินบัญชี Google Cloud

GCP จะระงับหรือจำกัดบริการ API บางอย่างชั่วคราว (รวมถึงแบนด์วิดท์การดาวน์โหลดหรือความสามารถในการเข้าถึงพื้นที่เก็บข้อมูลของ Artifact Registry)

การตรวจสอบและแก้ไข:

ไปที่ GCP Console เพื่อดูหน้า Billing (การเรียกเก็บเงิน) เพื่อให้แน่ใจว่าบัญชีการชำระเงินอยู่ในสถานะปกติ

ตรวจสอบให้แน่ใจว่าช่องทางการเติมเงินบัญชี Google Cloud ของบริษัทไม่ถูกปิดกั้นและหลีกเลี่ยงการลดระดับบริการอัตโนมัติที่เกิดจากบัตรเครดิตหมดอายุหรือวงเงินงบประมาณซึ่งจะทำให้การทำกระจก Pod ออนไลน์หมดเวลาหรือปฏิเสธการเชื่อมต่อ

ขั้นตอนที่3: คำแนะนำในการตรวจสอบและป้องกันอย่างรวดเร็ว

หลังจากการซ่อมแซมเสร็จสิ้นคุณสามารถบังคับให้ Kubernetes ดึงการตรวจสอบกระจกอีกครั้งโดยใช้คำสั่งต่อไปนี้:

แบช

# แผน A: ลบ Pod ที่มีข้อผิดพลาดและปล่อยให้ Deployment สร้างใหม่โดยอัตโนมัติ

Kubectl delete pod <pod-name> -n <namespace>

# แผน B: รีบูต Deployment โดยตรง

Kubectl rollout restart deployment <deployment-name> -n <namespace>

คำแนะนำแนวทางปฏิบัติที่ดีที่สุด:

หลีกเลี่ยง: แท็ก latest: ใช้หมายเลขเวอร์ชันคงที่หรือ Git Commit SHA เป็นแท็กเพื่อป้องกันไม่ให้ Kubelet ดึงเวอร์ชันที่ไม่คาดคิดเนื่องจากกลไกการแคช

เปิดแคชมิเรอร์หรือสตรีมรูปภาพในสภาพแวดล้อมการผลิต: สำหรับมิเรอร์ขนาดใหญ่คุณสามารถเปิดใช้งานฟังก์ชันสตรีมรูปภาพบน GKE ซึ่งช่วยลดระยะเวลาเริ่มต้นของ Pod และระยะเวลารอคอยการดาวน์โหลดมิเรอร์ได้อย่างมาก

กลไก CI/CD เสียง: ก่อนที่สายการประกอบจะอัปเดต Manifest ให้เพิ่มการตรวจสอบการมีอยู่ของภาพ (Image Existence Check) เพื่อหลีกเลี่ยงการปรับใช้ ImagePullBackOff เนื่องจากการผลักมิเรอร์สำเร็จจากแหล่งที่มา

ตามตรรกะข้างต้นเพื่อตรวจสอบทีละขั้นตอนข้อผิดพลาดในการดึงกระจก GKE ส่วนใหญ่สามารถค้นหาและแก้ไขได้ภายในไม่กี่นาที

cloud
← 返回新闻中心