|
[[406052]] kube-vip は、コントロール プレーン ノードにネイティブの Kubernetes 高可用性ロード バランサーを提供できるため、クラスターの高可用性を実現するために HAProxy と Keepalived を外部で構成する必要がなくなります。 kube-vipは、内部および外部のKubernetesクラスタに高可用性と負荷分散を提供するオープンソースプロジェクトです。VMwareのTanzuプロジェクトでは、kube-vipがvSphereデプロイメントで使用されているHAProxyロードバランサの代替として採用されています。この記事では、まずKubernetesコントロールプレーンにおける高可用性と負荷分散のためにkube-vipをどのように活用できるかを理解します。 特徴Kube-Vip はもともと Kubernetes コントロール プレーンに HA ソリューションを提供するために作成されましたが、時間の経過とともに進化し、同じ機能を Kubernetes LoadBalancer タイプのサービスに組み込むようになりました。 - VIP アドレスは IPv4 または IPv6 のいずれかになります。
- ARP(レイヤー2)またはBGP(レイヤー3)を使用した制御プレーン
- リーダーシップ選出またはRaftコントロールプレーンを使用する
- kubeadm を使用した HA コントロール プレーン (静的 Pod)
- K3s およびその他 (DaemonSets) を使用したコントロール プレーン HA
- ARPリーダー選出を使用したサービスロードバランサ(レイヤー2)
- BGP経由で複数のノードを持つサービスロードバランサーを使用する
- 各名前空間またはサービス LoadBalancer のグローバル アドレス プール
- サービス LoadBalancer アドレスは、UPNP 経由でゲートウェイに公開されます。
HA プロキシと kube-vip HA クラスター以前は、プライベート環境でKubernetesクラスターを作成する場合、マルチコントロールプレーンクラスターを構築するためにハードウェア/ソフトウェアロードバランサーを用意する必要がありました。多くの場合、この機能を実現するためにHAProxy + Keepalivedを使用していました。通常は、ロードバランサー用に2台の仮想マシンを作成し、VIPを割り当て、そのVIPを使用してロードバランサーにサービスを提供することで、トラフィックをバックエンドの特定のKubernetesコントローラープレーンノードにリダイレクトしていました。 次に、kube-vip を使用するとどうなるかを見てみましょう。 kube-vip は、コントロールプレーンノード上で静的ポッドを介して実行できます。これらのポッドは ARP 通信を介して各ノード上の他のホストを識別するため、各ノードの IP アドレスを hosts ファイルに設定する必要があります。ロードバランサーの設定には、Metal LB と同様に BGP または ARP を選択できます。今回は BGP サービスを使用しておらず、簡単なテストを行うだけなので、ARP と静的ポッドを使用します。 kube-vip アーキテクチャkube-vip は、VIP/負荷分散ソリューションの一部として高可用性やネットワーク機能を提供するためのさまざまな機能設計オプションを提供します。 クラスタkube-vip は、高可用性を実現するために、マルチノードまたはマルチモジュールクラスタを構築します。ARPモードでは、仮想IPを継承し、クラスタ内のロードバランサのリーダーとなるリーダーが選出されます。BGPモードでは、すべてのノードがVIPアドレスを共有します。 ARPまたはレイヤー2を使用する場合、リーダー選出が使用されます。もちろん、Raftクラスタ技術も使用できますが、特にクラスタ内で実行する場合、この方法はリーダー選出に大きく置き換えられています。 仮想IPクラスタ内のリーダーはVIPを割り当て、設定で宣言された選択されたインターフェースにバインドします。リーダーが変更されると、まずVIPが取り消されます。または、障害が発生した場合は、次に選出されたリーダーによってVIPが直接割り当てられます。 VIPがホスト間で移動されると、そのVIPを使用しているホストは、ARPの有効期限が切れるまで(通常30秒)、新しいVIP <-> MACアドレスマッピングが取得されるまで、以前のVIP <-> MACアドレスマッピングを保持します。これは、フリーARPブロードキャストを使用することで最適化できます。 ARP kube-vip は、フリー ARP (オプション) をブロードキャストするように構成できます。これにより、通常、VIP <-> MAC アドレス マッピングが変更されたことがすべてのローカルホストに直ちに通知されます。 以下に示すように、ARP ブロードキャストを受信すると、フェイルオーバーは通常数秒以内に完了します。 - 192.168.0.75からの64バイト: icmp_seq=146 ttl=64 time =0.258 ms
- 192.168.0.75からの64バイト: icmp_seq=147 ttl=64 time =0.240 ms
- 192.168.0.70からの92 バイト: リダイレクトホスト (新しいアドレス: 192.168.0.75)
- Vr HL TOS Len ID FlgオフTTL Pro cks Src Dst
- 4 5 00 0054 bc98 0 0000 3f 01 3d16 192.168.0.95 192.168.0.75
-
- icmp_seq 148のリクエストタイムアウト
- 192.168.0.70からの92 バイト: リダイレクトホスト (新しいアドレス: 192.168.0.75)
- Vr HL TOS Len ID FlgオフTTL Pro cks Src Dst
- 4 5 00 0054 75ff 0 0000 3f 01 83af 192.168.0.95 192.168.0.75
-
- icmp_seq 149のリクエストタイムアウト
- 192.168.0.70からの92 バイト: リダイレクトホスト (新しいアドレス: 192.168.0.75)
- Vr HL TOS Len ID FlgオフTTL Pro cks Src Dst
- 4 5 00 0054 2890 0 0000 3f 01 d11e 192.168.0.95 192.168.0.75
-
- icmp_seq 150のリクエストタイムアウト
- 192.168.0.75からの64バイト: icmp_seq=151 ttl=64 time =0.245 ms
kube-vipを使用する次に、kube-vipを使って高可用性Kubernetesクラスターを構築します。まず、6つのノードを準備します。 - 3つのコントロールプレーンノード
- 3 つのワーカーノード
まず、kubeadm、kubelet、kubectl、コンテナ ランタイム (ここでは containerd を使用しています) などの関連する依存関係をホスト マシンにインストールします。 kube-vip Dockerイメージを取得し、/etc/kuberentes/manifestsに静的ポッドYAMLマニフェストファイルを設定します。これにより、Kubernetesは各コントロールプレーンノードにkube-vipポッドを自動的にデプロイできるようになります。 - # VIPアドレスを設定する
- エクスポート VIP=192.168.0.100
- エクスポート INTERFACE=eth0
- ctr イメージ プル docker.io/plndr/kube-vip:0.3.1
- ctr 実行
- /kube-vip マニフェストポッド \
-
-
-
-
-
-
次に、以下のように kubeadm を設定します。 - cat > ~/init_kubelet.yaml <<EOF
- APIバージョン: kubeadm.k8s.io/v1beta2
- 種類: InitConfiguration
- ブートストラップトークン:
- - トークン: "9a08jv.c0izixklcxtmnze7"
- 説明: 「kubeadm ブートストラップ トークン」
- ttl: "24時間"
- ノード登録:
- criSocket: "/var/run/containerd/containerd.sock"
-
- APIバージョン: kubeadm.k8s.io/v1beta2
- 種類: ClusterConfiguration
- コントロールプレーンエンドポイント: "192.168.0.100:6443"
-
- apiバージョン: kubelet.config.k8s.io/v1beta1
- 種類: KubeletConfiguration
- cgroupドライバー: "systemd"
- カーネルデフォルトを保護: true
- 終了
- kubeadm init
次に、CNI をインストールします。たとえば、Cilium を使用することを選択します。 - curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
- helm リポジトリに ciliumを追加しますhttps://helm.cilium.io/
- helm install cilium cilium/cilium
-
最初のコントロールプレーンノードの準備ができたら、他のノードがクラスターに参加できるようにします。他のコントロールプレーンノードについては、次のコマンドを実行します。 - kubeadm join 192.168.0.100:6443
-
-
ワーカーノードの場合は、次のようなコマンドを実行します。 - kubeadm join 192.168.0.100:6443
-
プロセスが完了すると、クラスターを起動できます。
- # kubectl get node -o ワイド
- 名前ステータス 役割 年齢 バージョン 内部IP 外部IP OSイメージ カーネルバージョン コンテナランタイム
- k8s-master-0 コントロールプレーン、マスター 121m v1.20.2 192.168.0.201 <なし> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3 が準備完了
- k8s-master-1 コントロールプレーン、マスター 114m v1.20.2 192.168.0.202 <なし> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3 が準備完了
- k8s-master-2 コントロールプレーン、マスター 113m v1.20.2 192.168.0.203 <なし> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3 が準備完了
- k8s-worker-0 準備完了 <なし> 114m v1.20.2 192.168.0.204 <なし> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
- k8s-worker-1 準備完了 <なし> 114m v1.20.2 192.168.0.205 <なし> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
- k8s-worker-2 準備完了 <なし> 112m v1.20.2 192.168.0.206 <なし> Ubuntu 20.04.2 LTS 5.4.0-45-generic containerd://1.4.3
これで、コントロール プレーンのエンドポイントが 192.168.0.100 であり、他に追加のノードがないことがわかります。これは非常に便利です。 参考ドキュメント: https://inductor.medium.com/say-good-bye-to-haproxy-and-keepalived-with-kube-vip-on-your-ha-k8s-control-plane-bb7237eca9fc |