--- title: kindでLocal RegistryをTLSを有効にして使用するメモ tags: ["Kubernetes", "kind", "TLS"] categories: ["Dev", "CaaS", "Kubernetes", "kind"] date: 2021-10-05T06:47:56Z updated: 2021-10-05T16:20:07Z --- kindでLocal Registryを使用するために以下のドキュメントを試しても、HTTPSにしないとImageをPullできなかったので、kind + Local RegistryをTLSを有効にして使用するメモ。 https://kind.sigs.k8s.io/docs/user/local-registry/ わざわざHarborを立てるほどでもない検証用。 ### 自己署名TLS証明書の作成 用意したスクリプトを使用して証明書を生成します。 ```bash mkdir certs curl -sL https://gist.github.com/making/92dc4c3ab7ee7be8a31f5f8345c6df88/raw/f0e651a59db630f45d202b8f8d72191d98eee643/generate-certs.sh > certs/generate-certs.sh docker run --rm -v ${PWD}/certs:/certs hitch bash /certs/generate-certs.sh registry ``` 生成されたサーバ証明書を確認します。 ``` $ openssl x509 -in certs/server.crt -noout -text Certificate: Data: Version: 3 (0x2) Serial Number: 0c:9a:17:5f:58:9d:a6:c7:85:28:53:5a:53:eb:46:ec:8c:e9:41:de Signature Algorithm: sha256WithRSAEncryption Issuer: CN=@making, O=IK.AM, C=JP Validity Not Before: Oct 4 16:53:55 2021 GMT Not After : Oct 2 16:53:55 2031 GMT Subject: CN=registry Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:d0:86:30:37:5d:a4:99:5c:95:2c:01:12:44:e3: a5:bc:45:74:24:c2:df:0d:ee:ba:6f:32:9b:6e:50: 79:4a:55:ff:84:dd:1a:4e:c1:34:c5:15:05:c7:01: b4:24:af:f0:fe:47:16:c5:27:e4:51:38:78:b0:eb: 56:5b:87:bb:4e:fa:11:e3:6a:34:1e:89:47:a1:db: eb:a0:95:8f:5e:24:24:dd:ef:6b:b0:0e:6f:69:9e: 03:b7:bf:98:46:47:13:64:f0:b5:27:a8:aa:d8:37: fa:2c:bc:f1:d7:83:3b:67:91:1f:74:c4:1a:7f:57: 43:82:ad:21:0e:2b:66:fe:6a:c0:f7:56:19:f6:93: eb:51:2e:a7:8d:28:10:c4:bf:04:0b:60:55:6a:c7: f5:19:5e:29:f4:89:40:bd:81:a0:a6:1f:50:ea:12: 24:95:46:23:82:83:4e:d4:31:88:34:8b:20:77:ec: 22:33:7d:77:1b:cc:ca:dd:c1:36:e8:99:36:57:be: 14:1d:8f:80:a7:8f:60:b0:ce:f7:a8:16:79:8f:28: 70:ae:46:32:80:bb:f1:89:d1:56:3c:e8:32:02:26: 49:04:5b:df:0b:70:52:1e:5c:fe:09:92:ae:bf:cd: 36:c9:04:24:65:bf:d0:cc:85:db:85:74:48:df:60: 9d:75 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Non Repudiation, Key Encipherment X509v3 Subject Alternative Name: DNS:registry, DNS:*.registry, DNS:localhost Signature Algorithm: sha256WithRSAEncryption 87:e4:6a:af:f8:21:3a:90:f2:8c:55:68:39:d4:15:61:7f:77: 8b:19:28:25:15:b4:62:cc:25:47:46:77:4a:74:4d:72:a2:11: d9:23:80:78:f6:d7:e4:81:83:1b:c9:34:3c:7e:fc:3c:81:90: bd:4d:51:29:e2:88:74:a9:18:bb:06:70:4d:a3:7b:44:81:b3: 16:23:b2:b9:fd:44:89:f2:d7:6e:8b:33:ca:2e:34:d6:23:95: ff:da:39:5a:23:76:e3:5e:21:67:9f:00:0a:1f:0b:31:83:1e: ef:a2:8c:ca:45:42:d3:8e:ef:c6:22:5a:e6:a6:7b:08:02:e2: e3:db:1d:f6:08:53:9c:ac:5d:26:d4:6e:27:6d:f2:c2:82:9d: 4a:7f:ec:02:ea:a0:eb:e3:0d:57:ff:36:ba:73:27:4f:5d:29: c1:f5:57:80:c1:aa:dc:2b:18:f1:f7:7f:17:2d:fa:f6:2f:4c: ae:8d:a6:59:76:27:a2:c9:b9:e7:45:6f:f6:70:fe:1f:33:bf: f5:12:4c:b2:21:5d:04:5e:83:0b:e4:d2:8b:27:09:61:a3:2d: 3b:a2:a4:14:bb:eb:95:86:ec:f2:ba:08:e9:9c:72:39:6f:9f: 83:b5:71:db:dd:be:29:04:09:04:40:08:a0:0b:17:88:d0:fb: 0d:09:4a:89 ``` SANに`locahost`、`registy`、`*.registry`を追加しています。必要に応じて`generate-certs.sh`の引数を変えてください。 この証明書を使ったRegistryに`docker login`できるようにCA証明書をOS側に信頼させます。Macの場合は次のコマンドを実行してください。 ```bash # https://blog.container-solutions.com/adding-self-signed-registry-certs-docker-mac sudo security add-trusted-cert -d -r trustRoot -k ~/Library/Keychains/login.keychain certs/ca.crt ``` Linux、Windowsの場合は [こちら](https://docs.docker.com/registry/insecure/#docker-still-complains-about-the-certificate-when-using-authentication) を参照してください。 この設定を行った後、Dockerに反映させるため、**忘れずにDockerを再起動してください**。 ### Local Registryの用意 htpasswd形式でユーザー名・パスワードを保存。 ```bash export REGISTRY_USERNAME=admin export REGISTRY_PASSWORD=password mkdir registry docker run --rm --entrypoint htpasswd httpd -Bbn ${REGISTRY_USERNAME} ${REGISTRY_PASSWORD} > registry/htpasswd ``` 作成済みのTLS証明書とhtpasswdファイルを指定してRegistryを起動 ```bash docker run -d \ --restart=always \ --name registry \ -v ${PWD}/certs:/certs \ -v ${PWD}/registry:/registry \ -e REGISTRY_AUTH=htpasswd \ -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/registry/htpasswd \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/server.key \ -p 5000:5000 \ registry:2 ``` ログインできるか確認。Dockerを再起動していない場合はログインに失敗するはずです。 ```bash $ docker login localhost:5000 -u ${REGISTRY_USERNAME} -p ${REGISTRY_PASSWORD} WARNING! Using --password via the CLI is insecure. Use --password-stdin. Login Succeeded ``` [こちらのドキュメント](https://kind.sigs.k8s.io/docs/user/private-registries/#add-credentials-to-the-nodes) を参考に、kindのNodeにRegistryの認証情報を事前に設定しておくために、設定ファイルを作成します。 ```bash cat < registry/config.json {"auths":{"localhost:5000":{"username":"${REGISTRY_USERNAME}","password":"${REGISTRY_PASSWORD}"}}} EOF ``` ### kindクラスタの作成 TLS証明書とRegistryへの認証設定ファイルをマウントした状態でkindのクラスタを作成します。 また、`localhost:5000`のRegistryに対して`registry:5000`をMirrorとして設定します。 なお、`extraPortMappings`は今回の内容と関係ないので設定しなくても良いです。 ```yaml cat < Registryへの認証設定ファイルをマウントしない場合は、kindクラスタ作成後に次のように`imagePullSecrets`を設定する必要があります。 > > ``` > kubectl create -n default secret docker-registry regcred --docker-server=https://localhost:5000 --docker-username=admin --docker-password=password -oyaml --dry-run=client | kubectl apply -n default -f- > kubectl patch -n default serviceaccount default -p "{\"imagePullSecrets\": [{\"name\": \"regcred\"}]}" > ``` 次のコマンドを実行して、設定内容が反映されていることを確認します。 ```json $ docker exec kind-control-plane crictl info | jq .config.registry { "configPath": "", "mirrors": { "localhost:5000": { "endpoint": [ "https://registry:5000" ] } }, "configs": { "registry:5000": { "auth": null, "tls": { "insecure_skip_verify": false, "caFile": "/etc/containerd/certs.d/ca.crt", "certFile": "", "keyFile": "" } } }, "auths": null, "headers": null } ``` 次のコマンドでkind用のNetworkからRegistryのコンテナにアクセスできるようにします。 ``` docker network connect kind registry ``` 次のコマンドを実行してkind内からregistryへcurlでアクセスできることを確認します。 ``` $ docker exec kind-control-plane curl -sI --cacert /etc/containerd/certs.d/ca.crt https://registry:5000 HTTP/2 200 cache-control: no-cache date: Tue, 05 Oct 2021 06:33:52 GMT ``` [こちらのドキュメント](https://kind.sigs.k8s.io/docs/user/local-registry/) にしたがってLocal Registryの情報をConfigMapに登録します。 ```yaml cat <