Pull image จาก Private registry ใน k8s

DevOps Nov 26, 2018

ในการ deploy application บน k8s นั้น บางครั้งเราจำเป็นต้องมีการ pull docker image มาจาก private docker registry ของเราเอง ซึ่งหากเราใส่ private  docker image ไปตรงๆ เลยเวลาสร้าง deployment ก็อาจเจอ error ImagePullBackOff ได้ เช่น

⚡ kubectl get pod
NAME                      READY     STATUS             RESTARTS   AGE 
arix-3-yjq9w              0/1       ImagePullBackOff   0          10m 

วิธีแก้ไขก็คือเราต้องสร้าง secret ก่อนเพื่อกำหนดค่าต่างๆ ของ docker-registry ลงไป แล้วค่อยนำไปเรียกใช้งาน

สมมติว่าผมจะทำการ pull image มาจาก gitlab.com นะ

สร้าง secret สำหรับ private registry ชื่อ gitlab-registry

⚡ kubectl create secret docker-registry gitlab-registry --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
  • <your-registry-server> คือ registry url เช่น https://registry.gitlab.com
  • <your-name> คือ ชื่อผู้ใช้งาน
  • <your-pword> คือ รหัสผ่าน
  • <your-email> คือ อีเมล

หลังจากใช้งานคำสั่งด้านบนแล้วก็จะได้ secret ที่ชื่อว่า gitlab-registry

⚡ kubectl get secret
NAME              TYPE                      DATA      AGE
gitlab-registry   kubernetes.io/dockercfg   1         83d

ลองขอดูรายละเอียดของ gitlab-registry

⚡ kubectl get secret/gitlab-registry --output yaml

ได้ค่าออกมาแบบนี้

apiVersion: v1
data:
  .dockerconfigjson: eyJodHRwczovL2luZGV4L ... J0QUl6RTIifX0=
kind: Secret
metadata:
  ...
  name: gitlab-registry
  ...
type: kubernetes.io/dockerconfigjson

ค่าของ .dockerconfigjson เป็นข้อมูลของเราทั้งหมด โดยมันจะถูกเข้ารหัสแบบ base64 ไว้ ดังนั้นต้องถอดรหัสค่านี้ออกมาก่อน โดยการ

⚡ echo "c3R...zE2" | base64 --decode

{"https://registry.gitlab.com":{"username":"foo","password":"bar","email":"pikanoxup@autowb.com","auth":"yJodHRwczovL2luZGV4A=="}}

วิธีการสร้าง deployment เพื่อให้เรียกใช้ secret นี้

ในการสร้าง deployment ที่จะต้อง pull image มาจาก private-registry เราสามารถกำหนดในไฟล์ได้ดังนี้

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: registry.gitlab.com/twinsyn/laravel:dev
  imagePullSecrets:
  - name: gitlab-registry

สังเกตุจาก imagePullSecrets: จะเป็นการเรียกใช้งาน secret ชื่อ gitlab-registry

Thanks: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

Arnon Kijlerdphon

IT manager & DevOps @Twin Synergy Co.,Ltd

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.