首页 > 解决方案 > 如何将 Kubernetes 服务指定为 Google Cloud 任务的 HTTP 目标?

问题描述

我有一个在 Google Kubernetes Engine 上运行的 nodejs express 服务器,在某个 IP(比如 10.0.20.20)上作为 NodePort 服务公开。

我想将此 nodejs 服务用作 Google Cloud 任务的处理程序,因此我创建了以下任务(使用 Python 库):

task = {
    'http_request': {
        'http_method': 'POST',
        'url': 'http://10.0.20.20/myendpoint',
        'body': payload
    }
}

该任务已成功创建,但是,它会卡在队列中,永远重试。如何设置我的服务,以便可以从 Google Cloud 任务访问它?

标签: google-kubernetes-enginegoogle-cloud-tasks

解决方案


根据您想要在此处实现的方案,建议使用 GKE 级别的服务公开。

我假设您想从与 GKE 集群节点位于同一网络上的实例连接到该 nodejs 服务,因为您使用的是 RFC-1918 IP。

一个节点端口只能使用(按照现在)从 30000 到 32767 的范围。

您可以在 30000--32767 范围内指定自己的 nodePort 值。但是,最好省略该字段,让 Kubernetes 为您分配一个 nodePort。这避免了服务之间的冲突。

因此,您正在使用的网址:

http://10.0.20.20/myendpoint

默认情况下使用端口 80/tcp,而不是我之前提到的 nodePort 范围之一(30000 到 32767),因此失败。

如果您只想在同一 VPC 和区域上的其他实例内部使用直通,请使用服务类型loadbalancer,如果您想要为您而不是后端处理 HTTPS 的中间服务,请使用内部入口但保留在请注意,这仍处于测试阶段,您需要提供自己的SSL 证书,因为这目前与 Google 托管证书不兼容。

提醒一下,假设您使用的是稳定的 GKE 版本集群,内部负载均衡器服务类型被视为区域资源,这意味着您只能在您创建它们的同一子网中使用它们,少数例外是 VPN 和/或互连到同一 VPC 和子网区域,从1.16及更高版本开始,此行为将是可选的。


推荐阅读