P4 の simple_switch を使って Docker コンテナ間で ping する

Docker コンテナ間で P4 をデバッグできれば色々デバッグが捗るのでできるようにする(今回は mininet は使わない)。

今回使う P4 プログラムは https://github.com/p4lang/tutorials/tree/master/exercises/basic

(Optional) iptables, masq, forward を無効化する

ハマらないために、 `/etc/docker/daemon.json` で設定しても良い。

{
  "ip-forward": true,
  "ip-masq": true,
  "iptables":true
}

お互いに通信できないコンテナを作る

Docker network を別々にすれば(`simple_switch` がなければ)お互いに通信できない。

 $ docker network create network1 --subnet=172.18.100.0/24
 $ docker network create network2 --subnet=172.18.200.0/24

コンテナをたてる

IP とネットワークを指定する。

 $ docker run --rm -it --ip=172.18.100.2 --network=network1 --name=container1 busybox sh
 $ docker run --rm -it --ip=172.18.200.2 --network=network2 --name=container2 busybox sh  

simple_switch をたてる

コンテナの veth にアタッチする。Bridge interface でも良い。

 $ sudo simple_switch build/basic.json -i 1@veth65e0b28 -i 2@veth79593d4 --log-console

仮想スイッチにエントリを入れる

MAC アドレスは Docker コンテナ側から見た MAC アドレスであることに注意。

$ simple_switch_CLI
 Obtaining JSON from switch…
 Done
 Control utility for runtime P4 table manipulation
 RuntimeCmd: table_add MyIngress.ipv4_lpm MyIngress.ipv4_forward 172.18.200.2/32 => 02:42:d1:d2:6b:16 2
 Adding entry to lpm match table MyIngress.ipv4_lpm
 match key:           LPM-ac:12:c8:02/32
 action:              MyIngress.ipv4_forward
 runtime data:        02:42:d1:d2:6b:16  00:02
 Entry has been added with handle 0
 RuntimeCmd: table_add MyIngress.ipv4_lpm MyIngress.ipv4_forward 172.18.100.2/32 => 02:42:d3:9d:be:4f 1
 Adding entry to lpm match table MyIngress.ipv4_lpm
 match key:           LPM-ac:12:64:02/32
 action:              MyIngress.ipv4_forward
 runtime data:        02:42:d3:9d:be:4f  00:01
 Entry has been added with handle 12

これで ping が相互に届き、返事もできるようになる。

なお、MAC アドレスを(外から見たものにする等して)間違えていた場合、宛先インターフェースまでは届くものの返事はしない。

Kubernetes 日記 2019/11/14

こんにちは。京都は紅葉しつつあります。

まず、前回建てるのに成功した flannel に、サンプルの Service を立てて詳しく見てみました。flannel は VXLAN を使ってノード間の通信を行っています。

flannel の詳細は多くの記事が存在するので割愛します。

flannel を見終わった後は kubernetes のダッシュボードを立ててみました。インストールはドキュメントに従って行います。

“Kubernetes 日記 2019/11/14” の続きを読む

Kubernetes 日記 2019/10/28

こんにちは。Kubernetes の季節が深まってまいりました。今回は実際に Service を立てて iptables を眺めてみました。

以下のページに従って Stateless な Service を立てます。

https://kubernetes.io/docs/tutorials/stateless-application/expose-external-ip-address/

Service の ClusterIP によってアクセスできるようになった後は、オペレーションせずに iptables の様子を眺めることにしました。

“Kubernetes 日記 2019/10/28” の続きを読む

Kubernetes 日記 2019/10/07

こんにちは。Kubernetes の季節ですね。岡部・宮崎研究室でも Kubernetes を構築し始めました。

Kubernetes (k8s) とは?

https://kubernetes.io/

Kubernetes とはコンテナオーケストレーションシステムです。サービスを立ち上げる際のコンテナ配置やネットワーク構成をやってくれるありがたいものです。

構築する

今日から実際にサーバーに k8s を立てていきます。基本的に公式ドキュメントを読みながらやっていきます。

https://kubernetes.io/docs/setup/

“Kubernetes 日記 2019/10/07” の続きを読む