MENU
カテゴリー
アーカイブ

Kubernetes で Minecraft Server を設置する(その2)

目次

ロードバランサーのインストール

クラスター外のクライアント、具体的には自宅 LAN のノート PC から Pod にアクセスするためにロードバランサーをインストールする。
NodePort でも実現可能とはいえ、例えば Node1 に障害が発生したときに Node2 にアクセスするには、ノート PC でアクセス先を Node2 のアドレス・ポートに変更する必要がある。
これでは宝の持ち腐れなので、ロードバランサーを導入して、クライアントはノードを意識せずにロードバランサーに構成されたアドレスに接続できるようにする。

次のサイトの説明がわかりやすい。

今回採用したロードバランサーは MetalLB。
公式サイトのとおり MetalLB(v0.13.12)を導入する。

準備

kube-proxy の設定。

kubectl edit configmap -n kube-system kube-proxy

apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
 〜
  strictARP: true

毎回は大変だから上の変更を自動化しておく。

# see what changes would be made, returns nonzero returncode if different
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl diff -f - -n kube-system

# actually apply the changes, returns nonzero returncode on errors only
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/" | \
kubectl apply -f - -n kube-system

インストール

マニフェストを使ってインストールする。

$ kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml

namespace/metallb-system created
customresourcedefinition.apiextensions.k8s.io/addresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bfdprofiles.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgpadvertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgppeers.metallb.io created
customresourcedefinition.apiextensions.k8s.io/communities.metallb.io created
customresourcedefinition.apiextensions.k8s.io/ipaddresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/l2advertisements.metallb.io created
serviceaccount/controller created
serviceaccount/speaker created
role.rbac.authorization.k8s.io/controller created
role.rbac.authorization.k8s.io/pod-lister created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/controller created
rolebinding.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
configmap/metallb-excludel2 created
secret/webhook-server-cert created
service/webhook-service created
deployment.apps/controller created
daemonset.apps/speaker created
validatingwebhookconfiguration.admissionregistration.k8s.io/metallb-webhook-configuration created

IP Address の定義

L2 構成でロードバランサーサービスに割り当てる IP Address を定義する。
CIDR は Node と同じ範囲にすることで LAN 内のクライアントからアクセスできるようになる。

上の公式サイトを参考にマニフェストを作る。

$ vi ~/ipaddresspool.yaml

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool
  namespace: metallb-system
spec:
  addresses:
  - 10.1.11.1-10.1.11.250
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: default
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool

デプロイする。

$ kubectl apply -f ./ipaddresspool.yaml 
ipaddresspool.metallb.io/first-pool created
l2advertisement.metallb.io/default created
$ kubectl get all -A
NAMESPACE        NAME                                    READY   STATUS    RESTARTS      AGE
kube-flannel     pod/kube-flannel-ds-gz2hk               1/1     Running   0             58m
kube-flannel     pod/kube-flannel-ds-hg2jv               1/1     Running   1 (56m ago)   56m
kube-flannel     pod/kube-flannel-ds-pcv8v               1/1     Running   0             57m
kube-flannel     pod/kube-flannel-ds-vb5gr               1/1     Running   1             80m
kube-system      pod/coredns-5dd5756b68-67dvx            1/1     Running   1             86m
kube-system      pod/coredns-5dd5756b68-qtd4k            1/1     Running   1             86m
kube-system      pod/etcd-k8s-node1                      1/1     Running   6             87m
kube-system      pod/kube-apiserver-k8s-node1            1/1     Running   5             87m
kube-system      pod/kube-controller-manager-k8s-node1   1/1     Running   11            87m
kube-system      pod/kube-proxy-2vhl6                    1/1     Running   0             58m
kube-system      pod/kube-proxy-ddnxk                    1/1     Running   1             86m
kube-system      pod/kube-proxy-fjmft                    1/1     Running   0             56m
kube-system      pod/kube-proxy-w2x8c                    1/1     Running   0             57m
kube-system      pod/kube-scheduler-k8s-node1            1/1     Running   11            87m
metallb-system   pod/controller-786f9df989-mkjk4         1/1     Running   0             49m
metallb-system   pod/speaker-568dn                       1/1     Running   0             49m
metallb-system   pod/speaker-5h8rf                       1/1     Running   0             49m
metallb-system   pod/speaker-vxr4n                       1/1     Running   0             49m
metallb-system   pod/speaker-wqpkz                       1/1     Running   0             49m

NAMESPACE        NAME                      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default          service/kubernetes        ClusterIP   10.96.0.1        <none>        443/TCP                  87m
kube-system      service/kube-dns          ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   87m
metallb-system   service/webhook-service   ClusterIP   10.106.140.148   <none>        443/TCP                  49m

NAMESPACE        NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-flannel     daemonset.apps/kube-flannel-ds   4         4         4       4            4           <none>                   80m
kube-system      daemonset.apps/kube-proxy        4         4         4       4            4           kubernetes.io/os=linux   87m
metallb-system   daemonset.apps/speaker           4         4         4       4            4           kubernetes.io/os=linux   49m

NAMESPACE        NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
kube-system      deployment.apps/coredns      2/2     2            2           87m
metallb-system   deployment.apps/controller   1/1     1            1           49m

NAMESPACE        NAME                                    DESIRED   CURRENT   READY   AGE
kube-system      replicaset.apps/coredns-5dd5756b68      2         2         2       86m
metallb-system   replicaset.apps/controller-786f9df989   1         1         1       49m

Nignx をデプロイして動作を確認する。

