2019-11-15に更新

Day3: Configure IP pools

3日目はConfigure IP poolsから。前回はcalicoctlをインストールして簡単な動作確認をしただけ。

Calicoにはworkloadというリソースがあって、VMだったりコンテナだったり、Kubernetesの世界でいうとPodの形で配置される。それが何をするのかというと、仮想ネットワークのための仕事をする。Workloadにはworkload endpointというものがあって、それがCalicoのネットワークの世界とCalicoの外側のネットワークをつなぐためのインターフェースとなる。

で、ここでタイトルにある"IP pools"の話になるんだけど、"IP pools"というのは、Calicoがworkload endpointsのために利用するIPアドレスの範囲のこと。

じゃあそのIPアドレスの範囲はどうやって決めるのかと言うと、Kubernetesクラスタを立ち上げるときに--pod-netwrok-cidrを指定したと思うんだけど、その指定した範囲のサブセットを用いる。

というわけで、以上を踏まえてIP poolsの設定をしてみる。以下のようにする。

$ cat > pool1.yaml <<EOF
> apiVersion: projectcalico.org/v3
> kind: IPPool
> metadata:
>   name: pool1
> spec:
>   cidr: 192.168.0.0/18
>   ipipMode: Never
>   natOutgoing: true
>   disabled: false
>   nodeSelector: all()
> EOF

ドキュメントでは触れてないけど、設定ファイルの内容がKubernetesっぽいのはDatastoreがKubernetesだからかな?etcdだとまた違う(とはいえ、これをjson形式にするとかそんな感じ?)なんだろうと思う。

では内容の解説。apiVersionkindはKubernetesでさんざん見ていると思うので割愛。spec以下だけに絞って説明する。

cidr: 192.168.0.0/18

これは見ての通り、CalicoのIP poolが利用する範囲をCIDRで指定している。KubernetesのPodには192.168.0.0/16を指定したので、

# https://devops.stackexchange.com/a/8486より
kubectl cluster-info dump | grep -m 1 cluster-cidr

192.168.0.0/16がどういう意味かというと、ネットワーク部(fixed prefix)が192.168.0.0で、ネットマスクが16bitですよっていう意味。めっちゃ雑にいうと、32bitのうち、16bitはマスク部なので、残りの16bitを利用できますよっていうことになる。なので、ここでは、2^16-2(networkアドレスとbrodcastアドレスを除く) = 65536 - 2 = 65534個のIPアドレスを割り当てますよっていう設定をしている。

で、Calicoはこの割り当てられている範囲でIPアドレスを利用するので、サブセットとして/16より狭い範囲でCIDRを指定しなければならない。ということで、ここでは192.168.0.0/18として、これまた雑にいうと32bitのうち18bitがマスク部なので、残りの14bit、つまり2^14-2 = 16384 - 2 = 16382個のIPアドレス を使いますよっていう宣言をしていることになる。

次はこれ↓

ipipMode: Never

ipipModeというのは(IP in IP)[https://en.wikipedia.org/wiki/IP_in_IP]を利用するかどうかを指定する項目。IP in IPに関してはリンク先を参照してほしいのだけど、触りだけをいうと、IPパケットを別のIPパケットでカプセル化する。そうすることでVPN通信なんかを可能にしたりする。今回はそういったことは必要ないのでNeverを指定する。

natOutgoing: true

これを有効(true)にすると、Calicoのコンテナから通信先にパケットが送られるときに、パケットがインターネット側から隠蔽されるようになる。つまりCalicoがNATしているように(ようにっていうか、まさにそうなんだろうけど)振る舞うので、本来の通信元のポート番号などがインターネット側に対して隠されるようになる。

disabled: false

これがtrueだと、CalickのIPAM(IP Address management)が割り当てられたIP poolsからIPアドレスを割り当てなくなる。つまり、指定したCIDRの範囲のIP poolsのIPアドレスをもつpodが作られなくなる。podはつくられなくなるんだけど、引き続き指定範囲のCIDRはCalicoのネットワークの一部として認識されている。

nodeSelector: all()

CalicoのIPAMが指定されたIP poolsからアドレスを割り当てるときにノードを選択するときの振る舞いを指定する。all()だとIP poolで指定した範囲内のノードにすべて割り当てる。
ちなみにここまで説明は全てドキュメントに記載されているので詳細はそちらで。

つぎに2つ目のIP poolsを設定する。

$ cat > pool2.yaml <<EOF
> apiVersion: projectcalico.org/v3
> kind: IPPool
> metadata:
>   name: pool2
> spec:
>   cidr: 192.168.192.0/19
>   ipipMode: Never
>   natOutgoing: true
>   disabled: true
>   nodeSelector: all()
> EOF`

で、最後にこれらを適用する。

$ calicoctl create -f pool1.yaml
Successfully created 1 'IPPool' resource(s)
$ calicoctl create -f pool2.yaml
Successfully created 1 'IPPool' resource(s)

$ calicoctl get ippools -o wide
NAME    CIDR               NAT    IPIPMODE   VXLANMODE   DISABLED   SELECTOR
pool1   192.168.0.0/18     true   Never      Never       false      all()
pool2   192.168.192.0/19   true   Never      Never       true       all()

こんな感じ。今日はここまで。


shige
所有者限定モードのためこのボードには投稿できません
コメント