筆者有在用 Docker 還有 k8s,因為有要從 k8s 上將映像檔 (image) 拉下來佈署的需求,所以有自建 docker registry:2。
因為自行建立的 docker registry 沒有支援 SSL(TLS),所以需要在 k8s 的主機中在 Docker 底下的 daemon.json 中加入:
{
"insecure-registries" : ["registry.example.com:5000"]
}
才能在目的端將連線到自建的 Docker registry 把 Image 拉下來。但因為 k8s 具備擴充性,可以隨時加開主機,所以我不可能每一台機器都去改一次,因此研究如何在 Docker registry 中加入 TLS 連線,就不須上述設定,直接在 k8s 的 yaml 中指定自建的 docker regsitry 即可使用。
Let’s encrypt 憑證
如果你已經有憑證,可以跳過這段。
我們先用 let’s encrypt 簽署憑證,筆者是用 certbot 配合 DNS 驗證來取得憑證,如果你不想打指令的話,可以用 SSL for Free 來取得憑證。
Certbot
Certbot 就不多做介紹,我們透過 DNS 驗證的方式,指令 (請把 example.com 換成你的 docker registry 網址):
# certbot certonly --manual --preferred-challenges dns --domain example.com
[略]
(請把下列的 TXT 紀錄加到你的 DNS 紀錄裡面)
- - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:
-1LsPNYfEPu-lKQlcCIUWudsEwxecwETUA4-f9PbvSQPuto
Before continuing, verify the record is deployed.
- - - - - - -- - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
Waiting for verification...
Cleaning up challenges
IMPORTANT NOTES:
- Congratulations!
[略]
上方的指令會請你手動輸入 TXT 紀錄,如果你使用的是 Gandi.net 的網域名稱,並且使用 LiveDNS 名稱伺服器 (預設),您可以參考 使用自動驗證 DNS 紀錄 的方法。
完成後你會在 /etc/letsencrypt/live/example.com/ 中有 fullchain.pem、privkey.pem、cert.pem 與 chain.pem。
我們要用到的是 fullchain.pem (包含憑證與中繼憑證) 與 privkey.pem,但因為這幾個檔案預設是連結:
lrwxrwxrwx. 1 root root 36 Aug 6 13:01 cert.pem -> ../../archive/example.com/cert1.pem
lrwxrwxrwx. 1 root root 37 Aug 6 13:01 chain.pem -> ../../archive/example.com/chain1.pem
lrwxrwxrwx. 1 root root 41 Aug 6 13:01 fullchain.pem -> ../../archive/example.com/fullchain1.pem
而我們需要使用在 Docker 裡面,所以我們需要另存成實體檔案:
# cd /etc/letsencrypt/live/example.com
# cat fullchain.pem > pfullchain.pem
# cat privkey.pem > pprivkey.pem
Docker Registry + SSL (TLS)
憑證產生好之後,只要透過環境變數指定給 Docker Registry 即可:
# docker run -d \
-p 5000:5000 \
--restart=always \
--name registry2 \
-v /home/docker-storage:/var/lib/registry \
-v /etc/letsencrypt/live/example.com:/certs \
-e REGISTRY_HTTP_HOST=https://docker.example.com \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/pfullchain.pem \
-e REGISTRY_HTTP_TLS_KEY=/certs/pprivkey.pem \
registry:2
接只把你的 Image 打上 tag 就可以推送進去:
# docker tag image-hash example.com:5000/project:v1
# docker push example.com:5000/project:v1
參考資料
- https://blog.csanchez.org/2017/05/23/docker-registry-with-lets-encrypt-certificate/
- https://gist.github.com/PieterScheffers/63e4c2fd5553af8a35101b5e868a811e
- https://gadelkareem.com/2018/10/23/deploy-a-docker-registry-with-letsencrypt-certificates-on-ubuntu-18-04/
- https://gadelkareem.com/2018/10/23/deploy-a-docker-registry-with-letsencrypt-certificates-on-ubuntu-18-04/
- https://docs.gandi.net
- https://docs.docker.com/registry/deploying/
在〈使用 Let’s Encrypt 建立 TLS 的 Docker Registry〉中有 6 則留言
考慮把網站字體放大一點嗎!XD
測試留言,希望這次會過>”<
大大你好,
因為我上次調整之後我發現內文竟然比 h2 還大, 所以只好放棄調整, 大大有範例嗎?
謝謝
我覺得內建 2019 就很好用拉~ 最近 2020 的主題也在準備了!評價好像也不錯~ https://make.wordpress.org/core/2019/09/06/introducing-twenty-twenty/
請問 k8s 裏要怎麼設定,create pod 時,才從沒有 enable TLS 的 registry server pull image? 謝謝!!
編輯 /etc/docker/daemon.json
把你的 docker registry server ip 放到 “insecure-registries” 中:
{ “insecure-registries” : [ “172.30.0.0/16” ], “data-root”: “/home/docker” }
ok 了,謝謝