CCE 支持 IPv4 和 IPv6 双栈网络
CCE 支持 IPv4 和 IPv6 双栈网络
互联网协议第六版(IPv6)是互联网升级演进的必然趋势、网络技术创新的重要方向、网络强国建设的基础支撑。CCE 目前支持 IPv4/IPv6 双栈集群,包括如下特点:
11. Node 同时支持 IPv4 和 IPv6 地址,集群内部支持使用两种类型地址通信;
22. Pod 双栈同时支持 IPv4 和 IPv6 地址,并支持两种类型 IP 访问;
33. Service 同时支持 IPv4 和 IPv6 地址,并支持通过 IPv6 对外暴露服务。
IPv6 双栈网络参考:VPC 使用 IPv6
使用说明
仅支持在CCE标准集群中使用IPv4/IPv6双栈容器网络。
前置条件
- kubernetes 版本1.20以上
- cce-network网络插件版本2.7.7以上
新建 IPv4/IPv6 双栈 VPC 及子网
CCE IPv4/IPv6 双栈集群需要运行在支持 IPv6 的 VPC(私有网络) 的子网中,因此在创建双栈集群前应首先创建一个支持 IPv6 的 VPC 及其子网。
创建 VPC
在 VPC 控制台内新建 VPC,并开启『分配IPv6网段』。
创建子网
在 VPC 中创建子网,并开启『分配IPv6网段』。
新建 IPv4/IPv6 双栈 K8S 集群
进入 CCE 控制台,创建双栈集群,如下所示:
- 在『基础配置』页面
选择开启『IPv6双栈网络』,并选择一个支持 IPv6 的 VPC 和其子网。
- 在『网络配置』页面
系统会自动推荐合适的 IPv4/IPv6 ClusterIP 网段并显示在下方。 IPv6网段支持用户手动指定符合RFC 4193定义的唯一本地地址(Unique Local Addresses,ULA),地址范围是
fd00::/8
的子集。
- 后续按提示进行,完成集群的创建。
通过 IPv4 和 IPv6 访问 Pod
在 IPv4/IPv6 双栈集群中,可以为 Pod 同时分配 IPv4 地址和 IPv6 地址。
注意:后端 Pod 也需要监听 IPv6 协议栈下端口,否则会出现 Pod 被分配了 IPv6 地址但是连接被拒绝的情况
通过 CCE 控制台的『工作负载』页面,创建示例 Deployment,可以使用以下示例 Deployment,其中所用的镜像同时在监听 IPv4 和 IPv6 协议栈的 80 端口:
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4 name: deployment-example-ipv6
5 labels:
6 app: nginx
7spec:
8 replicas: 2
9 minReadySeconds: 0
10 strategy:
11 type: RollingUpdate
12 rollingUpdate:
13 maxSurge: 25%
14 maxUnavailable: 25%
15 selector:
16 matchLabels:
17 app: nginx
18 template:
19 metadata:
20 labels:
21 app: nginx
22 spec:
23 restartPolicy: Always
24 containers:
25 - name: nginx
26 image: hub.baidubce.com/cce/nginx-alpine-go:ipv6
27 imagePullPolicy: Always
28 ports:
29 - containerPort: 80
查看 Pod IPv4/IPv6 地址:
1# kubectl get pods deployment-example-64445974b7-8s6zc -o go-template --template='{{range .status.podIPs}}{{printf "%s \n" .ip}}{{end}}'
2172.17.0.12
3fc00::c
访问 Pod 的 IPv4 地址:
1# curl 172.17.0.12
访问 Pod 的 IPv6 地址:
1# 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 地址类型,其值为 IPv4
或 IPv6
。
注意
- 在未指定
.spec.ipFamilies
配置的情况下, Kubernetes 将使用 kube-controller-manager 中 --service-cluster-ip-range 参数的第一段 IP 地址为 Service 分配 IP 地址。因此为了避免混淆,我们建议在双栈集群中部署 Service 时始终配置.spec.ipFamilies
属性。.spec.ipFamilies
是一个可变更的字段:可以通过修改这个字段的值,来控制添加或删除service的辅助IP。 但不可以修改service的主IP。- 在使用 IPv6 版的 LoadBalancer Service 时,后端 Pod 无法从网络包中获取请求的原始 IP 地址。
创建 IPv4 单栈的 Service
指定 spec.ipFamily: IPv4 为 Service 分配 IPv4 地址:
1apiVersion: v1
2kind: Service
3metadata:
4 name: service-example-ipv4
5 annotations:
6 prometheus.io/scrape: "true"
7spec:
8 ipFamilies:
9 - IPv4
10 ipFamilyPolicy: SingleStack
11 selector:
12 app: nginx
13 type: LoadBalancer
14 externalTrafficPolicy: Cluster
15 sessionAffinity: None
16 ports:
17 - name: nginx
18 protocol: TCP
19 port: 80
20 targetPort: 80
查看 IPv4 Service 详情:
1# kubectl describe svc service-example-ipv4
2Name: service-example-ipv4
3Namespace: default
4Labels: <none>
5Annotations: prometheus.io/scrape: true
6 service.beta.kubernetes.io/cce-load-balancer-id: lb-bedc26c1
7Selector: app=nginx
8Type: LoadBalancer
9IP: 172.16.63.112
10LoadBalancer Ingress: 106.13.103.101
11Port: nginx 80/TCP
12TargetPort: 80/TCP
13NodePort: nginx 30009/TCP
14Endpoints: 172.17.0.12:80,172.17.0.13:80
15Session Affinity: None
16External Traffic Policy: Cluster
17Events:
18 Type Reason Age From Message
19 ---- ------ ---- ---- -------
20 Normal EnsuringLoadBalancer 6m56s service-controller Ensuring load balancer
21 Normal EnsuredLoadBalancer 6m37s service-controller Ensured load balancer
访问 IPv4 ClusterIP:
1# curl 172.16.63.112
2
3<!DOCTYPE html>
4<html>
5<head>
6<title>Welcome to nginx!</title>
7<style>
8 body {
9 width: 35em;
10 margin: 0 auto;
11 font-family: Tahoma, Verdana, Arial, sans-serif;
12 }
13</style>
14</head>
15<body>
16<h1>Welcome to nginx!</h1>
17<p>If you see this page, the nginx web server is successfully installed and
18working. Further configuration is required.</p>
19
20<p>For online documentation and support please refer to
21<a href="http://nginx.org/">nginx.org</a>.<br/>
22Commercial support is available at
23<a href="http://nginx.com/">nginx.com</a>.</p>
24
25<p><em>Thank you for using nginx.</em></p>
26</body>
27</html>
创建 IPv4/IPv6双栈 的 Service
指定 spec.ipFamily: IPv6 为 Service 分配 IPv6 地址:
1apiVersion: v1
2kind: Service
3metadata:
4 name: service-example-ipv6
5 annotations:
6 prometheus.io/scrape: "true"
7spec:
8 ipFamilyPolicy: PreferDualStack
9 ipFamilies:
10 - IPv6
11 - IPv4
12 selector:
13 app: nginx
14 type: LoadBalancer
15 externalTrafficPolicy: Cluster
16 sessionAffinity: None
17 ports:
18 - name: nginx
19 protocol: TCP
20 port: 80
21 targetPort: 80
查看 IPv6 Service 详情:
1# kubectl describe svc service-example-ipv6
2Name: service-example-ipv6
3Namespace: default
4Labels: <none>
5Annotations: prometheus.io/scrape: true
6 service.beta.kubernetes.io/cce-load-balancer-id: lb-da9b6673
7Selector: app=nginx
8Type: LoadBalancer
9IP: fdff:ffff:ffff:ffff:ffff:ffff:ffff:faa0
10LoadBalancer Ingress: 240c:4082:1:4202::8
11Port: nginx 80/TCP
12TargetPort: 80/TCP
13NodePort: nginx 30685/TCP
14Endpoints: [fc00::c]:80,[fc00::d]:80
15Session Affinity: None
16External Traffic Policy: Cluster
17Events:
18 Type Reason Age From Message
19 ---- ------ ---- ---- -------
20 Normal EnsuringLoadBalancer 4m8s service-controller Ensuring load balancer
21 Normal EnsuredLoadBalancer 3m56s service-controller Ensured load balancer
访问 IPv6 ClusterIP:
1# curl -g [fdff:ffff:ffff:ffff:ffff:ffff:ffff:faa0]:80
2
3<!DOCTYPE html>
4<html>
5<head>
6<title>Welcome to nginx!</title>
7<style>
8 body {
9 width: 35em;
10 margin: 0 auto;
11 font-family: Tahoma, Verdana, Arial, sans-serif;
12 }
13</style>
14</head>
15<body>
16<h1>Welcome to nginx!</h1>
17<p>If you see this page, the nginx web server is successfully installed and
18working. Further configuration is required.</p>
19
20<p>For online documentation and support please refer to
21<a href="http://nginx.org/">nginx.org</a>.<br/>
22Commercial support is available at
23<a href="http://nginx.com/">nginx.com</a>.</p>
24
25<p><em>Thank you for using nginx.</em></p>
26</body>
27</html>
公网通过 IPv6 地址访问 Service
IPv6 网关为 VPC 内的 IPv6 地址提供公网连通性。若从公网通过 IPv6 地址访问 Service 或是使用 IPv6 地址的容器访问公网,需要 VPC 配置 IPv6 网关及相关路由。
创建 IPv6 网关
在 VPC 控制台的 『IPv6网关』标签页,点击『创建IPv6网关』
填写网关信息,其中『所在网络』选择集群所在的 VPC。
添加 IPv6 网关路由
在 VPC 控制台的 VPC 实例页面中,点击『路由表』标签页,可以选择创建新路由表或者使用default 路由表。
选择需要配置的路由表进入,点击『添加路由』,填写路由表条目配置信息,其中『源网段』是 VPC 中的子网网段,目标网段为『::/0』,路由类型为『IPv6公网网关』,『下一跳实例』为上一步创建的网关。
注意 若您的集群横跨一个 VPC 中的多个子网,您需要为每个子网网段创建路由条目。
访问上述 Service IPv6 EIP:
1# curl -g [240c:4082:1:4202::8]:80