ロードバランサーのインストール
クラスター外のクライアント、具体的には自宅 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 の違いも知らない状況だったから、調べながらボチボチ進めてきた。
ググれば最新とは言わなくても先人たちの多くの情報やドキュメントが入手できるからなんとかなっているという感じ。
次は永続ボリュームかな。
コメント