このブログを検索

この記事の内容は、個人の見解、検証の範囲のものであり、誤りがある可能性があります。
個人の責任において情報活用をお願いします。


2021年11月26日金曜日

俺とkubernetesと時々vSphere -ServiceのLoadBalancerタイプその2-

 このブログは、コンテナのオーケストレーターであるkubernetesについて

自分の知識をまとめることを目的として記事を書いています。

もともとなが~くvSphereのあれやこれやに携わってきたのでvSphereとの類似点や

相違点についてもちょっと混ぜていけたりしたらいいかなぁとかも思っています。


前回、ServiceのタイプLoadBalancerは手動で作っただけのkubernetesでは使えないこと、

このServiceと連携してくれるLoadBalancerが必要となってしまうことをお話ししました。


今回ですが、kubernetesの外にあるLoadBalancerと連携するのではなく、kubernetes上に

LoadBalancerを用意して、ServiceのタイプLoadBalancerを動かしてしまえるMetalLBを

導入してみたいと思います。


MetalLBの公式はこちら

https://metallb.universe.tf/


公式に案内されていることをやれば動いてくれます。

早速作ってみましょう。


まず、MetalLBで払い出してもらうIPアドレスのレンジを決めます。

今回は192.168.0.200-192.168.0.210としました。

以下が設定となるConfigMapのyaml内容です。

configmap.yml

----

apiVersion: v1

kind: ConfigMap

metadata:

  namespace: metallb-system

  name: config

data:

  config: |

    address-pools:

    - name: default

      protocol: layer2

      addresses:

      - 192.168.0.200-192.168.0.210

----


インストールをしていきます。

MetalLB用のnamespaceを作成するyamlがあるので使用して作成します。

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/namespace.yaml


名前空間ができているはずなので、kubectl get nsで名前空間を確認してみます。

NAME              STATUS   AGE

----

default           Active   37d

kube-node-lease   Active   37d

kube-public       Active   37d

kube-system       Active   37d

metallb-system    Active   53s ※新しく作成された名前空間

----


MetalLBを作成します。

kubectl apply -f  https://raw.githubusercontent.com/metallb/metallb/v0.9.3/manifests/metallb.yaml

kubectl apply -f configmap.yml

kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"


これでMetalLBが作成されています。

先ほど作成した名前空間「metallb-system」を指定してPodを見てみると


kubectl get pod,svc -n metallb-system

NAME                            READY   STATUS    RESTARTS   AGE

pod/controller-fb659dc8-nf5xp   1/1     Running   0          9m34s

pod/speaker-5km2t               1/1     Running   0          9m34s

pod/speaker-7gkzv               1/1     Running   0          9m34s

pod/speaker-gbx4d               1/1     Running   0          9m34s


このようにMetalLB用のPodが作成されているのがわかります。

それでは、ServiceのタイプLoadBarancerを作成して、外部アクセス用のIPアドレスが割り当てられるか見てみましよう。

前回使用したServiceを作成するのですが、確認用のPodも作成しようと思います。

今までの流れだと2個のyamlを使用していましたが、実はyamlは「---」を使用して一つにまとめることができます。

具体的には以下のような形となります。


pod.yaml

---

kind: Pod

apiVersion: v1

metadata:

  name: test-pod

  labels:

    site: test

spec:

  containers:

  - image: nginx

    name: nginx-container

---

kind: Service

apiVersion: v1

metadata:

  name: test-svc-1

  labels:

    app: test

    site: test

spec:

  type: LoadBalancer

  ports:

  - port: 80

    protocol: TCP

    targetPort: 80

  selector:

    site: test

---


ではこちらのファイルを元に作成を行ってみましょう。


kubectl apply -f pod.yaml

pod/test-pod created

service/test-svc-1 created


このように、PodとServiceが作成されていることがわかります。

MetalLBのyamlを使用して導入した際にも同じように複数のリソースを作成した出力結果

が出てきたと思いますが、あちらで使用したyamlファイルにも同様に複数のリソースを

1つのyamlにまとめていたからということです。


では、PodとServiceの状態を見てみましょう

kubectl get pod,svc

NAME           READY   STATUS    RESTARTS   AGE

pod/test-pod   1/1     Running   0          61s


NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)        AGE

service/kubernetes   ClusterIP      10.96.0.1       <none>          443/TCP        37d

service/test-svc-1   LoadBalancer   10.100.102.86   192.168.0.200   80:32383/TCP   61s


どうでしょう、作成したService「test-svc-1」にEXTERNAL-IPが割り当てられていると思います。

ここでは、tcp:80番で192.168.0.200にアクセスした場合にPodに転送されるようになっているはずです。

実際に通信可能な作業PCなどからブラウザでhttpでの通信をしてみてください。

nginxのデフォルトページが表示されると思います。


無事、ServiceタイプLoadBalancerが利用可能になりました。

これにより、IngressによるL7通信制御などもnginxのコントローラーを導入するとことで利用が

可能となり、やれることの範囲が広がっていきます。


ここで、タイトルにある時々vSphereのvSphere部分を無理やり書いてみると、vSphereのTanzuでは

この部分はNSX、HAproxy、Aviのどれかを選んで構築することになる部分となります。

VCとESXiだけではロードバランサーの役割はさすがに果たせないので仕方ない部分だと思いますが、

その分構築が複雑なのとライセンスでお金かかっちゃうのがネックですね・・・


今回は以上となります。

次回は永続ボリュームに関する『そのままだとできないこと』について書きたいと思います。