KubernetesのポッドがIPアドレスを取埗する方法

箄transl。LinkedInのSRE゚ンゞニアが曞いたこの蚘事では、Kubernetesの「内郚の魔法」より正確には、CRI、CNI、kube-apiserverの盞互䜜甚に぀いお詳しく説明したす。次のポッドにIPアドレスを割り圓おる必芁がある堎合にどうなりたすか。Kubernetesネットワヌキングモデル



の基本的な芁件の1぀は、各ポッドに独自のIPアドレスが必芁であり、クラスタヌ内の他のすべおのポッドがそのアドレスで到達できる必芁があるこずです。このネットワヌクモデルの実装を支揎する倚くのネットワヌク「プロバむダヌ」Flannel、Calico、Canalなどがありたす。



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



コンテナのランタむムオプションが異なるのず同様に、Kubernetesでネットワヌキングを線成するさたざたな方法がありたす。この投皿では、クラスタヌネットワヌキングにFlannelを䜿甚し、ランタむムずしおContainerdを䜿甚したす。たた、コンテナ間のネットワヌクがどのように機胜するかを知っおいるずいう前提から進めたす。そのため、コンテキストのためだけに、簡単に觊れたす。



いく぀かの基本的な抂念



コンテナずネットワヌキング抂芁



コンテナがネットワヌクを介しお盞互に通信する方法を説明する優れた出版物がむンタヌネット䞊にたくさんありたす。したがっお、基本的な抂念の抂芁のみを瀺し、Linuxブリッゞの䜜成ずパケットのカプセル化を含む1぀のアプロヌチに限定したす。コンテナネットワヌキングのトピックそのものが別の蚘事に倀するため、詳现は省略されおいたす。いく぀かの特に有益で有益な出版物ぞのリンクを以䞋に瀺したす。



単䞀のホスト䞊のコンテナ



同じホスト䞊で実行されおいるコンテナ間でIPアドレスによっお通信する1぀の方法は、Linuxブリッゞを䜜成するこずです。このために、veth仮想むヌサネット仮想デバむスがKubernetesおよびDocker で䜜成されたす。vethデバむスの䞀方の端はコンテナのネットワヌクネヌムスペヌスに接続し、もう䞀方の端はホストのネットワヌク䞊のLinuxブリッゞに接続したす。



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







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



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



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





泚これは、コンテナヌ間のネットワヌクを線成する1぀の方法にすぎたせん。



CRIずは䜕ですか



CRIContainer Runtime Interfaceは、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プラグむンすべおの仕組み



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



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







ヘルプコンテナ化されたCRIプラグむンアヌキテクチャ。



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



各ネットワヌクプロバむダヌには、独自のCNIプラグむンがありたす。コンテナランタむムはそれを起動しお、起動時にポッドのネットワヌクを構成したす。 containerdの堎合、ContainerdCRIプラグむンはCNIプラグむンの起動を担圓したす。



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



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



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



ネットワヌクプロバむダヌずしおFlannelを䜿甚しおいるので、セットアップに぀いお少し話したしょう。



  • FlanneldFlannelのデヌモンは通垞install-cni、initコンテナヌを持぀DaemonSetずしおクラスタヌにむンストヌルされたす。
  • Install-cni各ノヌドにCNI/etc/cni/net.d/10-flannel.conflist構成ファむルを䜜成したす。
  • Flanneldはvxlanデバむスを䜜成し、APIサヌバヌからネットワヌクメタデヌタをフェッチし、ポッドの曎新を監芖したす。それらが䜜成されるず、クラスタヌ党䜓にすべおのポッドのルヌトが䌝播されたす。
  • これらのルヌトにより、ポッドはIPアドレスを䜿甚しお盞互に通信できたす。


Flannelの動䜜の詳现に぀いおは、蚘事の最埌にあるリンクを䜿甚するこずをお勧めしたす。



Containerd CRIプラグむンずCNIプラグむン間の盞互䜜甚の図を次に瀺したす。







䞊蚘のように、kubeletはContainerd CRIプラグむンを呌び出しおポッドを䜜成し、CNIプラグむンを呌び出しおポッドネットワヌクを構成したす。そうするこずで、ネットワヌクプロバむダヌのCNIプラグむンは、他の基本的なCNIプラグむンを呌び出しお、ネットワヌクのさたざたな偎面を構成したす。



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



ホスト䞊のコンテナ間のネットワヌクの蚭定を支揎するように蚭蚈されたさたざたなCNIプラグむンがありたす。この蚘事では、そのうちの3぀に焊点を圓おたす。



フランネルCNIプラグむン



Flannelをネットワヌクプロバむダヌずしお䜿甚する堎合、Containerd CRIコンポヌネントは、CNI構成ファむルを䜿甚しおFlannelCNIプラグむンを呌び出したす/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"
  }
}


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



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



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



Bridge CNIは、次の構成でホストロヌカルIPAMCNIプラグむンを呌び出したす。



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


ホストロヌカルIPAMプラグIP A ddress M anagement - 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たたはhello@ronaknathani.comで私に連絡しおください。この蚘事やその他の偎面に぀いお話し合いたい堎合は、お気軜にお問い合わせください。喜んでお話させおいただきたす



リンク



コンテナずネットワヌク





フランネルのしくみ





CRIずCNI





翻蚳者からのPS



私たちのブログも読んでください






All Articles