网络

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 地址块。您可以在集群之间共享同一个块。地址块的大小决定了服务数量。Ingress 服务需要一个 Service IP,Kubernetes 服务(如集群 DNS 等)需要 10 个或更多个 IP。
Services VIP
当您公开 Service 时,在 F5 上为 L4 Ingress 配置的 N 个可路由 IP 地址。这些 VIP 与您在创建 LoadBalancer 类型的 Service 时设置的 loadBalancerIP 值相同。
控制层面 VIP
在 F5 负载平衡器上为 Kubernetes API 服务器配置的可路由 IP 地址。
Ingress VIP
在 F5 负载平衡器上为 L7 Ingress 以及在每个节点上运行的 Envoy 代理配置的可路由 IP 地址。

网络配置选项

您可以通过多种方式配置集群的网络:

  • 您可以选择一个全球 vCenter 网络,也可以为管理员集群和用户集群使用不同的 vCenter 网络。
  • 您可以使用 HTTP 代理,并且可以选择要从代理中排除的地址。
  • 您可以选择 DHCP 或静态 IP 分配。
  • 您可以选择集成或手动负载平衡模式。

安装期间,您可以在 GKE On-Prem 配置文件中指定偏好设置。

vCenter 网络配置

配置的 network 字段确定要用于集群的 vCenter 网络

  • 全局 vcenter.network 字段指定一个特定网络。
  • admincluster.vcenter.network 会替换全局字段,并指定要用于管理员集群的网络。
  • usercluster.vcenter.network 会替换全局字段,并指定要用于用户集群的网络。

示例:通过网址访问 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 地址会加载应用。