Dev > CaaS > Kubernetes > kind
Oct 5, 2021
Oct 5, 2021
N/A Views
MD
warning
この記事は2年以上前に更新されたものです。情報が古くなっている可能性があります。

kindでLocal Registryを使用するために以下のドキュメントを試しても、HTTPSにしないとImageをPullできなかったので、kind + Local RegistryをTLSを有効にして使用するメモ。

https://kind.sigs.k8s.io/docs/user/local-registry/

わざわざHarborを立てるほどでもない検証用。

自己署名TLS証明書の作成

用意したスクリプトを使用して証明書を生成します。

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にlocahostregisty*.registryを追加しています。必要に応じてgenerate-certs.shの引数を変えてください。

この証明書を使ったRegistryにdocker loginできるようにCA証明書をOS側に信頼させます。Macの場合は次のコマンドを実行してください。

# 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の場合は こちら を参照してください。

この設定を行った後、Dockerに反映させるため、忘れずにDockerを再起動してください

Local Registryの用意

htpasswd形式でユーザー名・パスワードを保存。

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を起動

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を再起動していない場合はログインに失敗するはずです。

$ docker login localhost:5000 -u ${REGISTRY_USERNAME} -p ${REGISTRY_PASSWORD}
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Login Succeeded

こちらのドキュメント を参考に、kindのNodeにRegistryの認証情報を事前に設定しておくために、設定ファイルを作成します。

cat <<EOF > registry/config.json
{"auths":{"localhost:5000":{"username":"${REGISTRY_USERNAME}","password":"${REGISTRY_PASSWORD}"}}}
EOF

kindクラスタの作成

TLS証明書とRegistryへの認証設定ファイルをマウントした状態でkindのクラスタを作成します。
また、localhost:5000のRegistryに対してregistry:5000をMirrorとして設定します。
なお、extraPortMappingsは今回の内容と関係ないので設定しなくても良いです。

cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    listenAddress: "0.0.0.0"
  - containerPort: 443
    hostPort: 443
    listenAddress: "0.0.0.0"
  extraMounts:
  - containerPath: /etc/containerd/certs.d/ca.crt
    hostPath: ${PWD}/certs/ca.crt
  - containerPath: /var/lib/kubelet/config.json
    hostPath: ${PWD}/registry/config.json
containerdConfigPatches:
- |-
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"]
    endpoint = ["registry:5000"]
  [plugins."io.containerd.grpc.v1.cri".registry.configs."registry:5000".tls]
    ca_file = "/etc/containerd/certs.d/ca.crt"
EOF

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\"}]}"

次のコマンドを実行して、設定内容が反映されていることを確認します。

$ 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

こちらのドキュメント にしたがってLocal Registryの情報をConfigMapに登録します。

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
  name: local-registry-hosting
  namespace: kube-public
data:
  localRegistryHosting.v1: |
    host: "localhost:5000"
    help: "https://kind.sigs.k8s.io/docs/user/local-registry/"
EOF

これでkindでLocal RegistryをTLSを有効にして使用するための設定が完了しました。

Local Registryにイメージをpushしてkindからpullする

サンプルアプリをLocal Registryにイメージをpushします。

docker pull gcr.io/google-samples/hello-app:1.0
docker tag gcr.io/google-samples/hello-app:1.0 localhost:5000/hello-app:1.0
docker push localhost:5000/hello-app:1.0

このイメージをkindにデプロイします。

kubectl run hello-app --image=localhost:5000/hello-app:1.0

PodがRunningになっていればOKです。

$ kubectl get pod
NAME        READY   STATUS    RESTARTS   AGE
hello-app   1/1     Running   0          11s
Found a mistake? Update the entry.
Share this article: