えくすぽーと備忘録

ただの備忘録です。過度な期待はしないでください。

RKE2 + Windows ノードで Calico の blockSize を変更して Pod を 61 個以上動かす方法

みなさん。 k8s 使ってますか?
わたしは CKA の勉強をすると決めて 6か月くらい経ちました。
はやく受験しろって感じですけど、ちょっと実験したことがあったので記事にします。
ちなみにこの記事を読んでも CKA には何の関係もありません。

RKE2 の Windows ワーカーノードでは、Calico のデフォルト設定だと /26(64 IP) が割り当てられます。
ただし Windows ノードでは各ブロックで 4 IP が予約されるため、実際に使えるのは 60 IP しかありません。
そのため、Pod を 61 個以上動かそうとすると IP が枯渇してしまいます。

この記事では、blockSize を拡張して 61 個以上の Pod を収容できるようにした手順を備忘録として残します。 Windows Server を購入できるほどのお金はないので、今回の検証では評価版の Windows Server を利用しました。 RKE2 では、2025年9月現在 Windows Server 2022 までをサポートしているようです。

docs.rke2.io

さて、以下から記事本文です。

検証環境
- RKE2 - Calico (VXLAN)
- Windows Server 2022 評価版(ワーカーノード)

Ubuntu Desktop を Rancher 実行環境として、 master ノードに Ubuntu Server 、 worker ノードに Windows Server 2022 という構成です。 検証には、 VMware Workstation Pro を利用しました。 VMware Workstation Pro が無償になってくれてありがたいですね。

ポイント
- /25 にすると 128 - 4 = 124 IP
- /24 にすると 256 - 4 = 252 IP
- HelmChartConfig (rke2-calico) を編集するのが正規の方法


手順

以下の手順で対応できます。

  1. HelmChartConfig を編集する
  2. 既存ブロックの対応

以下は詳細な手順です。

HelmChartConfig を編集する

以下の HelmChartConfig は、作成したクラスタの More Resources の Helm にあります。

HelmChartConfigs
HelmChartConfigs

rke2-calico
rke2-calico

この設定を以下の設定に変更します。

spec:
  failurePolicy: reinstall
  valuesContent: |-
    global:
      cattle:
        clusterId: c-m-2xbcc2vw
    installation:
      calicoNetwork:
        ipPools:
          - cidr: 10.42.0.0/16
            encapsulation: VXLAN
            natOutgoing: Enabled
            nodeSelector: all()
            blockSize: 25   # ★ここを25や24に設定

RKE2 では Calico が Helm チャートとして組み込まれており、
HelmChartConfig (rke2-calico) に設定を書けば、デフォルト値を上書きできます。
つまり「自分で設定を書かない限り、勝手に変な変更が起きることはない」ので安心して使えます。 以下は、今回設定した項目に関する詳細です。

キー RKE2 デフォルト値 今回の変更
calicoNetwork.ipPools[0].cidr 10.42.0.0/16 変更なし
calicoNetwork.ipPools[0].encapsulation VXLAN 変更なし
calicoNetwork.ipPools[0].natOutgoing Enabled 変更なし
calicoNetwork.ipPools[0].blockSize /26(=64 IP, Windows では実効 60 IP) /24 に拡張(=252 IP 利用可能)

詳細を知りたい方は、Calico Installation API リファレンス や RKE2 Networking (公式ドキュメント) をご参照ください。

既存ブロックの対応

公式が推奨している方法がありますが、今回は新規でクラスタを作成したので、以下に示す方法2 で対応することにしました。

  • 方法1: 一時的に別の IPPool を作って Pod を移行し、旧 Pool を削除する(Calico 公式推奨)。
  • 方法2: 今回は簡易的に以下で対応。

    1. Helm の設定変更を反映
    2. Calico の IPPool を削除(すぐに再作成される)
    3. Windows ノードを drain
    4. Windows ノードに割り当てられている BlockAffinity と IPAMBlock を削除
    5. Windows ノードを再起動して uncordon
    6. BlockAffinity や IPAMBlock が作成されて、 新しい /24 のブロックが割り当てられることを確認

sample-blockaffinity-delete
sample-blockaffinity-delete


結果

  • /24 に変更したことで、1ノードあたり実効 252 IP が利用可能に。
  • Pod を 61 個以上起動しても IP 枯渇せずに動作。

result-61-pod-in-windows-node
result-61-pod-in-windows-node


まとめ

  • RKE2 の Windows ノードはデフォルトだと 60 Pod で IP が尽きる。
  • HelmChartConfig (rke2-calico) で blockSize を拡張することで解決できる。