LoginSignup
2
1

More than 1 year has passed since last update.

Hyper-V & minikubeでmulti node k8sを構築する

Last updated at Posted at 2022-03-28

やったことアウトプットしないと、後輩に色々言えないと思ったのでメモ書き程度に…

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
# 管理者権限の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
~/.bash_profile
# 追記
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 の範囲を割り当てる。

Powershell
> 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を入れたい
(まぁ、すでに入れてたけど記事を書くために一度全部吹き飛ばした)

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1