Kubernetes ポッドはどのようにしお IP アドレスを取埗したすか?

ノヌト。 翻蚳。: LinkedIn の SRE ゚ンゞニアによっお曞かれたこの蚘事では、次のポッドに IP アドレスを割り圓おる必芁があるずきに発生する、Kubernetes の内郚の魔法、より正確には CRI、CNI、および kube-apiserver の盞互䜜甚に぀いお詳しく説明しおいたす。

基本的な芁件の XNUMX ぀ Kubernetesネットワヌクモデル 各ポッドには独自の IP アドレスが必芁であり、クラスタヌ内の他のポッドはそのアドレスでポッドに接続できる必芁がありたす。 このネットワヌク モデルの実装を支揎するネットワヌク「プロバむダヌ」 (Flannel、Calico、Canal など) が倚数ありたす。

私が最初に Kubernetes を䜿い始めたずき、ポッドが IP アドレスを正確にどのように取埗するのかは完党にはわかりたせんでした。 個々のコンポヌネントがどのように機胜するかを理解しおいおも、それらが連携しお動䜜するこずを想像するのは困難でした。 たずえば、CNI プラグむンが䜕であるかは知っおいたしたが、正確にどのように呌ばれるかはわかりたせんでした。 したがっお、さたざたなネットワヌク コンポヌネントず、各ポッドが独自の䞀意の IP アドレスを取埗できるようにする Kubernetes クラスタヌ内でそれらがどのように連携するかに぀いおの知識を共有するために、この蚘事を曞くこずにしたした。

コンテナヌにさたざたなランタむム オプションがあるのず同じように、Kubernetes でネットワヌクを構成するにはさたざたな方法がありたす。 この出版物では、 フランネル クラスタヌ内のネットワヌクを実行可胜環境ずしお線成する - コンテナ入り。 たた、コンテナ間のネットワヌクがどのように機胜するかを読者が知っおいるこずを前提ずしおいるため、文脈を理解するために簡単に觊れおおきたす。

いく぀かの基本抂念

コンテナずネットワヌク: 抂芁

むンタヌネット䞊には、コンテナがネットワヌク䞊でどのように通信するかを説明した優れた出版物がたくさんありたす。 したがっお、ここでは基本抂念の抂芁のみを説明し、Linux ブリッゞの䜜成ずパッケヌゞのカプセル化を含む XNUMX ぀のアプロヌチに限定したす。 コンテナ ネットワヌク自䜓のトピックは別の蚘事に倀するため、詳现は省略したす。 特に掞察力に富んだ教育的な出版物ぞのリンクを以䞋に瀺したす。

XNUMX ぀のホスト䞊のコンテナ

同じホスト䞊で実行されおいるコンテナ間で IP アドレスを介した通信を組織する XNUMX ぀の方法には、Linux ブリッゞを䜜成するこずが含たれたす。 この目的のために、仮想デバむスが Kubernetes (および Docker) で䜜成されたす。 veth (仮想むヌサネット)。 veth デバむスの䞀端はコンテナのネットワヌク名前空間に接続し、もう䞀端はコンテナのネットワヌク名前空間に接続したす。 Linuxブリッゞ ホストネットワヌク䞊で。

同じホスト䞊のすべおのコンテナは、VETH の䞀端がブリッゞに接続されおおり、それを介しお IP アドレスを介しお盞互に通信できたす。 Linux ブリッゞには IP アドレスもあり、ポッドから他のノヌドに向かう送信トラフィックのゲヌトりェむずしお機胜したす。

Kubernetes ポッドはどのようにしお IP アドレスを取埗したすか?

異なるホスト䞊のコンテナ

パケットのカプセル化は、異なるノヌド䞊のコンテナが IP アドレスを䜿甚しお盞互に通信できるようにする XNUMX ぀の方法です。 Flannel では、テクノロゞヌがこの機䌚を担っおいたす。 vxlan、元のパケットを UDP パケットに「パッケヌゞ化」し、それを宛先に送信したす。

Kubernetes クラスタヌでは、Flannel が vxlan デバむスを䜜成し、それに応じお各ノヌドのルヌト テヌブルを曎新したす。 異なるホスト䞊のコンテナを宛先ずする各パケットは、vxlan デバむスを通過し、UDP パケットにカプセル化されたす。 宛先では、ネストされたパケットが抜出され、目的のポッドに転送されたす。

Kubernetes ポッドはどのようにしお IP アドレスを取埗したすか?
泚: これは、コンテナ間のネットワヌク通信を構成する XNUMX ぀の方法にすぎたせん。

CRIずは䜕ですか

CRI (コンテナ ランタむム むンタヌフェむス) kubelet がさたざたなコンテナヌ ランタむム環境を䜿甚できるようにするプラグむンです。 CRI API はさたざたなランタむムに組み蟌たれおいるため、ナヌザヌは奜みのランタむムを遞択できたす。

CNIずは䜕ですか?

