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?お金がかかるじゃないですかー!やだー!