搜索本产品文档关键词
CCE 支持 IPv4 和 IPv6 双栈网络
所有文档
menu

容器引擎 CCE

CCE 支持 IPv4 和 IPv6 双栈网络

CCE 支持 IPv4 和 IPv6 双栈网络

互联网协议第六版(IPv6)是互联网升级演进的必然趋势、网络技术创新的重要方向、网络强国建设的基础支撑。CCE 目前支持 IPv4/IPv6 双栈集群,包括如下特点:

1. Node 同时支持 IPv4 和 IPv6 地址,集群内部支持使用两种类型地址通信;
2. Pod 双栈同时支持 IPv4 和 IPv6 地址,并支持两种类型 IP 访问;
3. Service 同时支持 IPv4 和 IPv6 地址,并支持通过 IPv6 对外暴露服务。

IPv6 双栈网络参考:VPC 使用 IPv6

使用说明

仅支持在CCE标准集群中使用IPv4/IPv6双栈容器网络。

前置条件

  1. kubernetes 版本1.20以上
  2. cce-network网络插件版本2.7.7以上

新建 IPv4/IPv6 双栈 VPC 及子网

CCE IPv4/IPv6 双栈集群需要运行在支持 IPv6 的 VPC(私有网络) 的子网中,因此在创建双栈集群前应首先创建一个支持 IPv6 的 VPC 及其子网。

创建 VPC

VPC 控制台内新建 VPC,并开启 IPv6 选项。

ipv6vpcexample.png

创建子网

在 VPC 中创建子网,并开启 IPv6 选项。

ipv6subnetexample.png

新建 IPv4/IPv6 双栈 K8S 集群

进入 CCE 控制台,创建双栈集群,如下所示:

  1. 在『基础配置』页面
    选择开启『IPv6双栈网络』,并选择一个支持 IPv6 的 VPC 和其子网。

ipv6clusterbasic.png

  1. 在『网络配置』页面 系统会自动推荐合适的 IPv4/IPv6 ClusterIP 网段并显示在下方。 IPv6网段支持用户手动指定符合RFC 4193定义的唯一本地地址(Unique Local Addresses,ULA),地址范围是fd00::/8 的子集。

ipv6clusternetwork.png

  1. 后续按提示进行,完成集群的创建。

通过 IPv4 和 IPv6 访问 Pod

在 IPv4/IPv6 双栈集群中,可以为 Pod 同时分配 IPv4 地址和 IPv6 地址。

注意:后端 Pod 也需要监听 IPv6 协议栈下端口,否则会出现 Pod 被分配了 IPv6 地址但是连接被拒绝的情况

通过 CCE 控制台的『工作负载』页面,创建示例 Deployment,可以使用以下示例 Deployment,其中所用的镜像同时在监听 IPv4 和 IPv6 协议栈的 80 端口:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example-ipv6
  labels:
    app: nginx
spec:
  replicas: 2
  minReadySeconds: 0
  strategy:
    type: RollingUpdate 
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      restartPolicy: Always
      containers:
        - name: nginx
          image: hub.baidubce.com/cce/nginx-alpine-go:ipv6
          imagePullPolicy: Always
          ports:
            - containerPort: 80

image.png

查看 Pod IPv4/IPv6 地址:

# kubectl get pods deployment-example-64445974b7-8s6zc  -o go-template --template='{{range .status.podIPs}}{{printf "%s \n" .ip}}{{end}}'
172.17.0.12
fc00::c

访问 Pod 的 IPv4 地址:

# curl 172.17.0.12

访问 Pod 的 IPv6 地址:

# curl -g [fc00::c]:80

注意 镜像 hub.baidubce.com/cce/nginx-alpine-go:latest 支持 IPv4/IPv6 双栈。

通过 IPv4 或 IPv6 访问 Service

在 IPv4/IPv6 双栈集群中,可以为 Service 分配 IPv4 地址或 IPv6 地址。 通过 Service 的 .spec.ipFamilies 属性指定 Service 的 IP 地址类型,其值为 IPv4IPv6

注意

  1. 在未指定 .spec.ipFamilies 配置的情况下, Kubernetes 将使用 kube-controller-manager 中 --service-cluster-ip-range 参数的第一段 IP 地址为 Service 分配 IP 地址。因此为了避免混淆,我们建议在双栈集群中部署 Service 时始终配置 .spec.ipFamilies 属性。
  2. .spec.ipFamilies 是一个可变更的字段:可以通过修改这个字段的值,来控制添加或删除service的辅助IP。 但不可以修改service的主IP。
  3. 在使用 IPv6 版的 LoadBalancer Service 时,后端 Pod 无法从网络包中获取请求的原始 IP 地址。

