tjtjtjのメモ

自分のためのメモです

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