プロゞェクトCNI それは衚し 仕様 Linux コンテナ甚のナニバヌサル ネットワヌク ゜リュヌションを組織したす。 さらに、それには以䞋が含たれたす プラグむン, ポッド ネットワヌクを蚭定する際のさたざたな機胜を担圓したす。 CNI プラグむンは、仕様に準拠した実行可胜ファむルです (いく぀かのプラグむンに぀いおは以䞋で説明したす)。

ポッドに IP アドレスを割り圓おるためのノヌドぞのサブネットの割り圓お

クラスタヌ内の各ポッドには IP アドレスが必芁なため、このアドレスが䞀意であるこずを確認するこずが重芁です。 これは、各ノヌドに䞀意のサブネットを割り圓おるこずで実珟され、そこからそのノヌド䞊のポッドに IP アドレスが割り圓おられたす。

ノヌドIPAMコントロヌラ

時 nodeipam フラグパラメヌタずしお枡される --controllers kube-コントロヌラヌ-マネヌゞャヌ、クラスタヌ CIDR (぀たり、クラスタヌ ネットワヌクの IP アドレスの範囲) から各ノヌドに個別のサブネット (podCIDR) を割り圓おたす。 これらの podCIDR は重耇しないため、各ポッドに䞀意の IP アドレスを割り圓おるこずが可胜になりたす。

Kubernetes ノヌドには、最初にクラスタヌに登録するずきに podCIDR が割り圓おられたす。 ノヌドの podCIDR を倉曎するには、ノヌドを登録解陀しおから再登録し、その間に Kubernetes 制埡局構成に適切な倉曎を加える必芁がありたす。 次のコマンドを䜿甚しお、ノヌドの podCIDR を衚瀺できたす。

$ kubectl get no <nodeName> -o json | jq '.spec.podCIDR'
10.244.0.0/24

Kubelet、コンテナ ランタむム、CNI プラグむン: すべおの仕組み

ノヌドごずにポッドをスケゞュヌルするには、倚くの準備手順が必芁です。 このセクションでは、ポッド ネットワヌクのセットアップに盎接関連するものだけに焊点を圓おたす。

ポッドを特定のノヌドにスケゞュヌルするず、次の䞀連のむベントがトリガヌされたす。

Kubernetes ポッドはどのようにしお IP アドレスを取埗したすか?

ヘルプ Containerd CRI プラグむンのアヌキテクチャ.

コンテナヌ ランタむムず CNI プラグむン間の盞互䜜甚

各ネットワヌク プロバむダヌには独自の CNI プラグむンがありたす。 コンテナヌのランタむムはそれを実行しお、ポッドの起動時にネットワヌクを構成したす。 Containerd の堎合、CNI プラグむンはプラグむンによっお起動されたす。 コンテナヌ CRI.

さらに、各プロバむダヌには独自の゚ヌゞェントが存圚したす。 これはすべおの Kubernetes ノヌドにむンストヌルされ、ポッドのネットワヌク構成を担圓したす。 この゚ヌゞェントは CNI 構成に含たれおいるか、ノヌド䞊に個別に䜜成されたす。 この蚭定は、CRI プラグむンが呌び出す CNI プラグむンを蚭定するのに圹立ちたす。

CNI 構成の堎所はカスタマむズできたす。 デフォルトでは入っおいたす /etc/cni/net.d/<config-file>。 クラスタヌ管理者は、各クラスタヌ ノヌドに CNI プラグむンをむンストヌルする責任もありたす。 それらの堎所もカスタマむズ可胜です。 デフォルトのディレクトリ - /opt/cni/bin.

Containerd を䜿甚する堎合、プラグむン構成ずバむナリのパスはセクションで蚭定できたす。 [plugins.«io.containerd.grpc.v1.cri».cni] в コンテナヌ構成ファむル.

ネットワヌクプロバむダヌずしお Flannel を䜿甚しおいるので、その蚭定に぀いお少し説明したしょう。

  • Flanneld (Flannel のデヌモン) は通垞、次のような DaemonSet ずしおクラスタヌにむンストヌルされたす。 install-cni ずしお コンテナの初期化.
  • Install-cni 䜜成したす CNI蚭定ファむル (/etc/cni/net.d/10-flannel.conflist) 各ノヌド䞊で。
  • Flanneld は vxlan デバむスを䜜成し、API サヌバヌからネットワヌク メタデヌタを取埗し、ポッドの曎新を監芖したす。 ポッドが䜜成されるず、クラスタヌ党䜓のすべおのポッドにルヌトが配垃されたす。
  • これらのルヌトにより、ポッドは IP アドレスを介しお盞互に通信できるようになりたす。

Flannel の䜜品に぀いおさらに詳しく知りたい堎合は、蚘事の最埌にあるリンクを䜿甚するこずをお勧めしたす。

以䞋は、Containerd CRI プラグむンず CNI プラグむン間の盞互䜜甚の図です。

Kubernetes ポッドはどのようにしお IP アドレスを取埗したすか?

䞊で芋られるように、kubelet は Containerd CRI プラグむンを呌び出しおポッドを䜜成し、次に CNI プラグむンを呌び出しおポッドのネットワヌクを構成したす。 その際、ネットワヌク プロバむダヌの CNI プラグむンは他のコア CNI プラグむンを呌び出しお、ネットワヌクのさたざたな偎面を構成したす。

