Just murmur

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

如果有跑起來就算成功啦!