やったことアウトプットしないと、後輩に色々言えないと思ったのでメモ書き程度に…
Kubernetesで色々やってみたいので、手元のWindows 10 ProにHyper-Vをインストールして、その中にk8sを構築する。
ただ、普段の開発マシンはmacOSなので、操作はmacOSからしたい。
※手元のWin10マシンがRyzen 7 3700X 64GBでVM動かすのにちょうどよかったため。
minikube (Windows 10)
minikube multi nodeで構築する。
https://minikube.sigs.k8s.io/docs/tutorials/multi_node/
コマンドのインストールはめんどくさいので、Chocolateyでやる。
KubernetesのバージョンはEKSと合わせるためにv1.21.5にしています。
Hyper-Vの有効化は割愛
# 管理者権限のPowershellで作業
# Chocolateyでサクッとminikubeをインストール
> choco install -y minikube
# minikubeでk8s clusterを起動
# --hyperv-virtual-switch='Primary Virtual Switch'
#   -> 事前にHyper-Vのコンパネで仮想スイッチを作成しています
> minikube start `
    --driver=hyperv `
    --hyperv-virtual-switch='Primary Virtual Switch' `
    --nodes=3 `
    --cni=flannel `
    --container-runtime=containerd `
    --cpus=4 `
    --memory=8G `
    --addons=registry,metallb,ingress `
    --embed-certs=true `
    --kubernetes-version=v1.21.5
Microsoft Windows 10 Pro 10.0.19044 Build 19044 上の minikube v1.25.2                                                                            
💿  VM ブートイメージをダウンロードしています...
    > minikube-v1.25.2.iso.sha256: 65 B / 65 B [-------------] 100.00% ? p/s 0s
    > minikube-v1.25.2.iso: 237.06 MiB / 237.06 MiB  100.00% 45.17 MiB p/s 5.5s
👍  minikube クラスター中のコントロールプレーンの minikube ノードを起動しています
💾  Kubernetes v1.21.5 のダウンロードの準備をしています
    > preloaded-images-k8s-v17-v1...: 545.79 MiB / 545.79 MiB  100.00% 48.20 Mi
🔥  hyperv VM (CPUs=4, Memory=8192MB, Disk=20000MB) を作成しています...
📦  containerd 1.4.12 で Kubernetes v1.21.5 を準備しています...
    ▪ kubelet.housekeeping-interval=5m
    ▪ 証明書と鍵を作成しています...
    ▪ コントロールプレーンを起動しています...
    ▪ RBAC のルールを設定中です...
🔗  Flannel (コンテナーネットワークインターフェース) を設定中です...
🔎  Kubernetes コンポーネントを検証しています...
    ▪ registry:2.7.1 イメージを使用しています
    ▪ gcr.io/google_containers/kube-registry-proxy:0.4 イメージを使用しています
    ▪ gcr.io/k8s-minikube/storage-provisioner:v5 イメージを使用しています
    ▪ k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 イメージを使用しています
    ▪ k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 イメージを使用しています
    ▪ k8s.gcr.io/ingress-nginx/controller:v1.1.1 イメージを使用しています
    ▪ metallb/controller:v0.9.6 イメージを使用しています
    ▪ metallb/speaker:v0.9.6 イメージを使用しています
🔎  registry アドオンを検証しています...
🔎  ingress アドオンを検証しています...
🌟  有効なアドオン: storage-provisioner, metallb, default-storageclass, registry, ingress
👍  minikube クラスター中の minikube-m02 ワーカーノードを起動しています
🔥  hyperv VM (CPUs=4, Memory=8192MB, Disk=20000MB) を作成しています...
🌐  ネットワーク オプションが見つかりました
    ▪ NO_PROXY=172.16.11.179
    ▪ no_proxy=172.16.11.179
📦  containerd 1.4.12 で Kubernetes v1.21.5 を準備しています...
    ▪ env NO_PROXY=172.16.11.179
🔎  Kubernetes コンポーネントを検証しています...
👍  minikube クラスター中の minikube-m03 ワーカーノードを起動しています
🔥  hyperv VM (CPUs=4, Memory=8192MB, Disk=20000MB) を作成しています...
🌐  ネットワーク オプションが見つかりました
    ▪ NO_PROXY=172.16.11.179,172.16.11.180
    ▪ no_proxy=172.16.11.179,172.16.11.180
📦  containerd 1.4.12 で Kubernetes v1.21.5 を準備しています...
    ▪ env NO_PROXY=172.16.11.179
    ▪ env NO_PROXY=172.16.11.179,172.16.11.180
🔎  Kubernetes コンポーネントを検証しています...
❗  C:\ProgramData\chocolatey\bin\kubectl.exe のバージョンは 1.23.5 で、Kubernetes 1.21.5 と互換性がないかもしれません。
    ▪ kubectl v1.21.5 が必要ですか? 'minikube kubectl -- get pods -A' を試してみてください
