ネットワーキングサービス

このページでは、K3s内でCoreDNS、Traefik Ingressコントローラー、ネットワークポリシーコントローラー、およびServiceLBロードバランサーコントローラーがどのように機能するかを説明します。

Flannelの設定オプションやバックエンドの選択、または独自のCNIのセットアップ方法については、インストールネットワークオプションページを参照してください。

K3sのために開く必要のあるポートについての情報は、ネットワーキング要件を参照してください。

CoreDNS

CoreDNSはサーバーの起動時に自動的にデプロイされます。これを無効にするには、クラスター内のすべてのサーバーに--disable=corednsオプションを設定します。

CoreDNSをインストールしない場合は、クラスターDNSプロバイダーを自分でインストールする必要があります。

Traefik Ingressコントローラー

Traefikは、マイクロサービスを簡単にデプロイするために作られた最新のHTTPリバースプロキシおよびロードバランサーです。アプリケーションの設計、デプロイ、および実行時のネットワークの複雑さを簡素化します。

Traefik Ingressコントローラーは、ポート80および443を使用するLoadBalancerサービスをデプロイし、管理するIngressリソースのステータスにLoadBalancerサービスの外部IPを広告します。

デフォルトでは、ServiceLBはクラスター内のすべてのノードを使用してTraefik LoadBalancerサービスをホストします。つまり、ポート80および443は他のHostPortまたはNodePortポッドには使用できず、IngressリソースのステータスにはクラスターのすべてのメンバーのノードIPが表示されます。

Traefikが使用するノードを制限し、拡張してIngressステータスに広告されるノードIPを制限するには、以下のServiceLBノード選択の制御セクションの指示に従って、ServiceLBが実行されるノードを制限するか、いくつかのノードをLoadBalancerプールに追加し、Traefikサービスをそのプールに制限するためにTraefik HelmChartConfigに一致するラベルを設定します。

Traefikはサーバーの起動時にデフォルトでデプロイされます。詳細についてはパッケージ化されたコンポーネントの管理を参照してください。デフォルトの設定ファイルは/var/lib/rancher/k3s/server/manifests/traefik.yamlにあります。

traefik.yamlファイルは手動で編集しないでください。K3sは起動時にデフォルトでファイルを置き換えます。代わりに、Traefikをカスタマイズするには、/var/lib/rancher/k3s/server/manifestsに追加のHelmChartConfigマニフェストを作成します。詳細および例についてはHelmChartConfigを使用したパッケージ化されたコンポーネントのカスタマイズを参照してください。可能な設定値については、公式のTraefik Helm設定パラメータを参照してください。

クラスターからTraefikを削除するには、すべてのサーバーを--disable=traefikフラグで起動します。

K3sにはTraefik v2が含まれています。K3sバージョン1.21から1.30はTraefik v2をインストールしますが、既存のTraefik v1のインストールが見つかった場合、Traefikはv2にアップグレードされません。K3sバージョン1.20およびそれ以前にはTraefik v1が含まれています。K3sに含まれる特定のTraefikバージョンについては、使用しているバージョンのリリースノートを参照してください。

古いTraefik v1インスタンスからの移行については、https://doc.traefik.io/traefik/migration/v1-to-v2/[Traefikドキュメント]および移行ツールを参照してください。

ネットワークポリシーコントローラー

K3sには埋め込みのネットワークポリシーコントローラーが含まれています。基盤となる実装はkube-routerのnetpolコントローラーライブラリ(他のkube-router機能は含まれていません)であり、https://github.com/k3s-io/k3s/tree/master/pkg/agent/netpol[こちら]にあります。

これを無効にするには、各サーバーを--disable-network-policyフラグで起動します。

K3sの設定を変更してネットワークポリシーコントローラーを無効にしても、ネットワークポリシーのiptablesルールは削除されません。ネットワークポリシーコントローラーを無効にした後に設定されたkube-routerネットワークポリシールールをクリーンアップするには、k3s-killall.shスクリプトを使用するか、iptables-saveおよびiptables-restoreを使用して手動でクリーンアップします。これらの手順はクラスター内のすべてのノードで手動で実行する必要があります。

iptables-save | grep -v KUBE-ROUTER | iptables-restore
ip6tables-save | grep -v KUBE-ROUTER | ip6tables-restore

サービスロードバランサー

任意のLoadBalancerコントローラーをK3sクラスターにデプロイできます。デフォルトでは、K3sは利用可能なホストポートを使用するServiceLB(以前はKlipper LoadBalancerとして知られていた)というロードバランサーを提供します。

