microk8s@macOSでhello worldしようとおもったらハマった
TL;DR: microk8sを使ってk8sの勉強がてらつらつら書いていくその第一回のつもりだったんだけど、microk8sがmacOS Catalinaではまだ全部の機能がちゃんと動かなかったというオチ。
数多く存在するエコシステムで何がトレンドなのか全然分からない。なので勉強していく中で古かったり的外れなものを選ぶ可能性がある
こう書いたんだけど、まさか初手から間違えるとは思ってなかった。 文章書くのも含めて二時間強くらい費やしたのでしょうもないけど、もったいないのでとりあえず公開する。
背景
仕事でk8sを使うのが本格化しそうなのでそろそろちゃんと勉強していかないとまずそうになってきた。 同僚に聞けばいろいろ教えてくれるんだろうけど、彼らの時間を使うのも悪いのである程度基本的なことは 自分で抑えておかないとってことでちょっとずつ勉強していこうと思う。
クラスタを運用するとかよりはまずは利用する側(そのうち運用側も勉強しないとだけど)なのでローカルで k8sの概念を学べるような環境を構築していろいろ遊んでみたいと思う。
今の私の現状はこんなところ。
- 一年くらい前に同僚が作ってくれたhands-onを一回やったことがある。けど、ほぼ覚えていない。
Pod
,Service
,Deployment
って用語は聞いたことがある、けどその用語が表す概念や範囲は曖昧。Pod
が最小単位だっけなー、複数プロセスは動かせるんだっけ?とかその程度。- 数多く存在するエコシステムで何がトレンドなのか全然分からない。なので勉強していく中で古かったり的外れなものを選ぶ可能性がある。
環境構築
自分が今使ってる環境はMacbook Pro Early 2015のメモリ16GB。以前やったhands-onではminikube
を使ったんだけど、今回自分の環境ではmicrok8sを使ってみようと思う。
brew install ubuntu/microk8s/microk8s
ubuntuが含まれていてほんとにmacOSのインストール用ページか思わず二度見たけどmacOS用だった。
バージョンはその他の環境はこんな感じ。
- microk8s 2.0.1
- macOS Catalina 10.15.7
microk8s自体はversionを出力する方法がなさそうで、brew list microk8s
の出力から判断した。
multipass?
公式に従って打った2つ目のコマンドでいきなりドキュメントと違う挙動をして焦る。 multipass? needs to be set upってことなら必要ってことかな。yを押さざる得ない。
$ microk8s install
Support for 'multipass' needs to be set up. Would you like to do that it now? [y/N]:
You need 'multipass' set-up to build snaps: https://multipass.run.
今の時点でmicrok8sをbrewでアンインストールしたときに一緒にmultipassも削除してくれるのかは分からないんだけど、 とりあえずアンインストール用のスクリプトは用意されているようなので 残っていたらこれで消す。
sudo chmod 755 "/Library/Application Support/com.canonical.multipass/uninstall.sh"
sudo "/Library/Application Support/com.canonical.multipass/uninstall.sh"
ということで気を取り直してインストールアゲイン。
$ microk8s intall
...
Launched: microk8s-vm
2020-10-08T10:01:26+09:00 INFO Waiting for automatic snapd restart...
...
MicroK8s is up and running. See the available commands with `microk8s --help`.
公式ドキュメントに沿って
--wait-ready
というoptionがあってどうもreadyになるまで待ってくれる様子。これ書いてる間にreadyになってたみたいで実際には試してないんだけど。
これ他の環境でも欲しいですよね。公式で待ってくるやつ。自動化が捗る。
$ microk8s status --wait-ready
これでmicrok8sがreadyになったら以下のコマンドを打ちます。 最初見たときは「istio入れるのか。何段のサブコマンドなんだ、深いなー」って思ったんだけど、dashboard, dns, registryとistioを有効にするコマンドだった。
$ microk8s enable dashboard dns registry istio
k8sについてピヨピヨのヒヨコなので全然わかってないんだけど、 これは本来自分でクラスタを運用する場合は自分でdeployする必要があるものをmircrok8sが予めよく使うものを用意してくれているという理解でいいのだろうか。 とりあえず実行してみる。
$ microk8s status
microk8s is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
addons:
enabled:
dashboard # The Kubernetes dashboard
dns # CoreDNS
ha-cluster # Configure high availability on the current node
istio # Core Istio service mesh services
metrics-server # K8s Metrics Server for API access to service metrics
registry # Private image registry exposed on localhost:32000
storage # Storage class; allocates storage from host directory
disabled:
ambassador # Ambassador API Gateway and Ingress
cilium # SDN, fast with full network policy
...
statusコマンドでみてみるとdashboard
, dns
, ha-cluster
, istio
, metrics-server
, registry
, storage
が有効になっていることがわかる。
確かにこれでなんか動きそうな気がする。
公式に沿ってmicrok8s kubectl get all --all-namespaces
を実行してみる。が、多すぎて心が折れそうになる。
$ microk8s kubectl get all --all-namespace
...
kubectl get allの出力
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/metrics-server-8bbfb4bdb-ljc9x 1/1 Running 0 9m59s
kube-system pod/calico-node-sn727 1/1 Running 0 28m
kube-system pod/calico-kube-controllers-847c8c99d-mx8rf 1/1 Running 0 28m
kube-system pod/dashboard-metrics-scraper-6c4568dc68-4nh4r 1/1 Running 0 9m56s
istio-system pod/istio-galley-567478fb94-7n45k 0/1 ContainerCreating 0 7m33s
istio-system pod/istio-telemetry-64d8c69d67-6gxdw 0/2 ContainerCreating 0 7m26s
istio-system pod/istio-policy-58d8b97644-6ms86 0/2 ContainerCreating 0 7m30s
istio-system pod/prometheus-9d65f7646-rcsl7 0/1 ContainerCreating 0 7m25s
istio-system pod/istio-citadel-67658cf6c-9fsv4 0/1 ContainerCreating 0 7m24s
istio-system pod/istio-sidecar-injector-589988b5d6-5cr9x 0/1 ContainerCreating 0 7m24s
istio-system pod/istio-tracing-579d7647d9-prjl4 0/1 ContainerCreating 0 7m23s
istio-system pod/istio-pilot-64d96677f8-9gmsp 0/2 ContainerCreating 0 7m25s
istio-system pod/kiali-77f97f5b4d-5tsj6 0/1 ContainerCreating 0 7m31s
kube-system pod/kubernetes-dashboard-7ffd448895-htxtf 1/1 Running 0 9m57s
kube-system pod/coredns-86f78bb79c-jlqfw 1/1 Running 0 9m17s
kube-system pod/hostpath-provisioner-5c65fbdb4f-89f6j 1/1 Running 0 9m3s
container-registry pod/registry-9b57d9df8-lbsmb 0/1 ContainerCreating 0 9m3s
istio-system pod/istio-grafana-post-install-1.5.1-v6z9k 1/1 Running 0 7m41s
istio-system pod/istio-security-post-install-1.5.1-czrsl 1/1 Running 0 7m41s
istio-system pod/istio-egressgateway-756f9bc5b9-pr27s 0/1 Running 0 7m33s
istio-system pod/istio-ingressgateway-56bb766b96-sb5vp 0/1 Running 0 7m32s
istio-system pod/grafana-d7994566f-zbl8c 1/1 Running 0 7m32s
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 29m
kube-system service/metrics-server ClusterIP 10.152.183.40 <none> 443/TCP 9m59s
kube-system service/kubernetes-dashboard ClusterIP 10.152.183.182 <none> 443/TCP 9m57s
kube-system service/dashboard-metrics-scraper ClusterIP 10.152.183.60 <none> 8000/TCP 9m57s
kube-system service/kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 9m17s
container-registry service/registry NodePort 10.152.183.91 <none> 5000:32000/TCP 9m3s
istio-system service/istio-galley ClusterIP 10.152.183.115 <none> 443/TCP,15014/TCP,9901/TCP 7m38s
istio-system service/istio-egressgateway ClusterIP 10.152.183.138 <none> 80/TCP,443/TCP,15443/TCP 7m38s
istio-system service/istio-ingressgateway LoadBalancer 10.152.183.8 <pending> 15020:32517/TCP,80:31380/TCP,443:31390/TCP,31400:31400/TCP,15029:31343/TCP,15030:31818/TCP,15031:31531/TCP,15032:30281/TCP,15443:31512/TCP 7m35s
istio-system service/grafana ClusterIP 10.152.183.229 <none> 3000/TCP 7m35s
istio-system service/kiali ClusterIP 10.152.183.139 <none> 20001/TCP 7m34s
istio-system service/istio-policy ClusterIP 10.152.183.133 <none> 9091/TCP,15004/TCP,15014/TCP 7m34s
istio-system service/istio-telemetry ClusterIP 10.152.183.233 <none> 9091/TCP,15004/TCP,15014/TCP,42422/TCP 7m33s
istio-system service/istio-pilot ClusterIP 10.152.183.61 <none> 15010/TCP,15011/TCP,8080/TCP,15014/TCP 7m33s
istio-system service/prometheus ClusterIP 10.152.183.47 <none> 9090/TCP 7m33s
istio-system service/istio-citadel ClusterIP 10.152.183.9 <none> 8060/TCP,15014/TCP 7m33s
istio-system service/istio-sidecar-injector ClusterIP 10.152.183.218 <none> 443/TCP,15014/TCP 7m33s
istio-system service/jaeger-query ClusterIP 10.152.183.92 <none> 16686/TCP 7m23s
istio-system service/jaeger-collector ClusterIP 10.152.183.64 <none> 14267/TCP,14268/TCP,14250/TCP 7m21s
istio-system service/jaeger-collector-headless ClusterIP None <none> 14250/TCP 7m21s
istio-system service/jaeger-agent ClusterIP None <none> 5775/UDP,6831/UDP,6832/UDP 7m21s
istio-system service/zipkin ClusterIP 10.152.183.230 <none> 9411/TCP 7m20s
istio-system service/tracing ClusterIP 10.152.183.105 <none> 80/TCP 7m20s
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system daemonset.apps/calico-node 1 1 1 1 1 kubernetes.io/os=linux 28m
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system deployment.apps/metrics-server 1/1 1 1 9m59s
container-registry deployment.apps/registry 0/1 1 0 9m3s
kube-system deployment.apps/calico-kube-controllers 1/1 1 1 28m
kube-system deployment.apps/dashboard-metrics-scraper 1/1 1 1 9m56s
istio-system deployment.apps/istio-galley 0/1 1 0 7m33s
istio-system deployment.apps/istio-egressgateway 0/1 1 0 7m33s
istio-system deployment.apps/istio-ingressgateway 0/1 1 0 7m33s
istio-system deployment.apps/kiali 0/1 1 0 7m32s
istio-system deployment.apps/istio-policy 0/1 1 0 7m32s
istio-system deployment.apps/istio-telemetry 0/1 1 0 7m31s
istio-system deployment.apps/istio-pilot 0/1 1 0 7m27s
istio-system deployment.apps/prometheus 0/1 1 0 7m26s
istio-system deployment.apps/istio-citadel 0/1 1 0 7m25s
istio-system deployment.apps/istio-sidecar-injector 0/1 1 0 7m24s
istio-system deployment.apps/istio-tracing 0/1 1 0 7m24s
kube-system deployment.apps/kubernetes-dashboard 1/1 1 1 9m57s
kube-system deployment.apps/coredns 1/1 1 1 9m17s
kube-system deployment.apps/hostpath-provisioner 1/1 1 1 9m4s
istio-system deployment.apps/grafana 1/1 1 1 7m33s
NAMESPACE NAME DESIRED CURRENT READY AGE
kube-system replicaset.apps/metrics-server-8bbfb4bdb 1 1 1 9m59s
container-registry replicaset.apps/registry-9b57d9df8 1 1 0 9m3s
kube-system replicaset.apps/calico-kube-controllers-847c8c99d 1 1 1 28m
kube-system replicaset.apps/dashboard-metrics-scraper-6c4568dc68 1 1 1 9m56s
istio-system replicaset.apps/istio-galley-567478fb94 1 1 0 7m33s
istio-system replicaset.apps/istio-egressgateway-756f9bc5b9 1 1 0 7m33s
istio-system replicaset.apps/istio-ingressgateway-56bb766b96 1 1 0 7m33s
istio-system replicaset.apps/kiali-77f97f5b4d 1 1 0 7m32s
istio-system replicaset.apps/istio-policy-58d8b97644 1 1 0 7m32s
istio-system replicaset.apps/istio-telemetry-64d8c69d67 1 1 0 7m30s
istio-system replicaset.apps/istio-pilot-64d96677f8 1 1 0 7m26s
istio-system replicaset.apps/prometheus-9d65f7646 1 1 0 7m25s
istio-system replicaset.apps/istio-citadel-67658cf6c 1 1 0 7m25s
istio-system replicaset.apps/istio-sidecar-injector-589988b5d6 1 1 0 7m24s
istio-system replicaset.apps/istio-tracing-579d7647d9 1 1 0 7m23s
kube-system replicaset.apps/kubernetes-dashboard-7ffd448895 1 1 1 9m57s
kube-system replicaset.apps/coredns-86f78bb79c 1 1 1 9m17s
kube-system replicaset.apps/hostpath-provisioner-5c65fbdb4f 1 1 1 9m4s
istio-system replicaset.apps/grafana-d7994566f 1 1 1 7m32s
NAMESPACE NAME COMPLETIONS DURATION AGE
istio-system job.batch/istio-grafana-post-install-1.5.1 0/1 7m41s 7m41s
istio-system job.batch/istio-security-post-install-1.5.1 0/1 7m40s 7m41s
microk8sはkubectlを内包していて基本的にはmicrok8s kubectl
を使った方がいいらしいが、nativeのkubectlを使う方法もある。
microk8s config
が適切な設定を出力してくれるらしいが、今回はもちろん内包しているkubectlを引き続き使う。
Dashboard
さてついにk8s dashboardを開いてみる。
$ microk8s dashboard-proxy
Checking if Dashboard is running.
Dashboard will be available at https://192.168.64.3:10443
Use the following token to login:
eyJhbGciOiJ....(長いトークン)
Forwarding from 0.0.0.0:10443 -> 8443
https://192.168.64.3:10443で何か動き始めたっぽいので、Chromeで早速開いてみるとまあそりゃ当然というか不正な証明書でブロックされてしまった。 さて、変にいじらず正攻法でアクセスできるようにするにはどうすればいいのか。 特に公式ドキュメントには書いてない。いろいろ調べていたらkubectl proxyが出てきた。なるほどHTTPでアクセスできるようにしてくれるということか。
$ microk8s kubectl proxy
Starting to serve on 127.0.0.1:8001
8001でlistenし始めたようなのでcurlで叩いてみる。
$ curl http://localhost:8001/
curl: (7) Failed to connect to localhost port 8001: Connection refused
おや?おかしい。何かoptionでも足りなかったかと思って止めてみる。
$ microk8s kubectl proxy
Starting to serve on 127.0.0.1:8001
^CAn error occurred when trying to execute 'sudo microk8s.kubectl proxy' with 'multipass': returned exit code 255.
なんかいやな予感が。microk8s.kubectl
ってbrewで入れた場合と違うし。
ということでいろいろ漁ってみると、こんなのが見つかりました。えー。 https://github.com/ubuntu/microk8s/issues/1368#issuecomment-697863659
$ sudo multipass set local.driver=virtualbox
ってやれって書いてあるけど、k8sひよこにはつらそう。
まとめ
ってことで、microk8sまだ(2020-10-08時点で)macOSで素直には全部動かないぞ。