🏄  完了しました! kubectl が「"minikube"」クラスタと「"default"」ネームスペースを使用するよう構成されました
kubectl (macOS)
kubectlをインストール
バージョンを揃えるために、asdfを使用しています。
$ brew install asdf
# 追記
export BREW_PREFIX=`brew --prefix`
. "${BREW_PREFIX}/opt/asdf/libexec/asdf.sh"
# ~/.bash_profileを再読み込み
$ exec $SHELL -l
# asdfでkubectlを使えるようにする
$ asdf plugin-add kubectl
# kubectl v1.21.5をインストール
$ asdf install kubectl 1.21.5
# システムでkubectl v1.21.5を利用するように設定
$ asdf global kubectl 1.21.5
# バージョン確認
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.5", GitCommit:"aea7bbadd2fc0cd689de94a54e5b7b758869d691", GitTreeState:"clean", BuildDate:"2021-09-15T21:10:45Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"darwin/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
KubeConfigをどうにかして持ってくる
Windows 10の "C:\Users\<ユーザ名>\.kube\config" をどうにかこうにかして、macOSの ~/.kube/config に持ってくる。
私はRDPでコピペしました。
人によっては、中のIPをいい感じに直す必要性があると思います。
疎通確認 (macOS)
# Server側のバージョンが取れていればOK
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.5", GitCommit:"aea7bbadd2fc0cd689de94a54e5b7b758869d691", GitTreeState:"clean", BuildDate:"2021-09-15T21:10:45Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.5", GitCommit:"aea7bbadd2fc0cd689de94a54e5b7b758869d691", GitTreeState:"clean", BuildDate:"2021-09-15T21:04:16Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl get all -n kube-system
NAME                                   READY   STATUS    RESTARTS   AGE
pod/coredns-558bd4d5db-527vk           1/1     Running   0          19m
pod/etcd-minikube                      1/1     Running   0          19m
pod/kube-apiserver-minikube            1/1     Running   0          19m
pod/kube-controller-manager-minikube   1/1     Running   0          19m
pod/kube-flannel-ds-amd64-vhm4v        1/1     Running   0          17m
pod/kube-flannel-ds-amd64-vrd7q        1/1     Running   0          16m
pod/kube-flannel-ds-amd64-xdqf5        1/1     Running   0          19m
pod/kube-proxy-2r45z                   1/1     Running   0          19m
pod/kube-proxy-nl4rf                   1/1     Running   0          17m
pod/kube-proxy-zj2ld                   1/1     Running   0          16m
pod/kube-scheduler-minikube            1/1     Running   0          19m
pod/registry-5h7hb                     1/1     Running   0          19m
pod/registry-proxy-4gxpz               1/1     Running   0          19m
pod/registry-proxy-68gms               1/1     Running   0          16m
pod/registry-proxy-6r485               1/1     Running   0          17m
pod/storage-provisioner                1/1     Running   0          19m
NAME                             DESIRED   CURRENT   READY   AGE
replicationcontroller/registry   1         1         1       19m
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
service/kube-dns   ClusterIP   10.96.0.10     <none>        53/UDP,53/TCP,9153/TCP   19m
service/registry   ClusterIP   10.98.234.97   <none>        80/TCP,443/TCP           19m
NAME                                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/kube-flannel-ds-amd64     3         3         3       3            3           <none>                   19m
daemonset.apps/kube-flannel-ds-arm       0         0         0       0            0           <none>                   19m
daemonset.apps/kube-flannel-ds-arm64     0         0         0       0            0           <none>                   19m
daemonset.apps/kube-flannel-ds-ppc64le   0         0         0       0            0           <none>                   19m
daemonset.apps/kube-flannel-ds-s390x     0         0         0       0            0           <none>                   19m
daemonset.apps/kube-proxy                3         3         3       3            3           kubernetes.io/os=linux   19m
daemonset.apps/registry-proxy            3         3         3       3            3           <none>                   19m
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns   1/1     1            1           19m
NAME                                 DESIRED   CURRENT   READY   AGE
replicaset.apps/coredns-558bd4d5db   1         1         1       19m
何故か、corednsの調子が悪かったので一度作り直す
$ kubectl -n kube-system rollout restart deployment coredns
deployment.apps/coredns restarted
# 先ほどと名前が変わっていればOK
$ kubectl -n kube-system get po
NAME                               READY   STATUS    RESTARTS   AGE
coredns-69b98fc48c-rfs5h           1/1     Running   0          29s
....
MetalLB
今のままだと、MetalLBが動作しないので、LoadBalancerに割り当てるIPアドレスの範囲を設定してあげる。
この際に、企業内のネットワークなどで適当に割り当てると、企業内ネットワークに深刻なダメージを受けることがあるので注意。
基本的には、自宅のLANなどでVPNを切断した上で設定しよう。
我が家は 172.16.10.0/23 のLANを構築しており、DHCPで配布されるアドレスは 172.16.11.100-220 の範囲に限定しているため、MetalLBには 172.16.10.100-200 の範囲を割り当てる。
> minikube addons configure metallb
-- Enter Load Balancer Start IP: 172.16.10.100
-- Enter Load Balancer End IP: 172.16.10.200
    ▪ metallb/speaker:v0.9.6 イメージを使用しています
    ▪ metallb/controller:v0.9.6 イメージを使用しています
✅  metallb は正常に設定されました
予定
ストレージ周りが不便なので、Rook CEPHを入れたい
(まぁ、すでに入れてたけど記事を書くために一度全部吹き飛ばした)