背景
虽然ipv6已经支持许多年了,但是仍然不普及。正好最近遇到了k8s需要开启ipv6支持的问题,记录一下解决方案。
环境
- Kind环境不低于
0.11
- Kubernetes服务器环境不低于
v1.23
- Calico环境不低于
3.24
做法
要支持ipv6,就需要自上而下全部支持。即:
- Cluster级别需要支持(我这边使用的是Kind)
- CNI需要支持(我这边使用的是Calico)
- Pod需要支持
- Service需要支持
系统设置
linux环境下:
sudo sysctl -w net.ipv4.conf.all.forwarding=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
mac:
sudo sysctl -w net.inet.ip.forwarding=1
sudo sysctl -w net.inet6.ip6.forwarding=1
Kind支持ipv6
Kind支持ipv6,只需要配置ipFamily即可,注意subnet要么别配,要么双栈都要配
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
networking:
# 支持ipv4和ipv6双栈
ipFamily: dual
apiServerAddress: 127.0.0.1
# 因为我这边要使用Calico 就把Kind默认的给禁掉了
disableDefaultCNI: true
kubeProxyMode: "ipvs"
Calico支持ipv6
Calico支持ipv6,需要修改它的ConfigMap以及node的DaemonSet
kind: ConfigMap
apiVersion: v1
data:
cni_network_config: |-
{
"cniVersion": "0.3.1",
"plugins": [
"type": "calico",
"ipam": {
"type": "calico-ipam",
"assign_ipv4": "true",
"assign_ipv6": "true"
}
]
}
---
kind: DaemonSet
apiVersion: apps/v1
spec:
template:
spec:
containers:
- name: calico-node
env:
- name: IP
value: "autodetect"
- name: IP6
value: "autodetect"
- name: FELIX_IPV6SUPPORT
value: "true"
Service开启双栈
在上述配置完成后,pod其实已经有了双栈IP。为了让对应的Service也能使用双栈,需要进行如下配置
apiVersion: v1
kind: Service
spec:
# 传递真实客户端ip
externalTrafficPolicy: Local
# 不会过于严格的双栈策略
ipFamilyPolicy: PreferDualStack
# 支持的协议栈类型 默认展示按排最前面的那个来
ipFamilies: ["IPv4", "IPv6"]
参考
PREVIOUSvscode的debug配置