2023年3月4日土曜日

minikubeを使ってマルチノード構成のKubernetesクラスターを作成する

minikubeは通常1ノード構成のシンプルなKubernetesクラスターを構成する。ただし、その場合は冗長構成が取れず、ノード障害時の動作確認などが取れず検証内容が限定されてしまう。

minikubeは起動時に展開するノード数を指定することで、マルチノード構成を取ることができる。本記事では、minikubeを使ってマルチノード構成のKubernetesクラスターを作成する手順を記載する。

★minikubeに関する以前の記事はこちら。

環境

以下に今回構築する各種ソフトウェアのバージョンを記載する。

  • ホスト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 件のコメント:

コメントを投稿

人気の投稿