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

Google cloud dataflow 从Google数据流访问GKE中运行的HTTP服务,google-cloud-dataflow,google-kubernetes-engine,Google Cloud Dataflow,Google Kubernetes Engine,我有一个HTTP服务在Google容器引擎集群上运行(在kubernetes服务后面) 我的目标是使用固定名称从运行在同一GCP项目上的数据流作业访问该服务(同样,可以使用DNS从GKE内部访问服务)。有什么想法吗 我在stackoverflow上读到的大多数解决方案都依赖于在试图访问服务的机器上安装kube代理。据我所知,不可能在数据流创建的每个工作实例上可靠地设置该服务 一个选项是创建外部平衡器并在公共DNS中创建A记录。虽然它可以工作,但我宁愿在我的公共DNS记录中没有指向该服务的条目

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

我的目标是使用固定名称从运行在同一GCP项目上的数据流作业访问该服务(同样,可以使用DNS从GKE内部访问服务)。有什么想法吗


  • 我在stackoverflow上读到的大多数解决方案都依赖于在试图访问服务的机器上安装kube代理。据我所知,不可能在数据流创建的每个工作实例上可靠地设置该服务
  • 一个选项是创建外部平衡器并在公共DNS中创建A记录。虽然它可以工作,但我宁愿在我的公共DNS记录中没有指向该服务的条目

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


请为您要公开的服务尝试一个知道如何将“外部”流量路由到它的服务。这将允许您直接从在GCP上执行的数据流作业连接到IP地址。

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

这将使您达到服务的稳定IP。我不确定如何从数据流中解析Kubernetes的内部DNS。

编辑: GKE现在支持这一点(现在称为Kubernetes引擎):

我已经以一种非常顺利的方式实现了这一点。我将简要介绍它的工作原理:

  • 请记住,当您创建容器集群(或nodepool)时,它将由作为默认网络一部分的实例组中的一组GCE实例组成。注意:添加一个特定的GCE网络标记,以便您以后可以仅将这些实例添加到防火墙规则中,以便负载平衡器检查实例的运行状况
  • 此实例组只是一个常规实例组
  • 现在,请记住kubernetes有一个名为
    NodePort
    ,它将在所有节点(即集群中的所有GCE实例)上的该端口公开服务。这就是我们想要的
  • 现在我们知道在一个实例组中有一组GCE实例,我们可以将该实例组添加到默认网络中的内部负载平衡器中,而无需了解kubernetes内部或DNS
  • 您可以遵循以下指南,跳过许多初始步骤:
  • 请记住,这适用于区域,因此数据流和其他所有内容必须位于同一区域
请参阅此服务规范:

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
\u区域=
_实例组=
#你的情况可能会有所不同
_healtcheck_path=/liveness
_HEALCHECK_端口=30081
_healtcheck_名称=
_端口=30080
_标签=
_loadbalancer\u name=内部loadbalancer-$\u区域
_负载平衡器ip=10.240.0.200
gcloud计算运行状况检查创建http$\u healtcheck\u名称\
--端口$\u healtcheck\u端口\
--请求路径$\u healtcheck\u路径
gcloud compute后端服务创建$\u loadbalancer\u名称\
--内部负载平衡方案\
--地区$\u地区\
--健康检查$\u healtcheck\u name
gcloud compute后端服务添加后端$\u loadbalancer\u名称\
--实例组$\u实例组\
--实例组区域$\u区域-a\
--地区$\u地区
gcloud计算转发规则创建$\u loadbalancer\u name-forwarding-rule\
--内部负载平衡方案\
--端口$\u端口\
--地区$\u地区\
--后端服务$\u loadbalancer\u名称\
--地址$\u loadbalancer\u ip
#允许谷歌云健康检查您的实例
gcloud计算防火墙规则创建允许-$\u healtcheck\u名称\
--源范围为130.211.0.0/22,35.191.0.0/16\
--目标标记$\u标记\
--允许tcp

这是否适用于数据流?数据流在VPC内部运行,并将与路由一起工作?看起来您需要使用--network arg创建数据流作业才能完成此任务?非常感谢提供此信息。此外,希望这对其他人有所帮助:您可以将该服务作为LoadBalancer类型运行,并添加“internal”注释标记。重新部署服务,GKE将为您处理设置。大约需要2分钟和5分钟。