1

我有一个简单的“Hello world”部署,带有一个服务:

apiVersion: v1
kind: Service
metadata:
  name: hello-kube
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"80":{}}}'
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  selector:
    app: hello-kube

部署工作正常,并创建了 NEG,但是当我在 Web 控制台中检查时,实际端点(正确使用虚拟 Pod IP 地址)显示为不正常。当我使用交互式“ubuntu”Pod 检查时,我可以毫无问题地卷曲。此外,如果我在网络中尝试虚拟机(与集群所在的 VPC 相同),我会得到“Hello world!”。

我确实添加了防火墙规则以允许运行状况检查,但该规则自然要么提到集群节点的标签,要么提到“所有在这个网络上”之类的东西。但是,别名 IP 是否也在网络上?是否因为我无法添加允许网络流量到虚拟 IP 的规则而导致运行状况检查失败?

目前我无法让 NEG 为我工作......有人有想法吗?

伯特·拉弗曼

4

1 回答 1

2

所以答案看起来既简单又令人困惑:NEG 是作为正确注释的服务的结果创建的,但该服务随后未被使用。NEG 将使用 Pod 的 IP 地址定义(这仅适用于启用 IP 别名的集群)。对我来说,任何根据服务规范设置负载均衡器和后端服务的尝试都失败了。如果您将服务视为发布工具,它将起作用,但不要尝试重新映射端口。

所以你应该:

  • 根据需要使用端口设置 Pod/Deployment
  • 使用注解定义服务,但保持端口相等:
apiVersion: v1
kind: Service
metadata:
  name: hello-kube
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"80":{}}}'
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: hello-kube

这将为您提供一个 NEG,您可以将其添加到后端服务,但如果您没有创建正确的运行状况检查,您仍然可能会混淆。其实最简单的方法是:

gcloud compute health-checks create http http-basic-check --use-serving-port

这将为您提供一个通用的 HTTP 健康检查,这取决于 NEG/Instance Group 来指定端口。然后像这样创建后端服务:

gcloud compute backend-services create magic-backend --protocol HTTP --health-checks http-basic-check --global

您可以立即将此后端服务添加到您的 LoadBalancer,并且不会改变。需要根据您的服务部署添加/删除 NEG。NEG 将自动获取 Pod 更新(扩展、迁移等)。您可以使用“AutoNEG 控制器”(请参阅​​ https://github.com/GoogleCloudPlatform/gke-autoneg-controller)自动将 NEG 添加/删除到后端服务。在上面的示例中,这意味着您需要添加注释(在安装控制器之后):

apiVersion: v1
kind: Service
metadata:
  name: hello-kube
  annotations:
    cloud.google.com/neg: '{"exposed_ports": {"80":{}}}'
    anthos.cft.dev/autoneg: '{"name":"magic-backend", "max_rate_per_endpoint":1000}'
spec:
  type: ClusterIP
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: hello-kube
于 2020-05-06T10:00:45.837 回答