基本的なネットワークオプション
このページでは、Flannelの設定や置き換え、IPv6やデュアルスタックの設定を含むK3sのネットワーク設定オプションについて説明します。
Flannelオプション
Flannelは、Kubernetesコンテナネットワークインターフェース(CNI)を実装するレイヤー3ネットワークファブリックの軽量プロバイダーです。一般的にCNIプラグインと呼ばれます。
- Flannelオプションはサーバーノードでのみ設定でき、クラスター内のすべてのサーバーで同一である必要があります。
- Flannelのデフォルトバックエンドは
vxlan
です。暗号化を有効にするには、wireguard-native
バックエンドを使用します。 - 最近のバージョンのUbuntuを使用しているRaspberry Piで
vxlan
を使用するには、追加の準備が必要です。 - Flannelバックエンドとして
wireguard-native
を使用する場合、一部のLinuxディストリビューションでは追加のモジュールが必要になることがあります。詳細についてはWireGuardインストールガイドを参照してください。WireGuardのインストール手順に従うことで、適切なカーネルモジュールがインストールされます。WireGuard Flannelバックエンドを使用する前に、すべてのノード(サーバーとエージェント)でWireGuardカーネルモジュールが利用可能であることを確認する必要があります。
CLIフラグと値 | 説明 |
---|---|
--flannel-ipv6-masq | IPv6トラフィックにマスカレードルールを適用します(IPv4のデフォルト)。デュアルスタックまたはIPv6のみのクラスターにのみ適用されます。none 以外のFlannelバックエンドと互換性があります。 |
--flannel-external-ip | Flannelトラフィックの宛先として内部IPではなくノードの外部IPアドレスを使用します。ノードで--node-external-ipが設定されている場合にのみ適用されます。 |
--flannel-backend=vxlan | パケットをカプセル化するためにVXLANを使用します。Raspberry Piでは追加のカーネルモジュールが必要になる場合があります。 |
--flannel-backend=host-gw | ノードIPを介してポッドサブネットへのIPルートを使用します。クラスター内のすべてのノード間で直接レイヤー2接続が必要です。 |
--flannel-backend=wireguard-native | ネットワークトラフィックをカプセル化および暗号化するためにWireGuardを使用します。追加のカーネルモジュールが必要になる場合があります。 |
--flannel-backend=ipsec | swanctl バイナリを介してstrongSwan IPSecを使用してネットワークトラフィックを暗号化します。(非推奨; v1.27.0で削除予定) |
--flannel-backend=none | Flannelを完全に無効にします。 |
K3sは2022-12リリース(v1.26.0+k3s1、v1.25.5+k3s1、v1.24.9+k3s1、v1.23.15+k3s1)以降、strongSwanのswanctl
およびcharon
バイナリを含まなくなりました。これらのリリースにアップグレードまたはインストールする前に、ノードに正しいパッケージをインストールしてください。ipsec
バックエンドを使用する場合は特に注意が必要です。
wireguard
またはipsec
からwireguard-native
への移行
従来のwireguard
バックエンドはホストにwg
ツールのインストールが必要です。このバックエンドはK3s v1.26以降では利用できず、カーネルと直接インターフェースするwireguard-native
バックエンドが推奨されます。
従来のipsec
バックエンドはホストにswanctl
およびcharon
バイナリのインストールが必要です。このバックエンド はK3s v1.27以降では利用できず、wireguard-native
バックエンドが推奨されます。
ユーザーはできるだけ早く新しいバックエンドに移行することをお勧めします。移行には、ノードが新しい設定で起動する間の短期間のダウンタイムが必要です。以下の2つのステップに従ってください:
- すべてのサーバーノードでK3s設定を更新します。設定ファイルを使用している場合、
/etc/rancher/k3s/config.yaml
にflannel-backend: wireguard-native
を含め、flannel-backend: wireguard
またはflannel-backend: ipsec
を置き換えます。systemdユニットでCLIフラグを使用してK3sを設定している場合は、同等のフラグを変更します。 - サーバーから始めて、すべてのノードを再起動します。
カスタムCNI
--flannel-backend=none
でK3sを起動し、任意のCNIをインストールします。ほとんどのCNIプラグインには独自のネットワークポリシーエンジンが付属しているため、競合を避けるために--disable-network-policy
も設定することをお勧めします。考慮すべき重要な情報は次のとおりです:
- Canal
- Calico
- Cilium
Canal Docsウェブサイトを訪問し、Canalをインストールする手順に従います。Canal YAMLを修正して、container_settings
セクションでIP転送が許可されるようにします。例えば:
"container_settings": {
"allow_ip_forwarding": true
}
Canal YAMLを適用します。
ホストで次のコマンドを実行して設定が適用されたことを確認します:
cat /etc/cni/net.d/10-canal.conflist
IP転送がtrueに設定されていることを確認します。
Calico CNIプラグインガイドに従います。Calico YAMLを修正して、container_settings
セクションでIP転送が許可されるようにします。例えば:
"container_settings": {
"allow_ip_forwarding": true
}
Calico YAMLを適用します。
ホストで次のコマンドを実行して設定が適用されたことを確認します:
cat /etc/cni/net.d/10-calico.conflist
IP転送がtrueに設定されていることを確認します。
k3s-killall.sh
またはk3s-uninstall.sh
を実行する前に、cilium_host
、cilium_net
、およびcilium_vxlan
インターフェースを手動で削除する必要があります。これを行わないと、K3sが停止したときにホストへのネットワーク接続が失われる可能性があります。
ip link delete cilium_host
ip link delete cilium_net
ip link delete cilium_vxlan
さらに、ciliumのiptablesルールを削除する必要があります:
iptables-save | grep -iv cilium | iptables-restore
ip6tables-save | grep -iv cilium | ip6tables-restore
コントロールプレーンのEgress Selector設定
K3sエージェントとサーバーは、コントロールプレーン(apiserver)とエージェント(kubeletおよびcontainerd)コンポーネント間の双方向通信をカプセル化するために使用されるノード間のWebSocketトンネルを維持します。これにより、エージェントがkubeletおよびコンテナランタイムのストリーミングポートを外部接続に公開せずに動作でき、エージェントが無効になっている場合でもコントロールプレーンがクラスターサービスに接続できるようになります。この機能は、他のKubernetesディストリビューションで一般的に使用されるKonnectivityサービスと同等であり、apiserverのEgress Selector設定を介して管理されます。
デフォルトモードはagent
です。エージェントレスサーバーを実行する場合、pod
またはcluster
モードが推奨されます。これにより、flannelおよびkube-proxyがない場合でもapiserverがクラスターサービスエンドポイントにアクセスできるようになります。
Egress Selectorモードは、--egress-selector-mode
フラグを介してサーバーで設定でき、次の4つのモードを提供します:
disabled
: apiserverはkubeletやクラスターエンドポイントと通信するためにエージェントトンネルを使用しません。このモードでは、サーバーがkubelet、CNI、およびkube-proxyを実行し、エージェントに直接接続できる必要があります。そうでない場合、apiserverはサービスエンドポイントにアクセスできず、kubectl exec
およびkubectl logs
を実行できません。agent
(デフォルト): apiserverはkubeletと通信するためにエージェントトンネルを使用します。このモードでは、サーバーもkubelet、CNI、およびkube-proxyを実行する必要があります。そうでない場合、apiserverはサービスエンドポイントにアクセスできません。pod
: apiserverはkubeletおよびサービスエンドポイントと通信するためにエージェントトンネルを使用し、ノードおよびエンドポイントを監視してエンドポイント接続を正しいエージェントにルーティングします。
注意: このモードは、独自のIPAMを使用し、ノードのPodCIDR割り当てを尊重しないCNIを使用している場合には機能しません。これらのCNIを使用する場合は、cluster
またはagent
モードを使用する必要があります。cluster
: apiserverはkubeletおよびサービスエンドポイントと通信するためにエージェントトンネルを使用し、ポッドおよびエンドポイントを監視してエンドポイント接続を正しいエージェントにルーティングします。このモードは、異なるクラスター構成間での移植性が最も高いですが、オーバーヘッドが増加します。
デュアルスタック(IPv4 + IPv6)ネットワーキ ング
v1.21.0+k3s1から実験的サポートが利用可能です。
v1.23.7+k3s1から安定したサポートが利用可能です。
1.27以前では、KubernetesのIssue #111695により、デュアルスタック環境でクラスター通信にプライマリネットワークインターフェースを使用していない場合、KubeletがノードのIPv6 アドレスを無視します。このバグを回避するには、1.27以降を使用するか、次のフラグをK3sサーバーおよびエージェントの両方に追加します:
--kubelet-arg="node-ip=0.0.0.0" # IPv4トラフィックを優先する場合
#または
--kubelet-arg="node-ip=::" # IPv6トラフィックを優先する場合
デュアルスタックネットワーキングは、クラスターが最初に作成されるときに設定する必要があります。IPv4のみで開始された既存のクラスターでは有効にできません。
K3sでデュアルスタックを有効にするには、すべてのサーバーノードで有効なデュアルスタックcluster-cidr
およびservice-cidr
を提供する必要があります。以下は有効な設定の例です:
--cluster-cidr=10.42.0.0/16,2001:cafe:42::/56 --service-cidr=10.43.0.0/16,2001:cafe:43::/112
有効なcluster-cidr
およびservice-cidr
値を設定できますが、上記のマスクが推奨されます。cluster-cidr
マスクを変更する場合は、計画されたノードごとのポッド数および総ノード数に合わせてnode-cidr-mask-size-ipv4
およびnode-cidr-mask-size-ipv6
値も変更する必要があります。サポートされる最大のservice-cidr
マスクはIPv4の場合は/12、IPv6の場合は/112です。パブリッククラウドにデプロイする場合は、IPv6トラフィックを許可することを忘れないでください。
カスタムCNIプラグイン、つまりFlannel以外のCNIプラグインを使用している場合、追加の設定が必要になることがあります。プラグインのデュ アルスタックドキュメントを参照し、ネットワークポリシーが有効にできるか確認してください。
クラスタCIDRおよびサービスCIDRをIPv6を主要ファミリーとして定義する場合、すべてのクラスタメンバーのノードIPを明示的に設定し、ノードの希望するIPv6アドレスを最初のアドレスとして配置する必要があります。デフォルトでは、kubeletは常にIPv4を主要アドレスファミリーとして使用します。
シングルスタックIPv6ネットワーキング
v1.22.9+k3s1から利用可能
IPv6のデフォルトルートがルーター広告(RA)によって設定されている場合、sysctl net.ipv6.conf.all.accept_ra=2
を設定する必要があります。そうしないと、ノードはデフォルトルートが期限切れになるとドロップします。RAを受け入れることは、中間者攻撃のリスクを高める可能性があることに注意してください。
シングルスタックIPv6クラスタ(IPv4を含まないクラスタ)は、--cluster-cidr
および--service-cidr
フラグを使用してK3sでサポートされています。以下は有効な設定の例です:
--cluster-cidr=2001:cafe:42::/56 --service-cidr=2001:cafe:43::/112