7
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【K8s】Kubernetesのネットワークを理解するまで

Last updated at Posted at 2020-01-18

Kubernetesのネットワークを理解するまで

※ Kubernetesのネットワークを理解するまでに調べたことを書いていっています。

内容

  • 基礎知識の復習
  • Dockerのネットワーク
  • Kubernetesのネットワーク

基礎知識の復習

OSI参照モデル

下記がOSI参照モデルになります。
image.png

詳細は下記を参考にすれば問題ないと思います。
OSI参照モデルまとめ
OSI reference model

TCP/IPモデル

上記のOSI参照モデルを実運用で使いやすくしたモデルをTCP/IPモデルと呼びます。
TCP/IP 4階層モデルとは?
「OSI参照モデル」と「TCP/IPモデル」の違い

下記の右側がTCP/IPモデルになります。
OSI参照モデルをよりシンプルにしていることがわかります。
image.png

インターネット通信の流れ

PCからPCにアクセスする流れは、上記のアプリケーション層から順に降っていき、第1層になったタイミングで電気信号になり、送り先のPCに送られます。この電気信号を受信したPCは、物理層から順に上がっていき、アプリケーション層に到達することができます。
この時の電気信号は、ルーターを経由することによって、目的地まで運ぶことが可能になっています。

  1. 運搬に必要な情報をデータに付与する
  1. そのデータを目的地まで運ぶ
  2. 到着したら、付与された情報を紐解きつつ、データを指定アプリケーションまで届ける

データの流れは下記のようになります。
image.png

各層での役割

  • マシンがある(物理層)
  • イーサネット(ネットワークインターフェース層)
  • IPアドレスを元に通信(インターネット層)
  • TCPでアプリケーションプログラムの通信を実現(トランスポート層)
  • クライアント、サーバーモデルが動作(アプリケーション層)

インターネット通信の流れ
通信周りに疎いエンジニアがTCP/IPの要点を頑張って教えます

基礎用語の確認

イーサネット

LANに採用されている通信規格のこと
LANのこと

イーサネット (Ethernet)とは

Wifi

イーサネットの無線版となる存在が「WiFi」です。
イーサネットとは?用途別のケーブルの選び方まですべて解説!

TCP

通信データが受信側に確実に届くことを保証するプロトコルです。
信頼性を重視します。

UDP

信頼性のないデータグラム型のプロトコルです。
DNSで主に使用されています。

ART

IPアドレスからEthernetのMACアドレスの情報を得られるプロトコルです。LANに接続されたコンピュータ間で通信するためには、IPパケットは下位のレイヤでL2ヘッダが付加された上で伝送されることからMACアドレスの情報が必要となります。しかしこれらのIPアドレスとMACアドレスは自動的な関連づけがないので、ARPでMACアドレスを得る必要があります。

TCP/IP - ARP
ARPとは

ルーター

IPアドレスが付与され、経路制御を行う機器のことを指します。
ルーターをホップしていくことで目的のIPアドレスに到達することができます。
ルーターの中身は、ルーティングテーブルという情報を持っており、この情報に次にどのルーターへ送れば良いかが記載されています。

NAT

プライベートIPアドレスをグローバルIPアドレスに変換する技術です。

NATに関して可能な限り分かりやすくまとめて見た

MACアドレスとIPアドレス

MACアドレスが人で、IPアドレスが住所(変わることがある)という例が非常にわかりやすいです。
MACアドレスとIPアドレスの違い

IPアドレス種類

IPアドレスには、プライベートとグローバルの2種類が存在し、それぞれに静的、動的IPアドレスが存在しています。
用語集 「IPアドレスとは?」

プライベートIPアドレスとグローバルIPアドレス

プライベートIPアドレスとは、インターネットに接続しないタイプのIPアドレス

プライベートIPアドレスとは、LANなどの企業内ネットワークに存在する端末が、自由に使用できるIPアドレスのこと。自ネットワーク内でのみ一意であるため、ほかのネットワークでは同じプライベートアドレスが利用されている可能性がある

プライベートIPアドレス

グローバルIPアドレスとは、インターネットに接続するタイプのIPアドレス

グローバルIPアドレスとは、インターネットで相手と通信するために持つ、ほかのアドレスと重複しない一意のIPアドレスのこと。TCP/IPでは、通信相手を特定してIPパケットを送信したり、ルーティングするために必要となる。

グローバルIPアドレス

静的IPアドレス(固定IPアドレス)

機器や人に対して固定で割り当てられたIPアドレスのこと

静的IPアドレスとは

動的IPアドレス

IPアドレスの割り当て方のひとつで、ネットワークを使うときに一時的に割り当て、使わなくなると回収されるので、使う度にIPアドレスが変わる(可能性のある)割り当て方のこと

動的IPアドレス (dynamic IP address)とは
固定IPアドレスと動的IPアドレス

NIC

ネットワークとPCのインターフェースになります。
LANケーブルは、インターネットとパソコンをつなぐ役割をしてくれます。
LANケーブルのさしたところに、ネットワークカード(LANケーブルを挿す穴がくっついた部品)が存在します。
ネットワークカード (NIC)とは

イーサネットなどが該当します。
Macの場合は、イーサネットがデフォルトで入っていることで、インターネットに接続することができます。

