読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

Kubernetes を使ったマルチホスト環境でのクラスタを構築する【flannel編】

概要

前回の続きです。
今回はflannelを導入してマルチホストでのコンテナ間通信を可能にします。

マスターの設定

flannelの設定

flannel.json

ネットワークの設定ファイルを用意します。適当にflannel.jsonとします。

{
    "Network": "10.20.0.0/16",
    "SubnetLen": 24,
    "Backend": {
        "Type": "vxlan",
        "VNI": 1
    }
}

etcdctlでetcdのKVSにセットします。

# etcdctl set /atomic.io/network/config < flannel.json 
{
    "Network": "10.20.0.0/16",
    "SubnetLen": 24,
    "Backend": {
        "Type": "vxlan",
        "VNI": 1
    }
}

/etc/sysconfig/flanneld

/etc/sysconfig/flanneldを編集します。

FLANNEL_ETCD="http://192.168.33.10:2379"
FLANNEL_ETCD_KEY="/atomic.io/network"
FLANNEL_OPTIONS="--iface=eth1"

FLANNEL_ETCDはマスターのIP。FLANNEL_ETCD_KEYはさっき設定したKeyのconfigを抜いたものを設定します。
FLANNEL_OPTIONSに関してはVagrantでIPを固定化するとeth1に設定されるため、そちらを使用します。EC2などでは不要な設定です。

完了したらサービスの再起動と自動起動設定

# systemctl restart flanneld
# systemctl enable flanneld

完了したらリブート。リブートする理由はdocker0のネットワークがデフォルトのままだと他のホストとも被ってしまい、コンテナのIPが被ることがあるからです(Vagrant固有かもですが)。

# reboot

動作確認

# cat /run/flannel/subnet.env 
FLANNEL_NETWORK=10.20.0.0/16
FLANNEL_SUBNET=10.20.40.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

先ほど設定したIP範囲で設定できてますね。NICも確認します。

# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 86376sec preferred_lft 86376sec
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.33.10/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN 
    inet 10.20.40.0/16 scope global flannel.1
       valid_lft forever preferred_lft forever
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    inet 10.20.40.1/24 scope global docker0
       valid_lft forever preferred_lft forever

flannel.1に指定したネットワークのIPが付いていることが分かります。

ノードの設定

etcdに登録する部分を除いてマスターと同じです。

/etc/sysconfig/flanneld

/etc/sysconfig/flanneldを編集します。

FLANNEL_ETCD="http://192.168.33.10:2379"
FLANNEL_ETCD_KEY="/atomic.io/network"
FLANNEL_OPTIONS="--iface=eth1"

完了したらサービスの再起動と自動起動設定

# systemctl restart flanneld
# systemctl enable flanneld

完了したらリブート

# reboot

動作確認

# cat /run/flannel/subnet.env 
FLANNEL_NETWORK=10.20.0.0/16
FLANNEL_SUBNET=10.20.1.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=false

先ほど設定したIP範囲で設定できてますね。NICも確認します。

# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 86373sec preferred_lft 86373sec
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    inet 192.168.33.101/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN 
    inet 10.20.82.0/16 scope global flannel.1
       valid_lft forever preferred_lft forever
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN 
    inet 10.20.82.1/24 scope global docker0
       valid_lft forever preferred_lft forever

ちゃんとマスターのflannelとつながっているか確認します。

# systemctl status flanneld
3:27:06 node2 flanneld[32348]: I0524 23:27:06.133342 32348 device.go:164] calling NeighAdd: 192.168.33.10, a2:ff:24:12:57:74
 5月 24 23:27:06 node2 flanneld[32348]: I0524 23:27:06.133377 32348 device.go:164] calling NeighAdd: 192.168.33.100, 3e:18:cb:8c:c5:5e
 5月 24 23:27:06 node2 systemd[1]: Started Flanneld overlay address etcd agent.

大丈夫ですね。

コンテナを起動してマルチホスト間で疎通

マスターとノードで以下のようにコンテナを作ってみます。

master

# docker run -it --name centos centos:centos7.1.1503 /bin/bash

コンテナのIPを確認します。

# ip a | grep eth0
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
    inet 10.20.40.2/24 scope global eth0

node1

# docker run -it --name centos centos:centos7.1.1503 /bin/bash

コンテナのIPを確認します。

# ip a | grep eth0
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
    inet 10.20.82.2/24 scope global eth0

node2

# docker run -it --name centos centos:centos7.1.1503 /bin/bash

コンテナのIPを確認します。

# ip a | grep eth0
6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP 
    inet 10.20.1.2/24 scope global eth0

動作確認

Dockerホスト コンテナIP
master 10.20.40.2
node1 10.20.82.2
node2 10.20.1.2

masterからnode1へ疎通確認

[root@e7770e05c9ff /]# ping 10.20.82.2
PING 10.20.82.2 (10.20.82.2) 56(84) bytes of data.
64 bytes from 10.20.82.2: icmp_seq=1 ttl=62 time=1.27 ms
64 bytes from 10.20.82.2: icmp_seq=2 ttl=62 time=0.615 ms

node1からnode2へ疎通確認

[root@1773b56814f8 /]# ping 10.20.1.2
PING 10.20.1.2 (10.20.1.2) 56(84) bytes of data.
64 bytes from 10.20.1.2: icmp_seq=1 ttl=62 time=1.66 ms
64 bytes from 10.20.1.2: icmp_seq=2 ttl=62 time=0.556 ms

大丈夫ですね。

次回はPodを使ったクラスタ構築を進めます。