Calico ネットワークプラグインの探索と実践

本記事では、KubernetesクラスターにおけるCalicoネットワークプラグインの設定と実践について深く掘り下げ、一般的なトラブルシューティングの方法とネットワーク最適化戦略を分析します。

Calico ネットワークプラグインの探索と実践

概要

CalicoはKubernetesエコシステムで広く使用されているコンテナネットワークインターフェース(CNI)プラグインであり、高性能なネットワーク接続と柔軟なネットワークポリシー管理を提供します。本記事は本番環境での実践に基づき、Calicoのコア機能と設定の要点を深く分析します。

コア機能アーキテクチャ

CalicoはL3ルーティングモデルを採用してコンテナ間通信を実現しており、主なコンポーネントは以下の通りです:

  • Felix:各ノードで実行されるデーモンプロセスで、ルーティング設定とACLルールを担当します
  • BIRD:ルーティング配布コンポーネントで、ノード間のルーティング情報交換を実装します
  • confd:動的設定生成ツール
  • CNI プラグイン:Kubernetesネットワークモデルとの連携を行います

設定管理と実践

IPアドレスプールの設定

ネットワークアーキテクチャの原理

graph TD
    subgraph Kubernetesクラスター
        node1[ノード1] -->|BGPルート| node2[ノード2]
        node1 -->|VXLANトンネル| node3[ノード3]
        node2 -->|IPIPトンネル| node3
    end
    node1 --> pod1[Pod]
    node2 --> pod2[Pod]
    node3 --> pod3[Pod]
[root@k8s-03:~/.kube 20:41 $]k get ippools.crd.projectcalico.org -o yaml
apiVersion: v1
items:
- apiVersion: crd.projectcalico.org/v1
  kind: IPPool
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"crd.projectcalico.org/v1","kind":"IPPool","metadata":{"annotations":{},"generation":1,"name":"default-ipv4-ippool"},"spec":{"allowedUses":["Workload","Tunnel"],"blockSize":26,"cidr":"192.168.0.0/16","ipipMode":"Never","natOutgoing":true,"nodeSelector":"all()","vxlanMode":"Always"}}
      projectcalico.org/metadata: '{"uid":"0891de51-013e-4a44-9cb6-0c142f480567","creationTimestamp":"2023-05-26T07:36:30Z"}'
    creationTimestamp: "2023-05-26T07:36:30Z"
    generation: 3
    name: default-ipv4-ippool
    resourceVersion: "37479"
    uid: de7868c1-ad93-4441-aa22-9198d07822f5
  spec:
    allowedUses:
    - Workload
    - Tunnel
    blockSize: 26
    cidr: 192.168.0.0/16
    ipipMode: Never
    natOutgoing: true
    nodeSelector: all()
    vxlanMode: Always
kind: List
metadata:
  resourceVersion: ""

[root@k8s-03:~/.kube 20:41 $]k edit ippools.crd.projectcalico.org default-ipv4-ippool

設定変更の注意点

  1. IPPoolを変更した後、設定を有効にするためにcalico-nodeコンポーネントを再起動する必要があります
  2. CIDRの変更は既存のPodネットワークの中断を引き起こす可能性があるため、慎重に操作する必要があります
  3. VXLAN/IPIPモードの選択では、ネットワークパフォーマンスと互換性を考慮する必要があります

詳細な設定手順

IPPool設定の変更

  1. 現在の設定を取得します:
    kubectl get ippools.crd.projectcalico.org -o yaml
    
  2. 設定を編集します:
    kubectl edit ippools.crd.projectcalico.org default-ipv4-ippool
    
  3. 主なパラメータの説明:
    • cidr: PodネットワークのCIDR範囲
    • vxlanMode: AlwaysでVXLANを有効化
    • ipipMode: NeverでIPIPを無効化
    • natOutgoing: trueで発信NATを有効化

一般的なトラブルシューティング

ノード間通信の失敗

flowchart TD
    A[ノード間ネットワーク不通] --> B{モード確認}
    B -->|VXLAN| C[UDP 4789ポート確認]
    B -->|IPIP| D[プロトコル番号4確認]
    C --> E[ファイアウォール設定]
    D --> E
    E --> F[問題解決]

設定確認コマンド

# Calicoノードのステータス確認
calicoctl node status

# ルーティングテーブルの表示
ip route show

パフォーマンス最適化の提案

  1. 大規模クラスターではVXLANの代わりにBGPを使用する
  2. eBPFデータプレーンを有効にしてパフォーマンスを向上させる
  3. IPアドレスブロックサイズを適切に設定する

参考ドキュメント