GKE On-Prem 使用 Kubernetes 网络概念,如 Service 和 Ingress。本文档介绍 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 网络。
- 节点 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 地址会加载应用。