Kubernetes IPv4/IPv6 双协议栈
背景
“Kubernetes 何时支持 IPv6”
- 自从 k8s v1.9 版本中首次添加对 IPv6 的 alpha 支持以来,这个问题的讨论越来越频繁。 虽然 Kubernetes 从 v1.18 版本开始就支持纯 IPv6 集群,但当时还无法支持 IPv4 迁移到 IPv6。 IPv4/IPv6 双协议栈网络 在 Kubernetes v1.23 版本中进入正式发布(GA)阶段。
国内由于 信创
要求,无论是集群内部还是集群出口,都需要支持ipv6协议栈
(技术必须支持IPv4迁移到IPv6能力
)
要求
先决条件
为了使用 IPv4/IPv6 双栈的 Kubernetes 集群,需要满足以下先决条件:
Kubernetes 1.21
版本或更高版本,有关更早 Kubernetes 版本的使用双栈 Service 的信息- 提供商支持双协议栈网络(云提供商或其他提供商必须能够为 Kubernetes 节点提供可路由的 IPv4/IPv6 网络接口)。
- 支持双协议栈的网络插件CNI;
IPv4/IPv6
双协议栈网络能够将 IPv4
和 IPv6
地址分配给 Pod
和 Service
。
从 1.21 版本开始,Kubernetes 集群默认启用 IPv4/IPv6 双协议栈网络, 以支持同时分配 IPv4 和 IPv6 地址。
集群开启方式
如果配置 IPv4/IPv6
双栈,请分配双栈集群网络:
- kube-apiserver:
- –service-cluster-ip-range=
<IPv4 CIDR>
,<IPv6 CIDR>
- –service-cluster-ip-range=
- kube-controller-manager:
- –cluster-cidr=
<IPv4 CIDR>
,<IPv6 CIDR>
- –service-cluster-ip-range=
<IPv4 CIDR>
,<IPv6 CIDR>
- –node-cidr-mask-size-ipv4|–node-cidr-mask-size-ipv6
#对于 IPv4 默认为 /24, 对于 IPv6 默认为 /64
- –cluster-cidr=
- kube-proxy:
- –cluster-cidr=
<IPv4 CIDR>
,<IPv6 CIDR>
- –cluster-cidr=
- kubelet:
- –node-ip=
<IPv4 IP>
,<IPv6 IP>
- –node-ip=
集群部署方式
二进制安装Kubernetes(k8s) v1.24.1 IPv4/IPv6双栈
双栈集群对于Service和Pod变化
Service变化
apiVersion: v1
kind: Service
metadata:
name: my-service
labels:
app.kubernetes.io/name: MyApp
spec:
ipFamilyPolicy: PreferDualStack # SingleStack, PreferDualStack, RequireDualStack
ipFamilies:
- IPv6
- IPv4
selector:
app.kubernetes.io/name: MyApp
ports:
- protocol: TCP
port: 80
单栈和双栈之间切换 Service:
- 从单栈更改为双栈时,Kubernetes 将分配缺失的地址族, 以便现在此 Service具有 IPv4 和 IPv6 地址。 编辑 Service 规约将 .spec.ipFamilyPolicy 从 SingleStack 改为 PreferDualStack
ipFamilies 优先级问题
ipFamilies支持:
- [
IPv4
] - [
IPv6
] - [
IPv4
,IPv6
] - [
IPv6
,IPv4
]
Array 中写在前面的,优先解析请求;
Pod 变化
env:
- name: POD_IPS
valueFrom:
fieldRef:
fieldPath: status.podIPs # 双栈使用podIPs获得地址,地址以逗号分割
其他
「如果这篇文章对你有用,请随意打赏」
FEATURED TAGS
agent
apiserver
application
bandwidth-limit
cgo
cgroupfs
ci/cd
client-go
cloudnative
cncf
cni
community
container
container-network-interface
containerd
controller
coredns
crd
custom-controller
deployment
docker
docker-build
docker-image
drop
ebpf
ecology
egress
etcd
gitee
github
gitlab
golang
governance
hpa
http2
image
ingress
iptables
jobs
kata
kata-runtime
kernel
kind
kubelet
kubenetes
kubernetes
library
linux-os
logging
loki
metrics
monitor
namespace
network
network-troubleshooting
node
nodeport
pingmesh
pod
prestop
prometheus
proxyless
pvc
rollingupdate
schedule
scheduler
serverless
sidecar
sigtrem
systemd
throttling
timeout
tools
traceroute