Kubernetes 透過自建的 Docker Registry 取得 Image
因為 image 放到 Docker Hub 太危險也不符公司資安規定,所以在用 Kubernetes 前,最好還是有個自己的 Docker Registry,不然還要自己手動把每個 image 放到每個 node,太麻煩!
自建 Docker Registry
網路上資料很多,不過其實也沒有很麻煩,官網的 Deploying a registry server 最詳細,只是我覺得順序或排版看得不太順。以下是參考其他文章後建置的順序:
建立自簽憑證
因為是在 VM 上測試,所以暫時用自簽憑證解決,有憑證才能遠端存取。這裡的步驟主要是參考這篇文章
$ mkdir -p /opt/registry/certs
$ cd /opt/registry/certs
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt
產生憑證過程的資料可以隨便填,不過 Common Name 這個要填 Domain Name,在這邊測試時是填 master.kubernetes
複製憑證
如果是自簽憑證,那這個步驟在每個會用到 Docker 服務的機器都要做,這樣才能正確登入 Docker Registry。
$ mkdir /etc/docker/certs.d/master.kubernetes:5000/
$ cp domain.crt /etc/docker/certs.d/master.kubernetes:5000/ca.crt
建立帳號密碼
這個步驟是建立遠端存取時的帳號密碼,這邊是用 htpasswd 建立帳號是 admin,密碼是 123456 的使用者
$ mkdir /opt/registry/auth
$ cd /opt/registry/auth
$ docker run --entrypoint htpasswd registry:2 -Bbn admin 123456 >> htpasswd
啟動 Docker Registry
$ mkdir /opt/registry/data
$ docker run -d -p 5000:5000 --restart=always --name registry -v /opt/registry/data:/var/lib/registry -v /opt/registry/certs:/certs -v /opt/registry/auth:/auth -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -e REGISTRY_AUTH=htpasswd -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry:2
測試
$ docker login master.kubernetes:5000
Kubernetes 從自建的 Docker Registry 取得 Image
建好 Docker Registry 後,理論上參考 Kubernetes 的 Pull an Image from a Private Registry 應該就行了,可是照著做沒有成功。最後是參考 Using a private Docker Registry with Kubernetes 這篇。
####建立 Secret
首先執行 docker login
後,會產生 ~/.docker/config.json
,這個檔,裡面存的是登入相關的資料。接著執行下列指令取得其 base64 編碼的值:
$ cat ~/.docker/config.json | base64 | tr -d \\n
接下來是產生 YAML 檔案,內容如下:
apiVersion: v1
kind: Secret
metadata:
name: regsecret
data:
.dockerconfigjson: <前一步驟 base64 編碼後的值>
type: kubernetes.io/dockerconfigjson
然後產生 Secret
$ kubectl create -f my-secret.yaml
####測試 建立一個從 Docker Registry 取出 Image 的 Deployment 來測試,YAML 檔如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: test-deployment
spec:
template:
metadata:
name: test-deployment
spec:
containers:
- image: master.kubernetes:5000/test-image:1
name: test-container
imagePullSecrets:
- name: regsecret
建立 Deployment
$ kubectl create -f my-deployment.yaml
如果有跑起來就算成功啦!