从 Google 数据流访问 GKE 中的 HTTP 服务 运行

Access HTTP service running in GKE from Google Dataflow

我在 Google 容器引擎集群(在 kubernetes 服务后面)上有一个 HTTP 服务 运行。

我的目标是使用固定名称从同一 GCP 项目上的 Dataflow 作业 运行 访问该服务(与使用 DNS 从 GKE 内部访问服务的方式相同)。有什么想法吗?


GCP 上的数据流作业 运行 不会成为 Google 容器引擎集群的一部分,因此默认情况下它无法访问内部集群 DNS。

尝试 setting up a load balancer 您想要公开的服务,该服务知道如何将 "external" 流量路由到它。这将允许您直接从在 GCP 上执行的 Dataflow 作业连接到 IP 地址。

Lukasz 的回答可能是向数据流公开您的服务的最直接方式。但是,如果您真的不想要 public IP 和 DNS 记录,您可以使用 GCE 路由将流量传送到集群的私有 IP 范围(类似于 中的选项 1)。

这将使您能够访问服务的稳定 IP。我不确定如何让 Kubernetes 的内部 DNS 从 Dataflow 解析。

编辑: GKE(现在称为 Kubernetes Engine)现在支持此功能:https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing

恕我直言,我已经非常顺利地实现了这一点。我将尝试简要介绍它的工作原理:

  • 请记住,当您创建容器集群(或节点池)时,它将由作为默认网络一部分的实例组中的一组 GCE 实例组成。注意:添加一个特定的 GCE 网络标签,这样您以后就可以只将这些实例添加到防火墙规则中,让负载均衡器检查实例健康状况。
  • 这个实例组只是一个普通的实例组。
  • 现在,请记住 kubernetes 有一个叫做 NodePort 的东西,它会在所有节点(即集群中的所有 GCE 实例)上公开此端口上的服务。这就是我们想要的!
  • 现在我们知道我们在实例组中有一组 GCE 实例,然后我们可以将这个实例组添加到默认网络中的 internal 负载均衡器,而不需要它了解有关 kubernetes 内部结构或 DNS 的任何信息。
  • 您可以遵循的指南,跳过许多初始步骤在此处:https://cloud.google.com/compute/docs/load-balancing/internal/
  • 请记住,这适用于区域,因此数据流和其他一切都必须在同一区域。

查看此服务规范:

kind: Service
  apiVersion: v1
metadata:
  name: name
  labels:
    app: app
spec:
  selector:
    name: name
    app: app
    tier: backend
  ports:
  - name: health
    protocol: TCP
   enter code here port: 8081
    nodePort: 30081
  - name: api
    protocol: TCP
    port: 8080
    nodePort: 30080
  type: NodePort

这是用于设置负载均衡器的代码,它需要运行健康检查、转发规则和防火墙:

_region=<THE_REGION>
_instance_group=<THE_NODE_POOL_INSTANCE_GROUP_NAME>
#Can be different for your case
_healtcheck_path=/liveness
_healtcheck_port=30081
_healtcheck_name=<THE_HEALTCHECK_NAME>
_port=30080
_tags=<TAGS>
_loadbalancer_name=internal-loadbalancer-$_region
_loadbalancer_ip=10.240.0.200

gcloud compute health-checks create http $_healtcheck_name \
  --port $_healtcheck_port \
  --request-path $_healtcheck_path

gcloud compute backend-services create $_loadbalancer_name \
  --load-balancing-scheme internal \
  --region $_region \
  --health-checks $_healtcheck_name

gcloud compute backend-services add-backend $_loadbalancer_name \
  --instance-group $_instance_group \
  --instance-group-zone $_region-a \
  --region $_region

gcloud compute forwarding-rules create $_loadbalancer_name-forwarding-rule \
  --load-balancing-scheme internal \
  --ports $_port \
  --region $_region \
  --backend-service $_loadbalancer_name \
  --address $_loadbalancer_ip
#Allow google cloud to healthcheck your instance
gcloud compute firewall-rules create allow-$_healtcheck_name \
  --source-ranges 130.211.0.0/22,35.191.0.0/16 \
  --target-tags $_tags \
  --allow tcp