Annieの部屋

ウィーンのホーフブルク宮殿の中にある非常口がアイコンの、きっとエンジニアな人。

MacBook Air (M1, 2020) にk8s勉強用の環境を整える

Udemyの「Kubernetes for the Absolute Beginners - Hands-on」を進めていて、

minikubeを使ったdemoを自分でもやってみようと思ったら想像以上に躓いたので自分用メモ。雑。

www.udemy.com

実行環境

2022/03/19 現在

※Udemyの講座ではLinux OS上で動かしている

Virtual BoxがM1 Macで使えない

$ brew install --cask virtualbox
==> Caveats
virtualbox requires a kernel extension to work.
If the installation fails, retry after you enable it in:
  System Preferences → Security & Privacy → General

For more information, refer to vendor documentation or this Apple Technical Note:
  https://developer.apple.com/library/content/technotes/tn2459/_index.html

==> Downloading https://download.virtualbox.org/virtualbox/6.1.32/VirtualBox-6.1.32-149290-OSX.dmg
######################################################################## 100.0%
Error: Cask virtualbox depends on hardware architecture being one of [{:type=>:intel, :bits=>64}], but you are running {:type=>:arm, :bits=>64}.

minikubeのdriverとしてvirtualboxを使う方法がdemoで使われているが、installできない。

→ Driverにdockerを指定することでminikube start コマンド自体は実行できた

$ minikube start --driver=docker

$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Hello Minikubeで使われているimageがM1 Macで動かない

kubernetes.io

$ kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
deployment.apps/hello-node created

$ kubectl get deployment
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   0/1     1            0           79s

いつまで経ってもdeploymentがreadyにならない……。

k8s.gcr.io/echoserver:1.4 はM1 Macで動かないらしい。

M1 MacでMinikubeを使ってみる - Hacker Sheet

↑こちらを参考に、違うimageを使ってkubectl create deployment してみる

$ ubectl create deployment hello-minikube --image=arm64v8/nginx

$ kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hello-minikube   1/1     1            1           107s

deplyomentがreadyになった!

Service URLにアクセスできない

そもそもURLが発行されない……

$ kubectl expose deployment hello-minikube --type=NodePort --port=80
service/hello-minikube expose

$ kubectl get service
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
hello-minikube   NodePort    10.108.178.165   <none>        80:31639/TCP   2m34s
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP        26m

$ minikube service hello-minikube --url

🏃  Starting tunnel for service hello-minikube.
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.


$ minikube service list
|-------------|----------------|--------------|-----|
|  NAMESPACE  |      NAME      | TARGET PORT  | URL |
|-------------|----------------|--------------|-----|
| default     | hello-minikube |           80 |     |
| default     | kubernetes     | No node port |
| kube-system | kube-dns       | No node port |
|-------------|----------------|--------------|-----|

他にも問題に直面している人を見かけた

github.com

うーん、これはM1 Mac特有の問題ではなさそう。

そして「driverをdockerじゃなくてhyperkitにしたら動く」というのが解決策になっている……。

github.com

そしてM1 Macではhyperkitが動かない!詰んだ!

対応:microk8sを使う

今回は、minikubeを使うことを諦めてmicrok8sを使うことにした。

Canonicalの軽量Kubernetes「MicroK8s」がWindowsとMacに対応。インストーラーで簡単に導入可能に - Publickey

これで、いまのところdemo通りのコマンドが使える。

MicroK8sのパッケージインストール

$brew install ubuntu/microk8s/microk8s

MicroK8sのインストール

multipassが入っていないとinstallを促される

$microk8s install
Support for 'multipass' needs to be set up. Would you like to do that it now? [y/N]:

MicroK8sとSkaffoldで開発環境を構築した際のメモ(Mac) - Qiita

$ microk8s start
Started.

~/.kube/config に設定追加(任意)

追加しない場合はmicroku8s kubectlというコマンドを使えば良い。

私はこれ以外に切り替えるk8sクラスタはないので、以下のコマンドでconfigに設定を追加した。

$ microk8s config > ~/.kube/config

複数切り替える必要がある場合はmicrok8s configの結果をうまいこと切り取って~/.kube/configに追記する必要あり。

Hello Minikube をmicrok8sで再実行!

Hello Minikubeで使われていたコマンドをmicrok8s環境で使ってみる

$ kubectl create deployment hello-microk8s --image=arm64v8/nginx
deployment.apps/hello-microk8s created

$ kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hello-microk8s   1/1     1            1           33s

$ kubectl expose deployment hello-microk8s --port=80
service/hello-microk8s exposed

これでhttp://localhostにアクセスすると馴染みのWelcome to nginx! が見れるはず!

あー、楽しかった。