上流のKubernetesでは、LoadBalancerタイプのサービスを作成できますが、デフォルトのロードバランサー実装は含まれていないため、これらのサービスはインストールされるまでpendingのままです。多くのホステッドサービスは、Amazon EC2やMicrosoft Azureなどのクラウドプロバイダーを必要とし、外部ロードバランサー実装を提供します。対照的に、K3sのServiceLBはクラウドプロバイダーや追加の設定なしでLoadBalancerサービスを使用できるようにします。

ServiceLBの動作

ServiceLBコントローラーは、spec.typeフィールドがLoadBalancerに設定されたKubernetesサービスを監視します。

The ServiceLB controller watches Kubernetes Services with the spec.type field set to LoadBalancer.

For each LoadBalancer Service, a (DaemonSet is created in the kube-system namespace. This DaemonSet in turn creates ServiceLB Pods with a svc- prefix, on each node. These pods leverage hostPort using the service port, hence they will only be deployed on nodes that have that port available. If there aren’t any nodes with that port available, the LB will remain Pending. Note that it is possible to expose multiple Services on the same node, as long as they use different ports.

When the ServiceLB Pod runs on a node that has an external IP configured, the node’s external IP is populated into the Service’s status.loadBalancer.ingress address list with ipMode: VIP. Otherwise, the node’s internal IP is used.

If the traffic to the external IP is subject to (Network Address Translation (NAT) - for example in public clouds when using the public IP of the node as external IP - the traffic is routed into the ServiceLB pod via the hostPort. The pod then uses iptables to forward traffic to the Service’s ClusterIP address and port. If the traffic is not subject to NAT and instead arrives with destination address matching the LoadBalancer address, traffic is intercepted (normally by kube-proxy iptables chains or ipvs) and forwarded to the Service’s ClusterIP address and port.

使用方法

K3sでLoadBalancerタイプのサービスを作成します。

Known Issue

If external traffic reaches the node using a NAT (e.g. in public clouds) and you require externalTrafficPolicy=local for purposes such as client source IP preservation, please do not define the k3s config node-external-ip for any of the nodes, as that will not work correctly

ServiceLBノード選択の制御

1つ以上のノードにsvccontroller.k3s.cattle.io/enablelb=trueラベルを追加すると、ServiceLBコントローラーが許可リストモードに切り替わり、ラベルが付いたノードのみがLoadBalancerポッドをホストする資格を持ちます。ラベルが付いていないノードはServiceLBの使用から除外されます。

デフォルトでは、ノードにはラベルが付いていません。すべてのノードがラベルなしのままである限り、ポートが利用可能なすべてのノードがServiceLBによって使用されます。

ServiceLBノードプールの作成

特定のサブセットのノードを選択してLoadBalancerのポッドをホストするには、目的のノードにenablelbラベルを追加し、ノードとサービスに一致するlbpoolラベル値を設定します。例えば:

  1. ノードAとノードBにsvccontroller.k3s.cattle.io/lbpool=pool1およびsvccontroller.k3s.cattle.io/enablelb=trueラベルを付けます。

  2. ノードCとノードDにsvccontroller.k3s.cattle.io/lbpool=pool2およびsvccontroller.k3s.cattle.io/enablelb=trueラベルを付けます。

  3. ポート443で1つのLoadBalancerサービスを作成し、svccontroller.k3s.cattle.io/lbpool=pool1ラベルを付けます。このサービスのDaemonSetはノードAとノードBにのみポッドをデプロイします。

  4. ポート443で別のLoadBalancerサービスを作成し、svccontroller.k3s.cattle.io/lbpool=pool2ラベルを付けます。DaemonSetはノードCとノードDにのみポッドをデプロイします。

ServiceLBの無効化

ServiceLBを無効にするには、クラスター内のすべてのサーバーを--disable=servicelbフラグで設定します。

これは、MetalLBなどの別のLBを実行する場合に必要です。

外部クラウドコントローラーマネージャーのデプロイ

バイナリサイズを削減するために、K3sはすべての「インツリー」(組み込み)クラウドプロバイダーを削除します。代わりに、K3sは以下のことを行う埋め込みのクラウドコントローラーマネージャー(CCM)スタブを提供します:

  • --node-ipおよび--node-external-ipフラグに基づいてノードのInternalIPおよびExternalIPアドレスフィールドを設定します。

  • ServiceLBロードバランサーコントローラーをホストします。

  • クラウドプロバイダーがexternalに設定されている場合に存在するnode.cloudprovider.kubernetes.io/uninitializedテイントをクリアします。

外部CCMをデプロイする前に、すべてのK3sサーバーを--disable-cloud-controllerフラグで起動して埋め込みCCMを無効にする必要があります。

組み込みのCCMを無効にし、適切に構成された外部の代替品をデプロイしない場合、ノードはテイントされたままでスケジュール不可能になります。