20 Kubernetes APIサーバの前面のMetalLB #
このガイドでは、MetalLBサービスを使用して、3つのコントロールプレーンノードを持つHA K3sクラスタ上でK3s
APIを外部に公開する方法を示します。これを実現するために、LoadBalancer
タイプのKubernetes
ServiceとEndpointsを手動で作成します。Endpointsは、クラスタで使用可能なすべてのコントロールプレーンノードのIPを保持します。Endpointsをクラスタで発生するイベント(ノードの追加/削除やノードのオフライン化)と継続的に同期するためにEndpoint
Copier Operatorがデプロイされます。Operatorはデフォルトのkubernetes
Endpointで発生するイベントを監視し、管理対象を自動的に更新して同期を維持します。管理対象のServiceはLoadBalancer
タイプであるため、MetalLB
は静的なExternalIP
を割り当てます。このExternalIP
はAPI
Serverとの通信に使用されます。
20.1 前提条件 #
K3sをデプロイするための3つのホスト。
ホスト名は各ホストで違う名前にしてください。
テストの場合は仮想マシンを使用できます。
ネットワーク内で2つ以上のIPが使用可能(Traefik用に1つ、管理対象サービス用に1つ)。
Helm
20.2 K3sのインストール #
新しいクラスタが必要なく、既存のクラスタを使用する場合は、この手順をスキップして次の手順に進んでください。
まず、ネットワーク内の空きIPを、後で管理対象のServiceのExternalIP
で使用できるように予約する必要があります。
最初のホストにSSHで接続して、次のようにクラスタモードでK3s
をインストールします。
# Export the free IP mentioned above
export VIP_SERVICE_IP=<ip>
export INSTALL_K3S_SKIP_START=false
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --cluster-init \
--disable=servicelb --write-kubeconfig-mode=644 --tls-san=${VIP_SERVICE_IP} \
--tls-san=https://${VIP_SERVICE_IP}.sslip.io" K3S_TOKEN=foobar sh -
必ず、k3s
server
コマンドで--disable=servicelb
フラグを指定してください。
これ以降、コマンドはローカルマシンで実行する必要があります。
APIサーバに外部からアクセスするには、K3s VMのIPを使用します。
# Replace <node-ip> with the actual IP of the machine
export NODE_IP=<node-ip>
scp ${NODE_IP}:/etc/rancher/k3s/k3s.yaml ~/.kube/config && sed \
-i '' "s/127.0.0.1/${NODE_IP}/g" ~/.kube/config && chmod 600 ~/.kube/config
20.3 既存のK3sクラスタの設定 #
この手順は、既存のK3sクラスタを使用する 場合にのみ有効です。
既存のK3sクラスタを使用するには、servicelb
LBを無効にし、tls-san
フラグも変更する必要があります。
K3sフラグを変更するには、クラスタのすべてのVMで/etc/systemd/system/k3s.service
を変更する必要があります。
フラグはExecStart
に挿入する必要があります。例:
# Replace the <vip-service-ip> with the actual ip ExecStart=/usr/local/bin/k3s \ server \ '--cluster-init' \ '--write-kubeconfig-mode=644' \ '--disable=servicelb' \ '--tls-san=<vip-service-ip>' \ '--tls-san=https://<vip-service-ip>.sslip.io' \
次に、次のコマンドを実行して、K3sに新しい設定をロードする必要があります。
systemctl daemon-reload
systemctl restart k3s
20.4 MetalLBのインストール #
MetalLB
をデプロイするには、「K3s上のMetalLB」のガイドを使用できます。
メモ: ip-pool
IPAddressPoolのIPアドレスが、以前にLoadBalancer
サービスに対して選択したIPアドレスと重複していないことを確認してください。
管理対象サービスにのみ使用するIpAddressPool
を別途作成します。
# Export the VIP_SERVICE_IP on the local machine
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: kubernetes-vip-ip-pool
namespace: metallb-system
spec:
addresses:
- ${VIP_SERVICE_IP}/32
serviceAllocation:
priority: 100
namespaces:
- default
EOF
cat <<-EOF | kubectl apply -f -
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: ip-pool-l2-adv
namespace: metallb-system
spec:
ipAddressPools:
- ip-pool
- kubernetes-vip-ip-pool
EOF
20.5 Endpoint Copier Operatorのインストール #
helm repo add endpoint-copier-operator \
https://suse-edge.github.io/endpoint-copier-operator
helm install --create-namespace -n endpoint-copier-operator \
endpoint-copier-operator endpoint-copier-operator/endpoint-copier-operator
上記のコマンドは、クラスタに3つの異なるリソースをデプロイします。
2つのレプリカを持つ
endpoint-copier-operator
オペレータのデプロイメント。一方がリーダーとなり、他方は必要に応じてリーダーの役割を引き継ぎます。default
ネームスペース内のkubernetes-vip
という名前のKubernetesサービス。これはkubernetes
サービスのコピーですが、LoadBalancer
タイプです。default
ネームスペース内のkubernetes-vip
という名前のEndpointリソース。これはkubernetes
Endpointのコピーです。
kubernetes-vip
サービスのIPアドレスが正しいことを確認します。
kubectl get service kubernetes-vip -n default \
-o=jsonpath='{.status.loadBalancer.ingress[0].ip}'
default
ネームスペースのkubernetes-vip
およびkubernetes
のEndpointsリソースが同じIPを指していることを確認します。
kubectl get endpoints kubernetes kubernetes-vip
すべて問題なければ、最後にKubeconfig
でVIP_SERVICE_IP
を使用します。
sed -i '' "s/${NODE_IP}/${VIP_SERVICE_IP}/g" ~/.kube/config
これ以降、kubectl
はすべてkubernetes-vip
サービスを経由するようになります。
20.6 コントロールプレーンノードの追加 #
プロセス全体を監視するため、端末タブを2つ以上開くことができます。
最初の端末:
watch kubectl get nodes
2つ目の端末:
watch kubectl get endpoints
次に、以下のコマンドを2つ目のノードと3つ目のノードで実行します。
# Export the VIP_SERVICE_IP in the VM
# Replace with the actual IP
export VIP_SERVICE_IP=<ip>
export INSTALL_K3S_SKIP_START=false
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server \
--server https://${VIP_SERVICE_IP}:6443 --disable=servicelb \
--write-kubeconfig-mode=644" K3S_TOKEN=foobar sh -