dockerとkubectl とminikube をWSL2で用意


以前、こちらの記事で書いた WSL (Wdinwos Subsystem Linux2) の続き。

以下をインストールして、動作確認した。
- docker
- docker hub (Docker registry)
- kubectl
- minikube (Kubernetes cluster)

docker と kubectl をインストールしたのでメモ。kubectl だけでは使えなくて、minikube, dockerhubも必要だと分かったのでそれも追加。^^;)

Docker

ここに書いてあることをそのまま実行しただけ。

なのだが、読んでいると、docker repository の用意、GPGキーの登録、などがあり、実は今まで意識していなかったrepository のシステムも勉強せねばあかんという気にもなりました。

古いものは削除。私の環境では何もインストールされていない状態でした。

sudo apt-get remove docker docker-engine docker.io containerd runc

repository を作る必要があるので、必要なライブラリをインストールして、Dockerのoffcial なGPGキーを登録する。だれがだれを認証するのか?

$ sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

素直に書かれている通り、hello-world を実行してみる。このimage はlocalにインストールされているらしい。

$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

最初、docker daemonが動いていない、と言われた。service をstart させたら事なきを得たことをメモ。

$ sudo docker run hello-world
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
See 'docker run --help'.
$ sudo service docker stop
 * Docker already stopped - file /var/run/docker-ssd.pid not found.
$ sudo service docker start
 * Starting Docker: docker

docker hub

docker hub については docker-docs-ja に解説ページがあります。特に、docker hub にimage を保存するのは下記に書かれていて、これを参考にしました。

  • docker hub にアカウントを作成します。
  • ターミナルでdocker login します。これはdocker hub にログインするコマンドです。
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: xxxyyyzzz
Password:
WARNING! Your password will be stored unencrypted in /home/xxxyyyzzz/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

確かに認証情報がファイルに書かれていました。

$ cat ~/.docker/config.json
{
        "auths": {
                "https://index.docker.io/v1/": {
                        "auth": "eHRrZDc3OnRha2VkYTIwSUd="
                }
        }
}
  • 先程のhello-world のイメージがあるとして、これにdocker hubにpushするためのタグをつけます。 ここに書かれているようにimage IDのあとには、 /: というtagにします。
$ docker images
REPOSITORY                    TAG       IMAGE ID       CREATED       SIZE
hello-world                   latest    d1165f221234   8 weeks ago   13.3kB
$ docker tag d1165f221234 user77/helloworld:v0
$ docker images
REPOSITORY                    TAG       IMAGE ID       CREATED       SIZE
hello-world                   latest    d1165f221234   8 weeks ago   13.3kB
user77/helloworld             v0        d1165f221234   8 weeks ago   13.3kB

で、push します。

$ docker push user77/helloworld:v0
The push refers to repository [docker.io/user77/helloworld]
f22b99068db9: Mounted from library/hello-world
v0: digest: sha256:1b26826f602946860c279fce658f31050cff2c596583af237d971f4629b57792 size: 525
  • docker hub のページをみると、repository に確かにimage がpush されていることを確認できました。

kubectl

続いて、kubernetes を扱いたいので、kubectl をインストールした。
素直に従えばできた。バイナリとってくるだけ。

$ curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
$ chmod +x kubectl
$ sudo mv ./kubectl /usr/local/bin/
$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}

で、これだけでは実は使い物にならない。何も設定されていない状態でした。

$ kubectl get pods
The connection to the server localhost:8080 was refused - did you specify the right host or port?
$  kubectl config view
apiVersion: v1
clusters: null
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null

解説読んでいたら、

For example, if you are intending to run a Kubernetes cluster on your laptop (locally), you will need a tool like Minikube to be installed first and then re-run the commands stated above.

と書いてありました。 minikube を入れる。

minikube

minikube を入れる。これも公式ページを参考にしました。
https://minikube.sigs.k8s.io/docs/start/

minikube インストール

これもバイナリを入れるだけ。簡単。

$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
$ sudo install minikube-linux-amd64 /usr/local/bin/minikube

動かしてみる

いざ、minikube start でcluster? を動かすのだが、実は、driver としてdocker を指定しなければならなかった。でもエラーが出る。

$ minikube start --driver=docker
😄  minikube v1.19.0 on Ubuntu 20.04
✨  Using the docker driver based on user configuration

