网络

GKE On-Prem 使用 Kubernetes 网络概念,如 ServiceIngress。本文档介绍 GKE On-Prem 网络的开箱配置方式。

集群服务操作和孤岛模式

GKE On-Prem 使用孤岛模式配置,在这种配置中,Pod 可以直接在集群内相互通信,但无法从集群外部访问。这种配置会在未连接到外部网络的网络内形成一个“孤岛”。集群使用 BGP(通过 Calico CNI 插件)跨集群节点形成完整的节点到节点网格,从而允许 Pod 直接访问集群内的其他 Pod。

所有从 Pod 到集群外部目标的出站流量都由节点 IP 进行 NAT。GKE On-Prem 包括一个 L7 负载平衡器和基于 Envoy 的 Ingress 控制器,该控制器用于处理集群内部部署的 ClusterIP Services 的 Ingress 对象规则。Ingress 控制器本身显示为集群中的 NodePort Service。

您可通过 L3/L4 F5 负载平衡器访问 Ingress NodePort 服务。安装会在负载平衡器上配置虚拟 IP 地址 (VIP)(具有端口 80 和 443)。VIP 指向 Ingress 控制器的 NodePort Service 中的端口。外部客户端就是通过这种方式访问集群中的服务。

只要在 Service 规范中配置了 loadBalancerIP 字段,用户集群就可以运行 LoadBalancer 类型的 Service。在 loadBalancerIP 字段中,您需要提供要使用的 VIP。这将在 F5 上进行配置,并指向 Service 的 NodePort。

作为使用 F5 负载平衡器的替代方法,您可以启用手动负载平衡模式。如果您选择使用手动负载平衡,则不能运行 LoadBalancer 类型的 Service。但是,您可以创建 NodePort 类型的 Service 并手动配置负载平衡器,以将其用作后端。此外,您还可以使用 Ingress 对象向外部客户端公开 Service。

网络架构

描述 GKE On-Prem 架构的图表图:GKE On-Prem 网络。

节点 IP 地址
DHCP 或为节点(也称为虚拟机)静态分配的 IP 地址。必须在数据中心内可路由。您可以手动分配静态 IP。
Pod CIDR 地址块
集群中的所有 Pod 的不可路由 CIDR 地址块。在此范围中,为每个节点分配较小的 /24 范围。如果您需要 N 节点集群,请确保此地址块足够大,能够支持 N 个 /24 地址块。
Service CIDR 地址块
在孤岛模式下,类似于 Pod CIDR 地址块,因此仅在集群内使用。任何不与节点重叠的专用 CIDR 地址块、VIP 或 Pod CIDR 地址块。您可以在集群之间共享同一个块。块的大小决定了服务数量。入站服务需要一个服务 IP,Kubernetes 服务(如集群 DNS 等)需要 10 个或更多个 IP。
服务 VIP
当您公开服务时,需要在 F5 上为 N4 Ingress 配置 N 个可路由的 IP 地址。这些 VIP 与您在创建 LoadBalancer 类型的服务时生成的 loadBalancerIP 值相同。
控制平面 VIP
在 F5 负载平衡器上为 Kubernetes API 服务器配置的可路由 IP 地址。
Ingress VIP
一个可路由的 IP 地址,可在 F5 负载平衡器上为 L7 Ingress 以及在每个节点上运行的 Envoy 代理配置该地址。

network 配置

这些参数会在集群配置文件的 network 字段下捕获。

以下示例为 network 字段,用于指定大部分参数:

# Example of a network section with static node IPs
network:
  clusterip:
    servicecidr: 10.96.232.0/24
    podcidr: 192.168.0.0/16
  nodeip:
    mode: static
    addressblock:
      hostconfig:
        dns: 8.8.8.8
        tod: 192.138.210.214
      blocks:
        - netmask: 255.255.252.0
          gateway: 10.116.232.0
          ips:
            - ip: 10.116.232.23
              hostname: host1.enterprise.net
            - ip: 10.116.232.65
              hostname: host2.enterprise.net
            - ip: 10.116.232.66
              hostname: host3.enterprise.net
  loadbalancer:
    controlplaneip: 10.115.231.45
    ingressip: 10.115.231.54
    kind: F5BigIP
    f5bigip:
      server: 10.113.24.12
      username: # encoded value
      password: # encoded value
      partition: admin-partition

network 字段由三个子字段 clusteripnodeiploadbalancer组成,用于为集群配置不同的网络设置。nodeip.blocks 子字段是可选的;仅当将 nodeip.mode 设置为静态时,才需要指定此字段。

如果将节点配置为通过 HTTP 获取 IP,则应按如下所示配置 network 字段:

# Example of a network section using DHCP for node IPs
network:
  clusterip:
    servicecidr: 10.96.232.0/24
    podcidr: 192.168.0.0/16
  nodeip:
    mode: dhcp
  loadbalancer:
    controlplaneip: 10.115.231.45
    ingressip: 10.115.231.54
    kind: F5BigIP
    f5bigip:
      server: 10.113.24.12
      username: admin
      password: secret
      partition: user-partition

示例:通过网址访问 Web 应用

假设您有一个在集群中作为名为 frontend 的 Deployment 运行的留言板 Web 应用。您要使用网址 www.guestbook.com 连接到该应用。您需要通过某种方式将该网址映射到集群中运行的 Deployment。您可以使用 Kubernetes Ingress 对象执行此操作。

首先,为 *.guestbook.com 创建一个指向集群现有 Ingress VIP 的通配符 DNS 条目:

*.guestbook.com    A   [INGRESS_VIP]

接下来,您需要为前端 Deployment 创建一个 Service。运行 kubectl expose 会创建一个 Service,以便对 Deployment 的 Pod 进行逻辑分组,并在集群内为它们提供一个相同的 IP 地址:

kubectl expose deployment frontend

这会创建一个类型为 ClusterIP 的 Service,如下所示:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: guestbook
  name: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: guestbook
  type: ClusterIP

您需要将网址 www.guestbook.com 映射到刚创建的前端 Service。应用以下 Ingress 会创建该映射:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: frontend
  labels:
    app: guestbook
spec:
  rules:
    - host: www.guestbook.com
      http:
        paths:
          - backend:
              serviceName: frontend   # name of the frontend Service
              servicePort: 80

现在,访问 www.guestbook.com 即可在浏览器中打开 Web 应用。

下面介绍具体运作方式:

  • 由于您创建了这个通配符 DNS 条目,因此当您访问该网址时,就是在访问集群的 Ingress VIP。
  • 集群根据主机名(在本例中为 www.guestbook.com)查找正确的 Ingress 对象。
  • 流量被端口转发到前端 Pod。

示例:通过 IP 地址访问 Web 应用

如果您的应用不是 Web 应用,或者您有网络限制,那么您可能希望为您的服务专门创建一个 VIP 地址。您可以使用 LoadBalancer 类型的 Kubernetes Service 执行此操作。

以下 Service 示例专门为 guestbook 应用创建一个 VIP:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: guestbook
  name: frontend
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: guestbook
  type: LoadBalancer
  loadBalancerIP: [IP_ADDRESS]

应用此 Service 后,您会在 F5 控制台中看到 VIP,并在控制台的菜单中看到节点的 IP 地址。访问 IP 地址会加载应用。