目次にジャンプページナビゲーションにジャンプ: 前のページ[アクセスキーp]/次のページ[アクセスキーn]
documentation.suse.com / SUSE Edgeドキュメント / ハウツーガイド / Kubernetes APIサーバの前面のMetalLB

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つの異なるリソースをデプロイします。

  1. 2つのレプリカを持つendpoint-copier-operatorオペレータのデプロイメント。一方がリーダーとなり、他方は必要に応じてリーダーの役割を引き継ぎます。

  2. defaultネームスペース内のkubernetes-vipという名前のKubernetesサービス。これはkubernetesサービスのコピーですが、LoadBalancerタイプです。

  3. 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

すべて問題なければ、最後にKubeconfigVIP_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 -