การซื้อบัญชี Google Cloud: Pods มักรายงานไปยัง ImagePullBackOff / ErrImagePull
ในการเปิดตัว 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 ส่วนใหญ่สามารถค้นหาและแก้ไขได้ภายในไม่กี่นาที
