Undefined Title

Undefined Title

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で素直には全部動かないぞ。