CCE 支持 IPv4 和 IPv6 双栈网络
所有文档

          容器引擎 CCE

          CCE 支持 IPv4 和 IPv6 双栈网络

          CCE 支持 IPv4 和 IPv6 双栈网络

          IPv6 可以有效地弥补 IPv4 网络地址空间有限的问题,CCE 目前支持 IPv4/IPv6 双栈集群,包括如下特点:

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

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

          新建 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 容器网段和 ClusterIP 网段后,系统将自动分配对应的 IPv6 网段并显示在下方。 IPv6网段不允许用户手动指定。

          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.ipFamily 属性指定 Service 的 IP 地址类型,其值为 IPv4 或 IPv6。

          注意

          1. 在忽略 spec.ipFamily 配置的情况下, Kubernetes 将使用 kube-controller-manager 中 --service-cluster-ip-range 参数的第一段 IP 地址为 Service 分配 IP 地址。因此为了避免混淆,我们建议在双栈集群中部署 Service 时始终配置 spec.ipFamily 属性。
          2. 在使用 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:
            ipFamily: IPv4
            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>

          创建 IPv6 的 Service

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

          apiVersion: v1
          kind: Service
          metadata:
            name: service-example-ipv6
            annotations:
              prometheus.io/scrape: "true"
          spec:
            ipFamily: IPv6
            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

          参考文档

          上一篇
          容器网段空间耗尽如何继续扩容
          下一篇
          CCE IP Masquerade Agent 用户指南