WSLでDocker for WindowsのKubernetesを動かそう – オレオレアドベントカレンダー13日目

今日はまともにネタを見つけたよ

ちゃんとKubernetes(以下k8s)触らないとね、ということで今日はk8sネタ。どこのご家庭にもあるWindows10(Pro)で皆さんDocker for Windowsを動かしていると思いますが、今どきのDocker for Windowsではk8sがデプロイできます。でも、kubeadm とかどこにあるか分からなかったので、WSLにkubeadm入れてみました。

Docker for Windowsでk8sを動かす

まず、Docker for Windowsでk8sが動いていることを確認します。

一番下のExpors daemonが2375番ポート開けていることも重要です。

あとは、k8sタグで、k8sがenableになってることを確認しましょう。下の2つもonにしておくと後で楽になります。

WSL(Ubuntu18.04)にkubeadmを入れる

Ubuntu18.04なので、docker は sudo apt intall docker.io とかで入れていると思います。Docker for Windowsをdockerコマンドでコントロールするために、export DOCKER_HOST=’tcp://0.0.0.0:2375′ とかしておきましょう。

この状態でdocker ps すると、k8sのdocker群が動いていることが確認できるはずです。

$ docker ps
CONTAINER ID        IMAGE                            COMMAND                  CREATED             STATUS              PORTS               NAMES
ed7e0c5053ae        docker/kube-compose-api-server   "/api-server --kubec…"   2 hours ago         Up 2 hours                              k8s_compose_compose-api-7d95884c5-5fgbs_docker_12737958-f86d-11e8-87d0-00155d67b616_4
6172113f1e99        docker/kube-compose-controller   "/compose-controller…"   2 hours ago         Up 2 hours                              k8s_compose_compose-74649b4db6-q928x_docker_12a2dbd5-f86d-11e8-87d0-00155d67b616_3
b2a15e82e867        6f7f2dc7fab5                     "/sidecar --v=2 --lo…"   2 hours ago         Up 2 hours                              k8s_sidecar_kube-dns-86f4d74b45-h48vh_kube-system_f1d4a7fa-f86c-11e8-87d0-00155d67b616_3
7e5209150240        c2ce1ffb51ed                     "/dnsmasq-nanny -v=2…"   2 hours ago         Up 2 hours                              k8s_dnsmasq_kube-dns-86f4d74b45-h48vh_kube-system_f1d4a7fa-f86c-11e8-87d0-00155d67b616_3
af1f1484af0f        80cc5ea4b547                     "/kube-dns --domain=…"   2 hours ago         Up 2 hours                              k8s_kubedns_kube-dns-86f4d74b45-h48vh_kube-system_f1d4a7fa-f86c-11e8-87d0-00155d67b616_3
2343af8ed08a        k8s.gcr.io/pause-amd64:3.1       "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_compose-api-7d95884c5-5fgbs_docker_12737958-f86d-11e8-87d0-00155d67b616_3
2c4e640a4ba1        4261d315109d                     "/usr/local/bin/kube…"   2 hours ago         Up 2 hours                              k8s_kube-proxy_kube-proxy-9rqzq_kube-system_f1d2d8f2-f86c-11e8-87d0-00155d67b616_3
98e5cc870e62        k8s.gcr.io/pause-amd64:3.1       "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_compose-74649b4db6-q928x_docker_12a2dbd5-f86d-11e8-87d0-00155d67b616_3
e7a5045eeefd        k8s.gcr.io/pause-amd64:3.1       "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-dns-86f4d74b45-h48vh_kube-system_f1d4a7fa-f86c-11e8-87d0-00155d67b616_3
cdb7e7a77652        k8s.gcr.io/pause-amd64:3.1       "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-proxy-9rqzq_kube-system_f1d2d8f2-f86c-11e8-87d0-00155d67b616_3
ac34b12ab6fa        52920ad46f5b                     "etcd --peer-cert-fi…"   2 hours ago         Up 2 hours                              k8s_etcd_etcd-docker-for-desktop_kube-system_b963ef2441e4f3ad413332088d1c95d1_3
cef5ec5b0cb3        k8s.gcr.io/pause-amd64:3.1       "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_etcd-docker-for-desktop_kube-system_b963ef2441e4f3ad413332088d1c95d1_3
d6980c8a0637        353b8f1d102e                     "kube-scheduler --ad…"   2 hours ago         Up 2 hours                              k8s_kube-scheduler_kube-scheduler-docker-for-desktop_kube-system_ea66a171667ec4aaf1b274428a42a7cf_3
dc10b8c712eb        k8s.gcr.io/pause-amd64:3.1       "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-scheduler-docker-for-desktop_kube-system_ea66a171667ec4aaf1b274428a42a7cf_3
07ef85bb6f01        40c8d10b2d11                     "kube-controller-man…"   2 hours ago         Up 2 hours                              k8s_kube-controller-manager_kube-controller-manager-docker-for-desktop_kube-system_e64945bcaa3152099e65499365f5f136_3
cc05ba20c54b        k8s.gcr.io/pause-amd64:3.1       "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-controller-manager-docker-for-desktop_kube-system_e64945bcaa3152099e65499365f5f136_3
0a42673c40a2        e03746fe22c3                     "kube-apiserver --ad…"   2 hours ago         Up 2 hours                              k8s_kube-apiserver_kube-apiserver-docker-for-desktop_kube-system_02c5b4283f277a9f20a3e908cbf7f31e_3
5a58d20dbf74        k8s.gcr.io/pause-amd64:3.1       "/pause"                 2 hours ago         Up 2 hours                              k8s_POD_kube-apiserver-docker-for-desktop_kube-system_02c5b4283f277a9f20a3e908cbf7f31e_3