下記コマンドで自分のMACアドレスを確認することができます。
下記の場合、etherがイーサネットを指し、a4:83:e7:93:20:85がMACアドレスを指しています。

$ ifconfig en0 ether
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether a4:83:e7:93:20:85

ホスト

IPアドレスが付与された機器

ホップ

区間ごとにルーターがIPパケットの転送処理を行います。

Dockerのネットワーク

次はDockerを掘り下げていきます。

Linux bridge機能

Linuxがハブになって、Dockerに接続する機能を指す。
下記が全体像になります。

image.png
下記記事より引用
Docker の基本学習 ~ Docker のネットワーク

仮想ブリッジ

docker0という名称の仮想ブリッジを使用します。
docker0 → veth → eth0 と言う順序で接続されます。
インターネット層で使用されます。

veth

仮想的なネットワークインターフェース(仮想NIC)をさします。
1つはコンテナ側(eth0)、もう1つはホスト側(veth)に別れ、ペアで設置されます。
またvethは、仮想ブリッジ(docker0)に接続することができるようになります。

eth0

IPアドレスが付与されます。
コンテナの場合、docker側が勝手にIPを付与してくれる。

Docker network 概論
Docker の基本学習 ~ Docker のネットワーク
Virtualization - Part2

Kubernetesのネットワーク

まず、Kubernetesのネットワークを理解するためには、下記を認識しておく必要があります。

Kubernetes では、ホストや VM がどのように接続されているかを考えるのではなく、ポッド、サービス、外部クライアントがどのように通信するかを考えます。

Node

Nodeは、Virtual Private Cloud(VPC)から割り当てらてたIPアドレスを使用します。
ノードは仮想マシンであり、GCEインスタンスとして実行されています。
下記が全体図になっており、構成はLinux bridge機能のところで紹介した構成図とほぼ同じになっていることがわかります。

image.png
ネットワークの概要から引用

Pod

同じPod内のコンテナに対しては、localhostでアクセスすることができます。
異なるPodでの通信では、PodのIP宛に通信する必要があります。
ただし、Podは作成されたり、削除されたりするので、毎回異なるIPアドレスが付与されます。
これでは、毎回指定するIPを変更する必要があり非常に面倒です。
この場合に有効なのが、Serviceになります。

Pod間通信は、sevice経由で通信が可能になります。
例えば、フロントからバックエンドに対してリクエストを送る場合は、
バックエンドのService(例えば、ClusterIP)の名前を指定してあげることで、リクエストを送信することができます。

コンテナから見たPod

コンテナの視点からは、ポッドはネットワーク インターフェースを 1 つ備えた物理マシンのように見えます。

Podからコンテナへの通信に関しても、Linux bridge機能を備えているのであれば、Linux bridge機能が2重になっているということになるのかな。
ここあんまり自信ないです.....

ポッド内のすべてのコンテナは、この同じネットワーク インターフェースを参照します。各コンテナの localhost は、ポッドを介して、ノードの物理ネットワーク インターフェース(eth0 など)に接続されます。

これが同じPod内のコンテナ間通信は、localhostでできる理由ですね。

クラスタ外DNS、クラスタ内DNS

クラスタ外に関しては、一般的なDNSサーバー(AWS Route53など)に問い合わせる
クラスタ内に関しては、クラスタ内DNSを利用して名前解決を行います。
ServiceとPodに対するDNS

Kubernetesのbarというネームスペース内でfooという名前のServiceがあると仮定します。barネームスペース内で稼働しているPodは、fooに対してDNSクエリを実行するだけでこのServiceを探すことができます。barとは別のquuxネームスペース内で稼働しているPodは、foo.barに対してDNSクエリを実行するだけでこのServiceを探すことができます。

イメージとして、上記のように名前解決をしてくれます。
この時に使用されるのが、kube-dns(Core DNS)です。

Service

一連のポッド エンドポイントを 1 つのリソースにグループ化したものです

サービスの定義は、上記で定義されています。

サービスを定義する理由としては、固定の IP アドレスを取得し、Podを動かすためだと考えています。
Podは、停止し、再起動すると、IPアドレスが変わってしまいます。
そのため、Serviceを通して動かす必要があります。

ポッドが Service のメンバーとして識別されるには、セレクタで指定されたすべてのラベルがポッドに設定されている必要があります

ServiceはPodのラベルを識別し、リクエストをPodにルーティングしてくれます。

Service
Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what? (Kubernetes NodePort と LoadBalancer と Ingress のどれを使うべきか) を訳した

ラベル

クラスタの整理に役立つKey-Valueペアのことを指します。
Kubernetesでは、このラベルを使用して、サービスがどのPodにアクセスを分散させるか確認しています。

ラベルの作成と管理
kubernetesにおけるHTTP/2のロードバランシング
GKE/Kubernetes でなぜ Pod と通信できるのか

トラフィック

image.png
ネットワークの概要から引用

トラフィックに関しては、kube-proxyによって管理されています。
iptablesがルーターの役割をしていると考えています。

  1. kube-proxyがiptablesを設定
  2. Podにトラフィックを送信する

マルチホストでのDocker Container間通信 第3回: Kubernetesのネットワーク(CNI, kube-proxy, kube-dns)

感想

Linuxについてもっと知らなければ

7
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?