minikubeは通常1ノード構成のシンプルなKubernetesクラスターを構成する。ただし、その場合は冗長構成が取れず、ノード障害時の動作確認などが取れず検証内容が限定されてしまう。
minikubeは起動時に展開するノード数を指定することで、マルチノード構成を取ることができる。本記事では、minikubeを使ってマルチノード構成のKubernetesクラスターを作成する手順を記載する。
★minikubeに関する以前の記事はこちら。
- 「minikube」を使ってKubernetes検証環境を構築する手順
- minikubeで構築したKubernetes環境にて、DockerのコンテナイメージをPodとして動かす
- minikubeで構築したKubernetes環境にて、マニフェストファイルを使ってPodとServiceを作成する
環境
以下に今回構築する各種ソフトウェアのバージョンを記載する。
- ホストOS : AlmaLinux 8.6 (GUI環境を含めインストールする)
- ホストDocker : 20.10.21
- minikube : 1.28.0
minikubeのマルチノード構成では、PodをPullする際にDockerレジストリが必要となる。今回Dockerコンテナレジストリとして、Harborを用いる。Harborについては、以下記事を参照いただきたい。
以下にminikubeの環境の構成概要図を記載する。
minikubeマルチノード構成手順
1. minikubeをマルチノード構成で起動
minikubeをマルチノード構成で起動させる場合は、node
のオプションで構成するノード数を指定すればよい。今回は3ノード構成で起動させることにする。
また、コンテナレジストリへは通常HTTPSでなければ接続できない。今回、接続先のHarborはHTTPのみ通信可能な設定となっていることから、一度minikube環境を削除し、minikubeを再度起動させる際にinsecure-registry
のオプションを指定し接続できるよう設定を行う。
$ minikube delete
$ minikube start --nodes=3 --insecure-registry=192.168.11.54
ノードを確認すると、minikube-m02とminikube-m03という名前のノードが構成されていることがわかる。
$ kubectl get node -o=wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
minikube Ready control-plane 162m v1.25.3 192.168.49.2 <none> Ubuntu 20.04.5 LTS 4.18.0-372.9.1.el8.x86_64 docker://20.10.20
minikube-m02 Ready <none> 161m v1.25.3 192.168.49.3 <none> Ubuntu 20.04.5 LTS 4.18.0-372.9.1.el8.x86_64 docker://20.10.20
minikube-m03 Ready <none> 161m v1.25.3 192.168.49.4 <none> Ubuntu 20.04.5 LTS 4.18.0-372.9.1.el8.x86_64 docker://20.10.20
2. namespaceの作成
今回のPodやServiceリソースを作成するためのnamespaceとして、「mynamespace」を作成する。
$ kubectl create namespace mynamespace
namespace/mynamespace created
$ kubectl get namespace
NAME STATUS AGE
default Active 63d
kube-node-lease Active 63d
kube-public Active 63d
kube-system Active 63d
mynamespace Active 6s
3. マニフェストファイルを適用しPodを作成
使用するマニフェストファイルは、以下記事で作成したマニフェストファイルを使用する。
マルチノード構成となってもPodの作成手順は特に変わらず、kubectl apply
でマニフェストファイルを指定すればよい。
$ kubectl apply -f ./deployment_squid_harbor.yml
deployment.apps/almalinux-squid-deployment created
Podの作成状況を確認すると以下の通り。Podがどのノードで動いているか確認する場合、kubectl get pod
のオプションに-o=wide
を指定する。今回は3つのPodがminikube、minikube-m02、minikube-m03の3つのノードに分散して配置されていることがわかる。
$ kubectl get pod -o=wide -n=mynamespace
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
almalinux-squid-76666ccf5c-86pft 1/1 Running 0 28s 10.244.2.2 minikube-m03 <none> <none>
almalinux-squid-76666ccf5c-pfr7g 1/1 Running 0 28s 10.244.1.2 minikube-m02 <none> <none>
almalinux-squid-76666ccf5c-sqtwj 1/1 Running 0 28s 10.244.0.3 minikube <none> <none>
4. Serviceリソースの作成
Pod作成と同じくkubectl apply
を実行し、Serviceリソースを作成する。
$ kubectl apply -f ./service_squid_harbor.yml
service/almalinux-squid-service created
Serviceリソースの作成状況を確認すると以下の通り。今回はNodePortとなるので、ノードのIPアドレスに対して30717/TCPでServiceリソースに接続することができる。
$ kubectl get service -n=mynamespace
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
almalinux-squid-service NodePort 10.98.28.180 <none> 8080:30717/TCP 13s
マルチノード構成時のNodePort宛ての通信について
マルチノード構成では複数ノードがそれぞれIPアドレスを持つが、NodePortを設定した場合、接続先のIPアドレスはどのノードのIPアドレスになるだろう。
実は、どのノードのIPアドレスでも問題なく接続できる。確認のため、Podの数を3→2に減らした場合であっても、Podが動作していないNodeのIPアドレスからPodに接続できることを確認してみよう。
1. Podの起動数を変更
Podの起動数は、マニフェストファイルのreplicas
で指定されているが、kubectl scale
コマンドでも変更可能となる。
$ kubectl get deploy -n=mynamespace
NAME READY UP-TO-DATE AVAILABLE AGE
almalinux-squid 3/3 3 3 21m
$ kubectl scale deploy almalinux-squid --replicas=2 -n=mynamespace
deployment.apps/almalinux-squid scaled
$ kubectl get deploy -n=mynamespace
NAME READY UP-TO-DATE AVAILABLE AGE
almalinux-squid 2/2 2 2 22m
変更後のPodの状態を確認すると、minikube-m02のノードからPodが削除されていることがわかる。
$ kubectl get pod -o=wide -n=mynamespace
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
almalinux-squid-76666ccf5c-86pft 1/1 Running 0 22m 10.244.2.2 minikube-m03 <none> <none>
almalinux-squid-76666ccf5c-sqtwj 1/1 Running 0 22m 10.244.0.3 minikube <none> <none>
2. 動作確認
2台となったPodに対して、今回はcurl
コマンドにてアクセスをしてみよう。以下の通り、どのノードのIPアドレスに対してアクセスしたとしても、Squidのコンテナ(Server: squid/4.15
)から応答が返ってきていることがわかる。
※400 Bad Request
となっているが、これは直接プロキシのURLにアクセスしているため。
$ curl -I http://192.168.49.2:30717
HTTP/1.1 400 Bad Request
Server: squid/4.15
Mime-Version: 1.0
Date: Sun, 29 Jan 2023 08:05:05 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3539
X-Squid-Error: ERR_INVALID_URL 0
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from almalinux-squid-76666ccf5c-sqtwj
X-Cache-Lookup: NONE from almalinux-squid-76666ccf5c-sqtwj:8080
Via: 1.1 almalinux-squid-76666ccf5c-sqtwj (squid/4.15)
Connection: close
$ curl -I http://192.168.49.3:30717
HTTP/1.1 400 Bad Request
Server: squid/4.15
Mime-Version: 1.0
Date: Sun, 29 Jan 2023 08:04:41 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3541
X-Squid-Error: ERR_INVALID_URL 0
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from almalinux-squid-76666ccf5c-86pft
X-Cache-Lookup: NONE from almalinux-squid-76666ccf5c-86pft:8080
Via: 1.1 almalinux-squid-76666ccf5c-86pft (squid/4.15)
Connection: close
$ curl -I http://192.168.49.4:30717
HTTP/1.1 400 Bad Request
Server: squid/4.15
Mime-Version: 1.0
Date: Sun, 29 Jan 2023 08:04:44 GMT
Content-Type: text/html;charset=utf-8
Content-Length: 3541
X-Squid-Error: ERR_INVALID_URL 0
Vary: Accept-Language
Content-Language: en
X-Cache: MISS from almalinux-squid-76666ccf5c-sqtwj
X-Cache-Lookup: NONE from almalinux-squid-76666ccf5c-sqtwj:8080
Via: 1.1 almalinux-squid-76666ccf5c-sqtwj (squid/4.15)
Connection: close
以上で、minikubeを使ってマルチノード構成のKubernetesクラスターを作成する手順は完了となる。
0 件のコメント:
コメントを投稿