そして、おもむろにkubeadmをインストールしましょう。(2018/12/14修正: 現在kubernetes-bionicは存在せず、kubernetes-xenialを使用するしか無いです)

$ sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
$ sudo apt update
$ sudo apt install kubeadm

ここで、/mnt/c/Users/ユーザ名 の .docker と .kube ディレクトリを /home/ユーザ名にコピーしましょう。

そして以下のコマンドを実行して、Docker for Windows上のk8sにアクセスできることを確認します。

$ kubectl config use-context docker-for-desktop
Switched to context "docker-for-desktop".
$ kubectl cluster-info
Kubernetes master is running at https://localhost:6445
KubeDNS is running at https://localhost:6445/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

さて、なにかhello-world的なサービスをデプロイして見ましょう。

以下のコマンドを実行します。

$ kubectl run hello-world --image k8s.gcr.io/echoserver:1.10 --port 8080
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/hello-world created
$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8d
$ kubectl get pods
NAME                           READY   STATUS    RESTARTS   AGE
hello-world-84698b5565-mhdnx   1/1     Running   0          56s
$ kubectl get deployment
NAME          DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-world   1         1         1            1           1m

kubectl expose コマンドでサービスを外部に公開します。
kubectl get servicesで、サービスとして動いたことが分かりますね。

$ kubectl expose deployment hello-world --type NodePort
service/hello-world exposed
$ kubectl get services
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
hello-world   NodePort    10.102.98.205   <none>        8080:32307/TCP   13s
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP          8d

ではフォワードされている32307ポートへアクセスしてみましょう。

動いてる動いてる。さて、後始末までするところまでが検証です。

kubectl removeでサクサク消しましょう。deploymentとserviceを消すとpodも消えます(よく分かってない)。

$ kubectl delete deployment hello-world
deployment.extensions "hello-world" deleted
$ kubectl delete services hello-world
service "hello-world" deleted

ということで

これで、ご家庭で気軽にk8sを試せますね。

え?GKS?EKS?お金がかかるじゃないですかー!やだー!

Follow me!

Leave a Reply