見出し画像

Kubernetesネットワーク基礎編

柳 松 クラウドプラットフォーム技術部 クラウド技術グループ

楽天クラウド上でKubernetesを運用する方法についてこれから数回にわけて解説します。今回は初回のテーマとして、ネットワークの基礎から始めます。ネットワークに関する基礎知識があれば理解することができます。

Kubernetesは各ポッドに一意のIPアドレスを割り当て、ポッド内の複数のコンテナがPodIPアドレスを共有します。Kubernetesでは、基盤となるネットワークがクラスター内の任意の2つのポッド間をTCP / IPで直接通信することがあります。 Kubernetesクラスター内での任意のポッド間アクセス方法は基本的にCNI (Container Network Interface)仕様に準拠します。この記事では、主にCalicoの「IP in IP」(以下IPIPで省略)モードでのKubernetesのポッド間アクセス原理を紹介します。

1.インストール

過去のブログ「楽天クラウドから始めるKubernetes」でKubernetesの専門家ではなくても、Kubesprayというツールを使ってKubernetesを構築する方法を紹介しました。KubesprayのデフォルトネットワークはCalicoですが、下記コンフィグファイルで他のネットワークも選択できます。

[r-user@bastion ~]$ cat ./kubespray-2.14.1/inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml | grep calico
# Choose network plugin (cilium, calico, contiv, weave or flannel. Use cni for generic cni plugin)
kube_network_plugin: calico

Calicoのコンフィグファイルは上記ファイルと同じフォルダのk8s-net-calico.ymlです。設定についてはデフォルトのままで特に問題ありません。

楽天クラウド側は事前にしないといけない設定があります。IPIPはデフォルトでOpenStackをサポートしていないからです。次の例のように、Kubernetesクラスターノードを格納しているK8S-firewallというセキュリティグループに新しいルールを追加すると、プロトコル番号4であるIPIPプロトコルをサポートできるようになります。

画像2

余談ですが、他のクラウドベンダーにCalicoを構築する場合にも、IPIPをサポートしているかどうか事前に確認する必要があります。IPIPをサポートしていなければ、vxlanモードを選択することができます。

2.Calico紹介

今回のKubernetesクラスター構成は1マスターと2ワーカーノードなので、インストール後のCalicoポッドは以下のようになります。デーモンセットを使用して各ノードにデプロイします。

[r-user@bastion ~]$ kubectl -n kube-system get pods -o wide | grep calico
calico-kube-controllers-6779ff5b8b-gtpff      1/1     Running   0          8d     172.18.1.110   node02   <none>           <none>
calico-node-nrl2c                             1/1     Running   0          5d7h    172.18.1.110   node02   <none>           <none>
calico-node-p9vqt                             1/1     Running   0          5d7h    172.18.1.103   node01   <none>           <none>
calico-node-r2cmc                             1/1     Running   0          2d21h   172.18.1.108   node03   <none>           <none>
[r-user@bastion ~]$ kubectl -n kube-system get daemonset | grep calico
calico-node    3         3         3       3            3           <none>                   8d

Calicoを実現するアーキテクチャーは次の図をご参照ください。各ノードのKernelをルータと見なし、ノード上のポッドをこのルータ上接続されるネットワーク端末と見なします。ルータ間で標準ルーティングプロトコルBGPを使用しています。

画像3

各ポッドの役割とCalicoの主要コンポーネントは次です。
+ calico-kube-controllers-xxxxx
 nodeの状態を監視し、変更をetcdに反映
+ calico-node-xxxxx、下記3つがデーモン実行されています。
 >Felix、プライマリCalicoエージェント、エンドポイントを提供。
 >BIRD(BGP Client)、ルーティング情報を他のノードへ配信するBGPクライアント。
 >confd、Calicoデータストアを監視し、構成変更に応じてBIRDの構成ファイルを更新するデーモン。
+ etcd、データストア(Kubernetesクラスター外部のdockerにデプロイ)
+ BGP Route Reflector (オプション)、大規模クラスターデプロイに適応(BGPクライアント)。

BIRD(Bird Internet Routing Daemon)はBGP、OSPF、RIPなど多くの動的ルーティングプロトコルを実装され、独立開発されたオープンソースプロジェクトです。CalicoでBGP Clientは、ネットワーク相互通信を実現するために、BGPプロトコルを介して各ノードのFelixにて設定された内容をCalicoネットワークにブロードキャストする責任があります。

BGPトポロジー
ノード(BGP Client)間のデフォルト接続方法はフルメッシュ(full-mesh)です。小規模のクラスター環境では問題ないですが、スケールアップするほどネットワークオーバーヘッドが急増するという課題があります。そのため、大規模の場合はBGP Route Reflectorの採用をおすすめします。なぜなら、すべてのBGP Clientはルーティング情報を管理されるRRノード(通常は2台で冗長)のみ接続し、ルーティング情報のシンク(sync)をとることで、接続数を大幅減らすことができるからです。また、オンプレの場合にはTop of Rack(ToR)でフィジカルネットワークとピア(peer)することができます。

