kopsでNetworkをamazon-vpc-cniからCalicoに切り替えた

プライベートで使用している Kubernetesクラスタは今まで amazon-vpc-cni-k8s を使用していました。
amazon-vpc-cni-k8s は EKS で公式でサポートされています。

基本的にはこれを使うで良いのですが、個人的に辛い欠点がありました。
それは Node あたりの Pod 数の制限でした。
https://github.com/aws/amazon-vpc-cni-k8s/blob/f52ad45/README.md#eni-allocation

計算としては ENI * (# of IPv4 per ENI - 1) + 2 になるので、例えば t3.small の場合は最大のNetwork Interface は 3つで、1つのinterface ごとに 4つの IP を割り当てることができます。

ENI * (# of IPv4 per ENI - 1) + 2
= 3 * ( 4 - 1 ) + 2
= 11

つまり t3.small は最大で 11 pods になります。

kops ではクラスタを構築する時は最大の pod 数は110ですが network に aws-vpc-cni を選択していた場合はこの計算が使われます。
https://github.com/kubernetes/kops/blob/27aab12b2855b308e71b1d6b6b897c81068a0661/nodeup/pkg/model/kubelet.go#L503-L530

使用するリソースに関わらず Pod 数が制限されるので、個人で使ってる分には結構厳しいものがあります。

そこで今回は amazon-vpc-cni-k8s をやめることにしました。
かわりに Calico を使うことにしました。

www.projectcalico.org

kops では Calico をサポートしています。
kops.sigs.k8s.io

ただドキュメントにも書かれているように基本的にCNIの変更は破壊的な変更になります。
https://kops.sigs.k8s.io/networking/#switching-between-networking-providers

そこで今回はクラスタを作り直しました。

無事作成できると Pod 数の上限が 110 になります。

$ kubectl get nodes -o json | jq -r '.items[].status.allocatable.pods'
110
110
110