上云无忧 > 文档中心 > 百度智能云容器引擎服务 CCE 支持 IPv4 和 IPv6 双栈网络
容器引擎服务CCE
百度智能云容器引擎服务 CCE 支持 IPv4 和 IPv6 双栈网络

文档简介:
IPv6 可以有效地弥补 IPv4 网络地址空间有限的问题,CCE 目前支持 IPv4/IPv6 双栈集群,包括如下特点: 1. Node 同时支持 IPv4 和 IPv6 地址,集群内部支持使用两种类型地址通信; 2. Pod 双栈同时支持 IPv4 和 IPv6 地址,并支持两种类型 IP 访问; 3. Service 同时支持 IPv4 和 IPv6 地址,并支持通过 IPv6 对外暴露服务。
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

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 选项。

创建子网

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

新建 IPv4/IPv6 双栈 K8S 集群

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

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

  1. 在『容器网络』页面 选择合适的 IPv4 容器网段和 ClusterIP 网段后,系统将自动分配对应的 IPv6 网段并显示在下方。 IPv6网段不允许用户手动指定。

  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

查看 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 地址。

创建 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网关』标签页,点击『创建网关』

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

添加 IPv6 网关路由

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

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

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

访问上述 Service IPv6 EIP:

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

参考文档

  • IPv4/IPv6 双栈
  • 验证 K8S IPv4/IPv6 双栈网络
相似文档
  • 本文档会详细展示如何配置 ip-masq-agent, 用户可以灵活地将各种配置进行组合,满足容器流量出节点时身份的选择。 关键术语: NAT (网络地址解析) 是一种通过修改 IP 地址头中的源和/或目标地址信息将一个 IP 地址重新映射到另一个 IP 地址的方法。通常由执行 IP 路由的设备执行。
  • 本文档会描述在对等连接场景下, 跨 VPC 的集群如何配置 VPC 路由,以便不同集群可以在节点、容器层面实现互相连通。 前置条件: 对等连接已经创建完成。 对等连接提供了VPC级别的网络互联服务,帮助用户实现在不同虚拟网络之间的流量互通。在本文档中,默认用户已经创建好对等连接以及 VPC 中的端点。 【百度智能云】对等连接
  • 在 VPC Route 网络模式下, Pod 的 IP 地址网段通常与节点 IP 地址网段不同。 在集群默认配置下,当非 HostNetwork 网络模式的 Pod 访问私有 IP 地址段内的 IP (10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16)时,数据包的源 IP 是 Pod IP。这导致当访问目的地址是集群外的虚机或服务时,会出现网络不通的情况。 对于这些情况,我们需要配置 ip-masq-agent 以满足网络访问需求。
  • 注意:以下内容仅针对使用 “VPC-CNI”模式的集群。 概述: VPC-CNI 模式下,容器的 IP 来自 VPC 中的子网。随着集群规模扩大,ENI 子网中的 IP 可能耗尽,利用 CNI 提供的动态配置功能,可以给集群增加新的 ENI 子网。
  • K8S 配置字典(ConfigMap): ConfigMap 是 K8S 的一种 API 对象,用来将非机密性的数据保存到健值对中,用户在 CCE 可以通过页面或 kubectl 方式管理 ConfigMap。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部