Calico IPPoolモード
CalicoのIPPoolは、CIDRの形でエンドポイント(workload endpoints)IPを割り当てます。Kubenetes環境ではポッドIPが定義されています。下記Kubesprayインストール設定ファイルk8s-net-calico.yml通り、IPPool内部ルーティング方式を選択するvxlanまたはIPIPの2つのモードあります。この記事では、IPIPモードを使用します。これは、各ノードのルート間にトンネルを作成してから、ネットワークを接続するモードです。文字通り、Linuxのトンネル技術を使用して、IPデータパケットを別のIPパケットにラップすることです。ポイントツーポイント接続を介して、本来疎通できない2つのネットワークを接続するIPベース技術です。

# Set calico network backend: "bird", "vxlan" or "none"
# bird enable BGP routing, required for ipip mode.
calico_network_backend: bird

# IP in IP and VXLAN is mutualy exclusive modes.
# set IP in IP encapsulation mode: "Always", "CrossSubnet", "Never"
calico_ipip_mode: 'Always'

# set VXLAN encapsulation mode: "Always", "CrossSubnet", "Never"
calico_vxlan_mode: 'Never'

3.IP in IPのデモ

下記通りdefaultネームスペースで4つポッドを作成しました。それぞれnode02とnode03にデプロイされています。

[r-user@bastion ~]$ kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE     IP             NODE     NOMINATED NODE   READINESS GATES
nginx-demo                          1/1     Running   0          9d      10.233.69.4    node03   <none>           <none>
nginx-deployment-7746d8fbd5-9g7hh   1/1     Running   0          7d10h   10.233.113.4   node02   <none>           <none>
nginx-deployment-7746d8fbd5-z69mv   1/1     Running   0          7d10h   10.233.69.5    node03   <none>           <none>
testing-pod                         1/1     Running   1          44s     10.233.113.9   node02   <none>           <none>

testing-podにログインし、ノードを跨ってnginx-demoへの疎通を確認してみます。

[r-user@bastion ~]$ kubectl exec -it testing-pod -- sh
/ # ping 10.233.69.4 -c3
PING 10.233.69.4 (10.233.69.4): 56 data bytes
64 bytes from 10.233.69.4: seq=0 ttl=62 time=6.770 ms
64 bytes from 10.233.69.4: seq=1 ttl=62 time=2.975 ms
64 bytes from 10.233.69.4: seq=2 ttl=62 time=1.808 ms

--- 10.233.69.4 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 1.808/3.851/6.770 ms

疎通が取れることを確認できました。

エンドポイント間のルーティングはどうやって実現されているのでしょうか。node02のCalicoポッドを訪問してカーネルルーティング情報を確認します。コマンドの読み方について紹介します。赤い枠を見てみますと、ターゲット10.233.69.0/24のパケットは172.18.1.108を経由してデバイスtunl0に送信します。10.233.113.4ポッドへのパケットはデバイスcali9d70156bf53から送信します。

名称未設定 1

ルーティング情報を理解するため、「ip addr」を使って各アドレスを取得して整理します。

画像4

オリジナルのsrc/dstペアは10.233.113.9/10.233.69.4であり、tunl0から新たにヘッドをラップして、172.18.1.110/172.18.1.108になり、OSPネットワークを利用してパケットを流れています。

画像5

確認するため、下記ステップで実施して、tcpdumpツールを使って検証をしましょう。
1.二つのコンソルを用意して、node02とtesting-podにログイン
2.node02で下記tcpdumpコマンドを実行
3.同時にtesting-podではping 10.233.69.4 -c3を実行

名称未設定 2

2つIPヘッダーが表示されるため、IPIP(4)プロトコルが効くと証明できます。IPパケットをカプセル化して送ることを確認できました。tcpdumpの代わりにWiresharkを使えばmacアドレスなどより詳しい情報をトラックすることができます。

4.まとめ

Calicoを使用してすべてのポッドの間に通信することができます。利便性がある一方、セキュリティの観点から通信させないようにネットワークを分離することはできるのでしょうか。KubernetesのNetworkPolicyを使ってポッド通信をコントロールすることができます。NetworkPolicyについては、今後のブログで紹介したいと思います。

楽天クラウド:https://cloud.rakuten.co.jp/

画像1

柳 松
外資系ITメーカー入社、ストレージソリューションSEから始め、アーキテクト、プレセールス、ビジネスデベロップメントを経験。インフラ系から現職のクラウド系新規サービス開発にチャレンジ中。最近の趣味は読書。特に歴史と社会に興味を持っている。理科と違って、正解のない世界を面白く感じている。


スキ、ありがとうございます!
6
中のひとの日常や、お客様のデジタル・トランスフォーメーションのお役に立つかもしれない?情報を発信していきます。