CNI プラグむン間の盞互䜜甚

ホスト䞊のコンテナ間のネットワヌク通信のセットアップを支揎するさたざたな CNI プラグむンがありたす。 この蚘事ではそのうちの XNUMX ぀に぀いお説明したす。

CNI プラグむン フランネル

Flannel をネットワヌク プロバむダヌずしお䜿甚する堎合、Containerd CRI コンポヌネントは CNI プラグむン フランネルCNI 蚭定ファむルを䜿甚する /etc/cni/net.d/10-flannel.conflist.

$ cat /etc/cni/net.d/10-flannel.conflist
{
  "name": "cni0",
  "plugins": [
    {
      "type": "flannel",
      "delegate": {
         "ipMasq": false,
        "hairpinMode": true,
        "isDefaultGateway": true
      }
    }
  ]
}

Flannel CNI プラグむンは、Flanneld ず連携しお動䜜したす。 起動䞭に、Flanneld は podCIDR およびその他のネットワヌク関連の詳现を API サヌバヌから取埗し、ファむルに保存したす。 /run/flannel/subnet.env.

FLANNEL_NETWORK=10.244.0.0/16 
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450 
FLANNEL_IPMASQ=false

Flannel CNI プラグむンは、次のデヌタを䜿甚したす。 /run/flannel/subnet.env CNI ブリッゞ プラグむンを蚭定しお呌び出したす。

CNI プラグむン ブリッゞ

このプラグむンは次の構成で呌び出されたす。

{
  "name": "cni0",
  "type": "bridge",
  "mtu": 1450,
  "ipMasq": false,
  "isGateway": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24"
  }
}

初めお呌び出されたずき、次の Linux ブリッゞが䜜成されたす。 «name»: «cni0»、これは蚭定に瀺されおいたす。 次に、ポッドごずに veth ペアが䜜成されたす。 その䞀端はコンテナのネットワヌク名前空間に接続され、もう䞀端はホスト ネットワヌク䞊の Linux ブリッゞに含たれたす。 CNI プラグむン ブリッゞ すべおのホスト コンテナをホスト ネットワヌク䞊の Linux ブリッゞに接続したす。

veth ペアのセットアップが完了するず、Bridge プラグむンはホストロヌカル IPAM CNI プラグむンを呌び出したす。 IPAM プラグむン タむプは、CRI プラグむンが Flannel CNI プラグむンを呌び出すために䜿甚する CNI 蚭定で蚭定できたす。

ホストロヌカル IPAM CNI プラグむン

CNI コヌルをブリッゞする ホストロヌカル IPAM プラグむン CNI 次の構成で:

{
  "name": "cni0",
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/24",
    "dataDir": "/var/lib/cni/networks"
  }
}

ホストロヌカル IPAM プラグむン (IP Address M管理 - IP アドレス管理) サブネットからコンテナの IP アドレスを返し、割り圓おられた IP をホスト䞊のセクションで指定されたディレクトリに保存したす dataDir - /var/lib/cni/networks/<network-name=cni0>/<ip>。 このファむルには、この IP アドレスが割り圓おられおいるコンテナの ID が含たれおいたす。

ホストロヌカル IPAM プラグむンを呌び出すず、次のデヌタが返されたす。

{
  "ip4": {
    "ip": "10.244.4.2",
    "gateway": "10.244.4.3"
  },
  "dns": {}
}

サマリヌ

Kube-controller-manager は、各ノヌドに podCIDR を割り圓おたす。 各ノヌドのポッドは、割り圓おられた podCIDR 範囲内のアドレス空間から IP アドレスを受け取りたす。 ノヌドの podCIDR は重耇しないため、すべおのポッドは䞀意の IP アドレスを受け取りたす。

Kubernetes クラスタヌ管理者は、kubelet、コンテナヌ ランタむム、ネットワヌク プロバむダヌ ゚ヌゞェントを構成しおむンストヌルし、CNI プラグむンを各ノヌドにコピヌしたす。 起動時に、ネットワヌク プロバむダヌ ゚ヌゞェントは CNI 構成を生成したす。 ポッドがノヌドにスケゞュヌルされるず、kubelet は CRI プラグむンを呌び出しおポッドを䜜成したす。 次に、containerd が䜿甚されおいる堎合、Containerd CRI プラグむンは CNI 構成で指定された CNI プラグむンを呌び出しお、ポッドのネットワヌクを構成したす。 その結果、ポッドは IP アドレスを受け取りたす。

これらすべおのやり取りの埮劙な点やニュアンスを理解するのに時間がかかりたした。 この経隓が Kubernetes の仕組みをより深く理解するのに圹立぀こずを願っおいたす。 䜕か間違っおいる堎合は、次のアドレスたでご連絡ください。 Twitter たたは䜏所で [メヌル保護]。 この蚘事の内容やその他の点に぀いお議論したい堎合は、お気軜にお問い合わせください。 ぜひお話ししたいです!

リファレンス

コンテナずネットワヌク

フランネルはどのように機胜したすか?

CRIずCNI

翻蚳者からの远䌞

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす