KubernetesにおけるデフォルトのDockerレジストリ
コンテナイメージの取得元
背景
Kubernetesをインストールした状態で、pod(や、deployment)を作成することができる。このときに、コンテナのイメージは手動であらかじめダウンロードしていない。Kubernetesのインストールパッケージの中に膨大なコンテナイメージが含まれているはずもないので、インターネット越しに取ってきているはずである。どこから持ってきているのだろうか。
[root@master01 ~]# kubectl run nginx-pod --image=nginx W0729 10:19:46.316434 519 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client. pod/nginx-pod created
Docker Hub
結論から言うと、Docker Hubというレジストリ・サービスがあり、特に取得するレジストリを指定しない場合はそこから取ってくる*1。
Docker Hub以外のレジストリから取得する場合は明示的に指定する。試しに適当なイメージでPodを作成してみたのが次に示す例である*2。
[root@master01 ~]# kubectl run test-pod --image=quay.io/coreos/flannel:v0.12.0-amd64 pod/test-pod created [root@master01 ~]# kubectl get pod test-pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-pod 1/1 Running 0 31s 10.0.30.83 worker02 <none> <none>
quay.io/coreos/
というレジストリの場所を示す文字列が入っている。Docker Hubから取得する場合は--image=nginx
等のレジストリの場所を示す文字列は省略可能である。
配置対象のワーカノードにもイメージがpullされているのがわかる。REPOSITORY
の列を見るとquay.io/coreos/
と取得元のレジストリがわかるようになっている。
[root@worker02 ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE (略) quay.io/coreos/flannel v0.12.0-amd64 4e9f801d2217 4 months ago 52.8MB (略)
参考にしたもの
*1:直接的に書かれているものが見つけられなかったので、傍証より確認した。参考リンクの1.より「kubectlコマンドでPodを作成するには、作成するPodの情報を記述したYAML形式ファイルを用意し、それを「kubectl create」コマンドの引数として与えれば良い。たとえば、「httpd」(DockerHubで公開されている、Docker公式のApache HTTP Serverを含んだコンテナイメージ)というイメージからコンテナを作成し、そのコンテナの80番ポートに外部からアクセスできるようにするには、以下のような設定ファイル(「pod-httpd.yaml」)を用意する。」という記載があった。直接的に調べるには、kubectl runの内部的な仕組みを知る必要があるが今回は割愛した。kubectl runがdocker runを呼び出し実行しているなら、ソースコードまで追わなくてもdocker側の仕様からわかる。参考リンク2.ではP.49にdocker pullを行うとDocker Hubからイメージを取ってくる図が記載されている
*2:実際にflannelをインストールする場合はflannelのイメージをただpodとして動かすのはダメなので注意。あくまでこれは適当なコンテナイメージを指定したかったためである。flannelを入れたければ、kurbenetes.io等にある手順に従い、manifestファイルをkubectl apply -fすることでインストールする必要がある。