KubernetesのCNIであるCiliumの調査。kubespray/Cilium/CRI-Oを使ってIPv4/IPv6のDual Stackを構築する
Ubuntu 22.04上にkubesprayでsingle nodeでデプロイしつつ、Ciliumで作成するための知見をまとめる
環境
- Router
- YAMAHA RTX1210
- Server
- Ubuntu 22.04 server
- TRIGKEY G5 Mini PC
- Intel N100 (4C/4T,最大3.4GHz)
- DDR5 32GB (16GBが最大だけど、32GBを積んでも動いた)
- Ubuntu 22.04 server
- Client
- M1 Mac (Macbook Pro 2021)
Ubuntu 22.04に入れるもの
- M1 Macからkubesprayを使ってUbuntu 22.04 serverにKubernetesのsingle node構築
- Kubernetesのcontainer runtimeはCRI-Oを選択
- IPv4/IPv6のDualStack
1. systemctl status ufw でdefault firewallが動いていないかチェックする
有効だったら消しておく
ref: https://korodes.com/ubuntu22_03/#2
Unit ufw.service could not be found.
Ubuntu 22.04 serverのデフォルトだと動いていないっぽい
2. kubectl describe nodes | grep -E 'InternalIP' をしてIPv6がそもそも割り当たっているのかをチェックする
ref: https://isovalent.com/blog/post/tutorial-run-and-observe-ipv6-on-kubernetes-with-cilium/
$ kubectl describe nodes | grep -E 'InternalIP'
InternalIP: 192.168.100.30
割りあたっていない
3. ip addrでそもそもUbuntuにIPv6が割りあたっているか
$ ip addr
3: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether ....
inet 192.168.100.xx/24 metric 100 brd 192.168.xx.255 scope global dynamic enp2s0
valid_lft 224296sec preferred_lft 224296sec
inet6 240b:10:xxxx:xxxx:xxxx:xxxx:xxxx:e351/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 2591757sec preferred_lft 604557sec
inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link
valid_lft forever preferred_lft forever
割りあたっている
しかも以下のSSHでIPv6でアクセス出来た
$ ssh -i ~/.ssh/xxx pyar6329@240b:10:xxxx:xxxx:xxxx:xxxx:xxxx:e351
4. kubectl get svc nginx -o yamlで割りあたったIPv6を接続できるか
できてるっぽい。ただしlink localなのでシェアに厳しい
無理ならkubeadmへ移行も考える
ref: https://zenn.dev/junyaokabe/scraps/fdbfca96e98ee4
5. kubeletにIPアドレスの設定があるか
kubesprayの extra_playbooks/roles/kubernetes/node/template/kubelet.env.v1veta1.j2
に設定があるっぽい
KUBELET_ADDRESS="--node-ip={{ kubelet_address }}"
他には
extra_playbooks/roles/kubernetes/node/defaults/main.yml
extra_playbooks/roles/kubernetes/node/templates/kubelet.service.j2
roles/kubernetes/node/templates/kubelet.env.v1beta1.j2
roles/kubernetes/node/templates/kubelet.service.j2
roles/kubernetes/node/defaults/main.yml
辺りにもありそう
roles/kubernetes/node/defaults/main.yml
には
kubelet_address: "{{ ip | default(fallback_ips[inventory_hostname]) }}{{ (',' + ip6) if enable_dual_stack_networks and ip6 is defined else '' }}"
とあるので、 inventory/mycluster/hosts.yaml
に
ipv6: 240b:10:xxxx:xxxx:xxxx:xxxx:xxxx:e351
ではなく
ip6: 240b:10:xxxx:xxxx:xxxx:xxxx:xxxx:e351
とする必要がある?
$ kubectl describe nodes | grep -E 'InternalIP'
InternalIP: 192.168.100.30
InternalIP: 240b:10:xxxx:xxxx:xxxx:xxxx:xxxx:e351
おー割りあたってそう
6. IPv6で内部的に叩けるか
以下のように割り当たっている
$ kubectl describe pod nginx | grep IP
IP: 10.0.0.238
IPs:
IP: 10.0.0.238
IP: fd00::d7
debug-ubuntuに入る
$ kubectl exec -it debug-ubuntu-5bfb495cbb-n7965 bash
#> curl -g 'http://[fd00::d7]/'
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
叩けてそう
7. 外部から叩けるか
あとは外部から叩けるかだが…
CiliumLoadBalancerIPPoolに書いてもIPv6のBGPが無いので無理そう…?
debug ubuntuで内部からexternal ip v6叩いて取れるか確認したい
tableを内部的には参照してないから無理そう…?
YAMAHAルータが対応してるのはRIPngかOSPFv3かな?
8. kubespray調査
kubesprayで指定したIPv6のCIDR範囲で、Podに対してIPv6が割り当たる
ciliumでnativeモードで起動すると、既存のPodのIPをそのまま使う
ただIPv6のCIDRは範囲を考える方法があるっぽいので、それを使って計算してセットした方が良い
いわゆるIPv6 Unique Local Address(ULA)ってやつ
- https://yoshi0808.github.io/new-technology/2020/04/18/ipv6/
- https://zenn.dev/imksoo/articles/0ea63d451dfd01
つまりIPv6もNAT変換が必要になる
直接割り当てたいけども…