从 Google 数据流访问 GKE 中的 HTTP 服务 运行
Access HTTP service running in GKE from Google Dataflow
我在 Google 容器引擎集群(在 kubernetes 服务后面)上有一个 HTTP 服务 运行。
我的目标是使用固定名称从同一 GCP 项目上的 Dataflow 作业 运行 访问该服务(与使用 DNS 从 GKE 内部访问服务的方式相同)。有什么想法吗?
- 我在 Whosebug 上阅读的大多数解决方案都依赖于在尝试访问服务的机器上安装 kube-proxy。据我所知,不可能在 Dataflow 创建的每个工作实例上可靠地设置该服务。
- 一种选择是创建外部平衡器并在 public DNS 中创建 A 记录。虽然它有效,但我宁愿在我的 public DNS 记录中没有指向该服务的条目。
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
我在 Google 容器引擎集群(在 kubernetes 服务后面)上有一个 HTTP 服务 运行。
我的目标是使用固定名称从同一 GCP 项目上的 Dataflow 作业 运行 访问该服务(与使用 DNS 从 GKE 内部访问服务的方式相同)。有什么想法吗?
- 我在 Whosebug 上阅读的大多数解决方案都依赖于在尝试访问服务的机器上安装 kube-proxy。据我所知,不可能在 Dataflow 创建的每个工作实例上可靠地设置该服务。
- 一种选择是创建外部平衡器并在 public DNS 中创建 A 记录。虽然它有效,但我宁愿在我的 public DNS 记录中没有指向该服务的条目。
GCP 上的数据流作业 运行 不会成为 Google 容器引擎集群的一部分,因此默认情况下它无法访问内部集群 DNS。
尝试 setting up a load balancer 您想要公开的服务,该服务知道如何将 "external" 流量路由到它。这将允许您直接从在 GCP 上执行的 Dataflow 作业连接到 IP 地址。
Lukasz 的回答可能是向数据流公开您的服务的最直接方式。但是,如果您真的不想要 public IP 和 DNS 记录,您可以使用 GCE 路由将流量传送到集群的私有 IP 范围(类似于
这将使您能够访问服务的稳定 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