从Google Dataflow访问在GKE中运行的HTTP服务

时间:2016-03-05 08:50:53

标签: google-cloud-dataflow google-kubernetes-engine

我在Google Container Engine集群上运行HTTP服务(在kubernetes服务之后)。

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

  • 我在stackoverflow上阅读的大多数解决方案都依赖于在尝试访问服务的计算机上安装kube-proxy。据我所知,无法在Dataflow创建的每个工作实例上可靠地设置该服务。
  • 一种选择是创建外部平衡器并在公共DNS中创建A记录。虽然它有效,但我宁愿在我的公共DNS记录中没有指向该服务的条目。

3 个答案:

答案 0 :(得分:2)

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

这可以让您点击服务的稳定IP。我不确定如何让Kubernetes的内部DNS从Dataflow中解析。

答案 1 :(得分:2)

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

我已经以非常流畅的方式实现了这一点恕我直言。我将尝试简要介绍它的工作原理:

  • 请记住,在创建容器集群(或nodepool)时,它将包含一个实例组中的一组GCE实例,该实例组是默认网络的一部分。注意:添加特定的GCE网络标记,以便稍后可以将这些实例添加到防火墙规则中,以使负载均衡器检查实例运行状况。
  • 此实例组只是一个常规实例组。
  • 现在,请记住kubernetes有一个叫NodePort的东西,它将在所有节点上的这个端口上公开服务,即集群中的所有GCE实例。这就是我们想要的!
  • 现在我们知道实例组中有一组GCE实例,然后我们可以将此实例组添加到默认网络中的内部负载均衡器,而无需了解任何有关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

答案 2 :(得分:0)

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

尝试setting向上load balancer获取您要公开的服务,该服务知道如何将“外部”流量路由到该服务。这将允许您直接从GCP上执行的Dataflow作业连接到IP地址。