TIPS之 Kubernetes IPv4/IPv6 双协议栈

Kubernetes IPv4/IPv6 双协议栈

Posted by 董江 on Wednesday, October 9, 2024

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 双协议栈网络能够将 IPv4IPv6 地址分配给 PodService。 从 1.21 版本开始,Kubernetes 集群默认启用 IPv4/IPv6 双协议栈网络, 以支持同时分配 IPv4 和 IPv6 地址。

集群开启方式

如果配置 IPv4/IPv6 双栈,请分配双栈集群网络:

  • kube-apiserver:
    • –service-cluster-ip-range=<IPv4 CIDR>,<IPv6 CIDR>
  • 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
  • kube-proxy:
    • –cluster-cidr=<IPv4 CIDR>,<IPv6 CIDR>
  • kubelet:
    • –node-ip=<IPv4 IP>,<IPv6 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获得地址,地址以逗号分割

其他

「如果这篇文章对你有用,请随意打赏」

Kubeservice博客

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付