createsvc.png

创建 IPv4 单栈的 Service

指定 spec.ipFamily: IPv4 为 Service 分配 IPv4 地址:

apiVersion: v1
kind: Service
metadata:
  name: service-example-ipv4
  annotations:
    prometheus.io/scrape: "true"
spec:
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  selector:
    app: nginx
  type: LoadBalancer
  externalTrafficPolicy: Cluster 
  sessionAffinity: None
  ports:
  - name: nginx
    protocol: TCP
    port: 80
    targetPort: 80

查看 IPv4 Service 详情:

# kubectl describe svc service-example-ipv4
Name:                     service-example-ipv4
Namespace:                default
Labels:                   <none>
Annotations:              prometheus.io/scrape: true
                          service.beta.kubernetes.io/cce-load-balancer-id: lb-bedc26c1
Selector:                 app=nginx
Type:                     LoadBalancer
IP:                       172.16.63.112
LoadBalancer Ingress:     106.13.103.101
Port:                     nginx  80/TCP
TargetPort:               80/TCP
NodePort:                 nginx  30009/TCP
Endpoints:                172.17.0.12:80,172.17.0.13:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age    From                Message
  ----    ------                ----   ----                -------
  Normal  EnsuringLoadBalancer  6m56s  service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   6m37s  service-controller  Ensured load balancer

访问 IPv4 ClusterIP:

# curl 172.16.63.112

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>

创建 IPv4/IPv6双栈 的 Service

指定 spec.ipFamily: IPv6 为 Service 分配 IPv6 地址:

apiVersion: v1
kind: Service
metadata:
  name: service-example-ipv6
  annotations:
    prometheus.io/scrape: "true"
spec:
  ipFamilyPolicy: PreferDualStack
  ipFamilies:
  - IPv6
  - IPv4
  selector:
    app: nginx
  type: LoadBalancer
  externalTrafficPolicy: Cluster 
  sessionAffinity: None
  ports:
  - name: nginx
    protocol: TCP
    port: 80
    targetPort: 80

查看 IPv6 Service 详情:

# kubectl describe svc service-example-ipv6
Name:                     service-example-ipv6
Namespace:                default
Labels:                   <none>
Annotations:              prometheus.io/scrape: true
                          service.beta.kubernetes.io/cce-load-balancer-id: lb-da9b6673
Selector:                 app=nginx
Type:                     LoadBalancer
IP:                       fdff:ffff:ffff:ffff:ffff:ffff:ffff:faa0
LoadBalancer Ingress:     240c:4082:1:4202::8
Port:                     nginx  80/TCP
TargetPort:               80/TCP
NodePort:                 nginx  30685/TCP
Endpoints:                [fc00::c]:80,[fc00::d]:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:
  Type    Reason                Age    From                Message
  ----    ------                ----   ----                -------
  Normal  EnsuringLoadBalancer  4m8s   service-controller  Ensuring load balancer
  Normal  EnsuredLoadBalancer   3m56s  service-controller  Ensured load balancer

访问 IPv6 ClusterIP:

# curl -g [fdff:ffff:ffff:ffff:ffff:ffff:ffff:faa0]:80

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    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>

公网通过 IPv6 地址访问 Service

IPv6 网关为 VPC 内的 IPv6 地址提供公网连通性。若从公网通过 IPv6 地址访问 Service 或是使用 IPv6 地址的容器访问公网,需要 VPC 配置 IPv6 网关及相关路由。

创建 IPv6 网关

VPC 控制台的 『IPv6网关』标签页,点击『创建网关』

image.png

填写网关信息,其中『所在网络』选择集群所在的 VPC。

ipv6gwexample.png

添加 IPv6 网关路由

VPC 控制台的 VPC 实例页面中,点击『路由表』标签页,点击『添加路由』。

image.png

填写路由表条目配置信息,其中『源网段』是 VPC 中的子网网段,目标网段为『::/0』,路由类型为『IPv6公网网关』,『下一跳实例』为上一步创建的网关。

注意 若您的集群横跨一个 VPC 中的多个子网,您需要为每个子网网段创建路由条目。

ipv6gatewayrouteexample.png

访问上述 Service IPv6 EIP:

# curl -g [240c:4082:1:4202::8]:80

参考文档

上一篇
容器网段空间耗尽如何继续扩容(VPC网络模式)
下一篇
对等连接场景下容器流量转发配置