带有独立NEG的GKE服务不断显示运行状况检查失败

时间:2020-05-01 10:10:07

标签: gke-networking

我有一个带有服务的简单“ 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”吊舱检查时,我可以卷曲而不会出现问题。另外,如果我尝试在网络中使用VM(与群集处于同一VPC),则会出现“ Hello world!”。

我确实添加了防火墙规则以允许运行状况检查,但是该规则自然会提及群集节点的标记,或者类似“此网络上的所有节点”之类的内容。但是,别名IP是否也在网络上?是因为我无法添加允许网络流量访问虚拟IP的规则而导致健康检查失败?

此刻我无法让NEG为我工作...有人有想法吗?

伯特·拉弗曼

1 个答案:

答案 0 :(得分:1)

因此,答案显得既简单又令人困惑:NEG是由于正确注释服务而创建的,但随后未使用该服务。将使用Pod的IP地址定义NEG(这仅适用于启用了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 /实例组来指定端口。然后像这样创建后端服务:

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