kubernetes 学習 dockerプライベートレジストリを試す
docker プライベートレジストリを準備する
レジストリ起動
# docker run -d -p 5000:5000 registry:2
カタログ確認
# curl localhost:5000/v2/_catalog {"repositories":[]}
レジストリにログイン
# docker login 192.168.0.1:5000 Username: asdf <--- テキトーに Password: <--- テキトーに WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
テキトーなイメージをレジストリにプッシュ
$ docker push 192.168.0.1:5000/hello:1 The push refers to repository [192.168.0.1:5000/hello] d112e95421f8: Pushed 25e1bc825d55: Pushed 973acb624a5e: Pushed 9022126e4f14: Pushed 1: digest: sha256:d97e24ed75f6aad53bdf3ef48a785bbd7d67ef43ed46ba9cae0c963ade9302b2 size: 1161
カタログ確認
# curl localhost:5000/v2/_catalog {"repositories":["hello"]}
各ワーカーノードで insecure.... を登録
お試しレジストリは http なので、insecure-registries に登録
$ sudo vi /etc/docker/daemon.json { "insecure-registries":["192.168.0.1:5000"] }
docker 再起動
$ sudo systemctl restart docker
ついでに取得済みイメージを確認したり、イメージを削除も試したりするといいかもしれない。ここで docker pull できないようならpod作成にも失敗する。
$ sudo docker images $ sudo docker pull 192.168.0.1:5000/hello:1 $ sudo docker image rm 192.168.0.1:5000/hello:1 $ sudo docker images | grep 192.168.0
docker-registry シークレット作成
user/pass はテキトーに入力。
$ kubectl create secret docker-registry myregistry \ --docker-server=192.168.0.1:5000 \ --docker-username=user \ --docker-password=pass secret/myregistry created
Pull an Image from a Private Registry で試したコマンド
$ kubectl get secret myregistry --output=yaml $ kubectl delete secret myregistry $ kubectl get secret myregistry --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
pod 作成
pod マニフェスト
apiVersion: v1 kind: Pod metadata: name: hellorep labels: role: myrole spec: containers: - name: mycontainer image: 192.168.0.1:5000/hello:1 <--- イメージ imagePullSecrets: - name: myregistry <--- docker-registry シークレット名
pod 作成
$ kubectl apply -f private-hello-pod.yaml pod/hellorep created
pod 確認
$ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES hellorep 1/1 Running 0 24s 10.244.1.55 kb2 <none> <none> $ kubectl describe pod hellorep Name: hellorep : Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5s default-scheduler Successfully assigned default/hellorep to kb2 Normal Pulling 4s kubelet, kb2 pulling image "192.168.0.1:5000/hello:1"
pod 動作確認
$ curl 10.244.1.55:8080 Hello Docker World hellorep
失敗例 - レジストリにイメージがない場合
レジストリにイメージがないと、docker pull したときと同じメッセージが得られた。
$ sudo docker pull 192.168.0.1:5000/hello:1 Error response from daemon: manifest for 192.168.0.1:5000/hello:1 not found
$ kubectl describe pod hellorep Name: hellorep : Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 41s default-scheduler Successfully assigned default/hellorep to kb2 Normal BackOff 12s (x3 over 39s) kubelet, kb2 Back-off pulling image "192.168.0.1:5000/hello:1" Warning Failed 12s (x3 over 39s) kubelet, kb2 Error: ImagePullBackOff Normal Pulling 1s (x3 over 40s) kubelet, kb2 pulling image "192.168.0.1:5000/hello:1" Warning Failed 1s (x3 over 40s) kubelet, kb2 Failed to pull image "192.168.0.1:5000/hello:1": rpc error: code = Unknown desc = Error response from daemon: manifest for 192.168.0.1:5000/hello:1 not found Warning Failed 1s (x3 over 40s) kubelet, kb2 Error: ErrImagePull