Open9

KubernetesのCNIであるCiliumの調査。kubespray/Cilium/CRI-Oを使ってIPv4/IPv6のDual Stackを構築する

pyar6329pyar6329

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を積んでも動いた)
  • 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
pyar6329pyar6329

1. systemctl status ufw でdefault firewallが動いていないかチェックする

有効だったら消しておく
ref: https://korodes.com/ubuntu22_03/#2

Unit ufw.service could not be found.

Ubuntu 22.04 serverのデフォルトだと動いていないっぽい

pyar6329pyar6329

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
pyar6329pyar6329

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

おー割りあたってそう

pyar6329pyar6329

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>

叩けてそう

pyar6329pyar6329

7. 外部から叩けるか

あとは外部から叩けるかだが…

CiliumLoadBalancerIPPoolに書いてもIPv6のBGPが無いので無理そう…?
debug ubuntuで内部からexternal ip v6叩いて取れるか確認したい
tableを内部的には参照してないから無理そう…?

YAMAHAルータが対応してるのはRIPngかOSPFv3かな?
https://www.rtpro.yamaha.co.jp/RT/ipv6/

pyar6329pyar6329

8. kubespray調査

kubesprayで指定したIPv6のCIDR範囲で、Podに対してIPv6が割り当たる
ciliumでnativeモードで起動すると、既存のPodのIPをそのまま使う
ただIPv6のCIDRは範囲を考える方法があるっぽいので、それを使って計算してセットした方が良い
いわゆるIPv6 Unique Local Address(ULA)ってやつ

つまりIPv6もNAT変換が必要になる
直接割り当てたいけども…