
ในการ 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/