0
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

NUCで始めるVMware Tanzu - TKCにアプリをデプロイ

今日は、せっかくTKCを建てたので、アプリをデプロイしてみましょう。

MetalLBのデプロイ

Day14でも少し触れましたが、TKCを利用する上で、一つ問題点があります。
こちらの、Load Balancer for vSphereの注意事項をご覧下さい。

NOTE: Kube-vip is an in-cluster load balancer that is solely used by the API server. It is not a general purpose Service type: load-balancer for vSphere. Tanzu Kubernetes Grid does not currently provide a Service type: load-balancer for vSphere. If you require load balancing, you can use a solution such as MetalLB.

TKG v1.2.x時点の制約として、TKGに統合されている Kube-vip はAPI server用のLBなので、「Service type:LoadBalancer」 用のLBは、 MetalLB などのソリューションを自前で用意する必要があるよ!ということですね。
それでは、VMware一推し(?)の、MetalLBをデプロイします! Installation の通りにやってみます。

踏み台
$ kubectl edit configmap -n kube-system kube-proxy
# 以下、編集画面
apiVersion: v1
data:
  config.conf: |-
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
# (省略)
    ipvs:
      excludeCIDRs: null
      minSyncPeriod: 0s
      scheduler: ""
      strictARP: true  #←ここがfalseだったので修正
# (省略)
    kind: KubeProxyConfiguration
    metricsBindAddress: ""
    mode: "ipvs"  #←ここが""だったので修正

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/namespace.yaml
# 成功時の出力例
namespace/metallb-system created

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.9.5/manifests/metallb.yaml
# 成功時の出力例 (出力が長かったので、最後の行のみ)
deployment.apps/controller created

$ kubectl create secret generic -n metallb-system memberlist --from-literal=secretkey="$(openssl rand -base64 128)"
# 成功時の出力例
secret/memberlist created

# 動作確認
$ kubectl get all -n metallb-system
NAME                              READY   STATUS    RESTARTS   AGE
pod/controller-65db86ddc6-tf76b   1/1     Running   0          5m24s
pod/speaker-2hf7n                 1/1     Running   0          5m24s
pod/speaker-wlj7z                 1/1     Running   0          5m24s

NAME                     DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
daemonset.apps/speaker   2         2         2       2            2           kubernetes.io/os=linux   5m24s

NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           5m24s

NAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-65db86ddc6   1         1         1       5m24s

お、Runningだ。問題なし。:smiley:

続いて、MetalLBの設定。実は、MetalLBには、2種類のモードが存在します。Layer2モードとBGPモードです。
Layer2モードは、クラスタ内の1台のマシンがサービスの所有権を取得してIPを外部公開し、標準的なアドレス検出プロトコル(IPv4はARP、IPv6はNDP)により、ローカルネットワーク上で到達可能にします。サービス権を取得したマシンは、ネットワーク上からは複数のIPを持っているように見えます。どれか1台のマシンのみで受け付けるため、実際にはロードバランシングしませんw 別マシンのPodには、クラスタ内を横断するコンテナネットワークによって到達します。
BGPモードは、クラスタ内の各マシンとBGP対応ルータがピアリングセッションを確立し、BGPポリシーに従って複数ノード間でちゃんとロードバランシングをしてくれます。ただし、我が家は普通の家庭用ルータなので、BGPをおしゃべりしてくれるルータを持っていないため、こちらのモードは諦めましたw

よって、Layer2モードで設定します。以下のように、アサインするIPプールを指定するだけです。

$ vi metallb-cm.yaml
# 以下、編集内容
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.5.61-192.168.5.70
# 編集ここまで

$ kubectl apply -f metallb-cm.yaml
configmap/config created

APPのデプロイ

github上で"pod demo"と検索して人気があった、hello-kubernetesを使ってみます。

踏み台
$ vi hello-kubernetes.yaml
# 上記リンクの、Standard Configurationをコピペ

# デモアプリのデプロイ
$ kubectl apply -f hello-kubernetes.yaml
service/hello-kubernetes created
deployment.apps/hello-kubernetes created

# EXTERNAL-IPにIPアドレスが割り振られている!
$ kubectl get svc
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP    PORT(S)        AGE
hello-kubernetes   LoadBalancer   100.65.85.225   192.168.5.61   80:30750/TCP   142m
kubernetes         ClusterIP      100.64.0.1      <none>         443/TCP        32h

上記でアサインされた、 http://192.168.5.61 にブラウザからアクセスしてみると・・・
スクリーンショット 2020-12-15 19 30 28
よし、成功!!

本日はこれまで!お疲れさまでした。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
0
Help us understand the problem. What are the problem?