次のサイトを参考に Nginx をデプロイして、ノート PC から接続してみる。

$ vi ~/test.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    run: nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      run: nginx
  replicas: 2
  template:
    metadata:
      labels:
        run: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
$ kubectl apply -f ./test.yaml
service/nginx-service created
deployment.apps/nginx-deployment created
$ kubectl get all -A
NAMESPACE        NAME                                    READY   STATUS              RESTARTS      AGE
default          pod/nginx-deployment-6c45cbd8c5-thp28   0/1     ContainerCreating   0             9s
default          pod/nginx-deployment-6c45cbd8c5-vv9bm   0/1     ContainerCreating   0             9s
kube-flannel     pod/kube-flannel-ds-gz2hk               1/1     Running             0             67m
kube-flannel     pod/kube-flannel-ds-hg2jv               1/1     Running             1 (65m ago)   66m
kube-flannel     pod/kube-flannel-ds-pcv8v               1/1     Running             0             66m
kube-flannel     pod/kube-flannel-ds-vb5gr               1/1     Running             1             89m
kube-system      pod/coredns-5dd5756b68-67dvx            1/1     Running             1             96m
kube-system      pod/coredns-5dd5756b68-qtd4k            1/1     Running             1             96m
kube-system      pod/etcd-k8s-node1                      1/1     Running             6             96m
kube-system      pod/kube-apiserver-k8s-node1            1/1     Running             5             96m
kube-system      pod/kube-controller-manager-k8s-node1   1/1     Running             11            96m
kube-system      pod/kube-proxy-2vhl6                    1/1     Running             0             67m
kube-system      pod/kube-proxy-ddnxk                    1/1     Running             1             96m
kube-system      pod/kube-proxy-fjmft                    1/1     Running             0             66m
kube-system      pod/kube-proxy-w2x8c                    1/1     Running             0             66m
kube-system      pod/kube-scheduler-k8s-node1            1/1     Running             11            96m
metallb-system   pod/controller-786f9df989-mkjk4         1/1     Running             0             58m
metallb-system   pod/speaker-568dn                       1/1     Running             0             58m
metallb-system   pod/speaker-5h8rf                       1/1     Running             0             58m
metallb-system   pod/speaker-vxr4n                       1/1     Running             0             58m
metallb-system   pod/speaker-wqpkz                       1/1     Running             0             58m

NAMESPACE        NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
default          service/kubernetes        ClusterIP      10.96.0.1        <none>        443/TCP                  96m
default          service/nginx-service     LoadBalancer   10.96.87.219     10.1.11.1     80:31907/TCP             9s
kube-system      service/kube-dns          ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP   96m
metallb-system   service/webhook-service   ClusterIP      10.106.140.148   <none>        443/TCP                  58m

NAMESPACE        NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
kube-flannel     daemonset.apps/kube-flannel-ds   4         4         4       4            4           <none>                   89m
kube-system      daemonset.apps/kube-proxy        4         4         4       4            4           kubernetes.io/os=linux   96m
metallb-system   daemonset.apps/speaker           4         4         4       4            4           kubernetes.io/os=linux   58m

NAMESPACE        NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
default          deployment.apps/nginx-deployment   0/2     2            0           9s
kube-system      deployment.apps/coredns            2/2     2            2           96m
metallb-system   deployment.apps/controller         1/1     1            1           58m

NAMESPACE        NAME                                          DESIRED   CURRENT   READY   AGE
default          replicaset.apps/nginx-deployment-6c45cbd8c5   2         2         0       9s
kube-system      replicaset.apps/coredns-5dd5756b68            2         2         2       96m
metallb-system   replicaset.apps/controller-786f9df989         1         1         1       58m
$ kubectl get svc nginx-service
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-service   LoadBalancer   10.96.87.219   10.1.11.1     80:31907/TCP   75s

クライアントから http://10.1.11.1 にアクセスしてみる。

無事に表示できた。

ただ、このままだと nginx-service のアドレスが変わってしまう可能性があるから、ロードバランサーで割り当てたアドレスの範囲で固定する。
この例だと 10.1.11.1-10.1.11.250 の範囲内で EXTERNAL-IP として 10.1.11.1 となっているところを、10.1.11.11 に変更してみる。

具体的には、マニフェスト test.yaml の spec フィールドに loadBalancerIP を追加する。

$ vi ~/test.yaml

〜
spec:
  type: LoadBalancer
  loadBalancerIP: 10.1.11.11
  ports:
  - port: 80
    protocol: TCP
  selector:
    run: nginx
$ kubectl apply -f ./test.yaml 
service/nginx-service configured
deployment.apps/nginx-deployment unchanged

これで http://10.1.11.11 に固定できた。

Pod の削除

今回は test.yaml を作って nginx をデプロイしてみたけど、もういらないから削除する。
マニフェストファイルをもとに service も pod もまとめて削除する。

念の為 dry-run。

$ kubectl delete -f ./test.yaml --dry-run=client
service "nginx-service" deleted (dry run)
deployment.apps "nginx-deployment" deleted (dry run)

実際に削除する。もちろん、pod も削除される。

$ kubectl delete -f ./test.yaml
service "nginx-service" deleted
deployment.apps "nginx-deployment" deleted

次回に向けて

1週間前は kubectl はおろか、Service , Pod , Namespace の違いも知らない状況だったから、調べながらボチボチ進めてきた。
ググれば最新とは言わなくても先人たちの多くの情報やドキュメントが入手できるからなんとかなっているという感じ。

次は永続ボリュームかな。

コメント

コメントする

目次