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 地址块。您可以在集群之间共享同一个块。块的大小决定了服务数量。入站服务需要一个服务 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
字段由三个子字段 clusterip
、nodeip
和 loadbalancer
组成,用于为集群配置不同的网络设置。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 地址会加载应用。