💣  Exiting due to PROVIDER_DOCKER_NEWGRP: "docker version --format -" exit status 1: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/version: dial unix /var/run/docker.sock: connect: permission denied
💡  Suggestion: Add your user to the 'docker' group: 'sudo usermod -aG docker $USER && newgrp docker'
📘  Documentation: https://docs.docker.com/engine/install/linux-postinstall/

docker コマンドが普通のユーザで使えない、という典型的な問題に遭遇。
親切にアドバイスを書かれてあるが、その通り。docker グループの登録させる。
(https://www7390uo.sakura.ne.jp/wordpress/archives/631)

$ sudo usermod -aG docker $USER && newgrp docker

その結果、無事に動いた。

$ minikube start --driver=docker
😄  minikube v1.19.0 on Ubuntu 20.04
✨  Using the docker driver based on user configuration
👍  Starting control plane node minikube in cluster minikube
🚜  Pulling base image ...
💾  Downloading Kubernetes v1.20.2 preload ...
    > gcr.io/k8s-minikube/kicbase...: 357.67 MiB / 357.67 MiB  100.00% 1.99 MiB
    > preloaded-images-k8s-v10-v1...: 491.71 MiB / 491.71 MiB  100.00% 2.55 MiB
🔥  Creating docker container (CPUs=2, Memory=3100MB) ...
❗  This container is having trouble accessing https://k8s.gcr.io
💡  To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/
🐳  Preparing Kubernetes v1.20.2 on Docker 20.10.5 ...
    ▪ Generating certificates and keys ...
    ▪ Booting up control plane ...
    ▪ Configuring RBAC rules ...
🔎  Verifying Kubernetes components...
    ▪ Using image gcr.io/k8s-minikube/storage-provisioner:v5
🌟  Enabled addons: storage-provisioner, default-storageclass
🏄  Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default

動いている感じがする。^^)

$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:49154
KubeDNS is running at https://127.0.0.1:49154/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
$ kubectl get po -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-74ff55c5b-f2sb9            1/1     Running   0          6m29s
kube-system   etcd-minikube                      1/1     Running   0          6m36s
kube-system   kube-apiserver-minikube            1/1     Running   0          6m36s
kube-system   kube-controller-manager-minikube   1/1     Running   0          6m36s
kube-system   kube-proxy-9zvzc                   1/1     Running   0          6m29s
kube-system   kube-scheduler-minikube            1/1     Running   0          6m36s
kube-system   storage-provisioner                1/1     Running   0          6m43s
  • deployとLoadBalancer の設定をチュートリアルに従って行う。既存のimage をdeploy して service でload balancer を設定してアクセス可能にするというもの。
kubectl create deployment hello-minikube --image=k8s.gcr.io/echoserver:1.4
kubectl expose deployment hello-minikube --type=NodePort --port=8080
  • ここLoadBalancer を expose しても EXTERNAL-IP が のままでしばらくはまりました。解決方法は、別ターミナルで
minikube tunnel

を実行しておく、でした。その結果、EXTERNAL-IPが与えられました。

$ kubectl get svc
NAME              TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-minikube1   LoadBalancer   10.104.80.113   127.0.0.1     8080:31984/TCP   32m
kubernetes        ClusterIP      10.96.0.1       <none>        443/TCP          77m
  • きちんと読めてないけれどメモ。

https://kubernetes.io/docs/tutorials/hello-minikube/
https://minikube.sigs.k8s.io/docs/start/

  • 動いている minikube のAdd-On が見れました。
$ minikube addons list
  • 最後にとりあえずcluster を delete しておいた。
$ minikube delete
🔥  Deleting "minikube" in docker ...
🔥  Deleting container "minikube" ...
🔥  Removing /home/xtkd/.minikube/machines/minikube ...
💀  Removed all traces of the "minikube" cluster.

まとめ

最低限、dockerとKubernetes がWSL2で動くようになった気がする。だが、kubernetesはminikube を導入したが、Google Cloud Platform で使っていたのとは違い、LoadBalancer が簡単には動かなかった。

もっとドキュメントをしっかり読まなければならない。
- https://minikube.sigs.k8s.io/docs/drivers/docker/

今日は遅いので、もう寝ます。おじさんにはつらい。(2021.04.28 01:53)

編集メモ

  • docker hub についてのメモを追加 (2021/05/03)