Google 容器引擎中的集群通信和防火墙
Cluster communication and firewalls in Google Container Engine
我正在尝试在 Google Cloud 上设置以下环境,但遇到了 3 个主要问题:
数据库集群
- 3 个节点
- 一个端口对世界开放,几个端口对计算集群开放
计算集群
- 5个节点
- 与数据库集群通信
- 两口岸对外开放
- 运行 Docker 个容器
a) 数据库集群运行良好,我有配置端口对外开放,但我不知道如何将其他端口限制为仅计算集群?
我设法在计算集群上获得了第一个 Pod 和 Replication-Controller 运行,并创建了一个服务来向世界开放容器:
控制器:
{
"id": "api-controller",
"kind": "ReplicationController",
"apiVersion": "v1beta1",
"desiredState": {
"replicas": 2,
"replicaSelector": {
"name": "api"
},
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "apiController",
"containers": [{
"name": "api",
"image": "gcr.io/my/api",
"ports": [{
"name": "api",
"containerPort": 3000
}]
}]
}
},
"labels": {
"name": "api"
}
}
}
}
服务:
{
"id": "api-service",
"kind": "Service",
"apiVersion": "v1beta1",
"selector": {
"name": "api"
},
"containerPort": "api",
"protocol": "TCP",
"port": 80,
"selector": { "name": "api" },
"createExternalLoadBalancer": true
}
b)容器暴露3000端口,服务端口80,两者有什么联系?
防火墙使用标签。我希望在我的计算集群中有 4-5 个不同的 pods 运行,其中 2 个具有通向世界的开放端口。同一实例上可以有 2 个或更多容器 运行。然而,标签特定于节点,而不是容器。
c) 我是否公开具有相同防火墙配置的所有节点?我无法为容器分配标签,所以不确定如何公开 api 服务?
我会尽力回答您的所有问题。
首先,您需要升级到使用 Kubernetes API 的 v1,因为 v1beta1 和 v1beta3 将在 8 月 5 日之后不再可用:
https://cloud.google.com/container-engine/docs/v1-upgrade
此外,使用 YAML。它不那么冗长 ;)
--
现在回答您提出的问题:
a) 我不确定我是否完全理解你在这里问的问题,但听起来 运行 同一集群中的服务(使用 resource limits)会比尝试更容易处理跨集群网络。
b) 您需要指定一个 targetPort
以便服务知道在容器上使用哪个端口。这应该与您在资源控制器中拥有的端口 3000 相匹配。有关详细信息,请参阅 docs。
{
"kind": "Service",
"apiVersion": "v1",
"metadata: {
"labels": [{
"name": "api-service"
}],
},
"spec": {
"selector": {
"name": "api"
},
"ports": [{
"port": 80,
"targetPort": 3000
}]
"type": "LoadBalancer"
}
}
c) 是的。在 Kubernetes 中,kube-proxy 接受任何节点上的流量并将其路由到适当的节点或本地 pod。您无需担心将负载均衡器映射到恰好是 运行 您的 pods 的那些特定节点,或编写防火墙规则(如果您进行滚动更新,它实际上可能会改变!) .即使您的服务不在该节点上 运行,kube-proxy 也会将流量路由到正确的位置。
我正在尝试在 Google Cloud 上设置以下环境,但遇到了 3 个主要问题:
数据库集群
- 3 个节点
- 一个端口对世界开放,几个端口对计算集群开放
计算集群 - 5个节点 - 与数据库集群通信 - 两口岸对外开放 - 运行 Docker 个容器
a) 数据库集群运行良好,我有配置端口对外开放,但我不知道如何将其他端口限制为仅计算集群?
我设法在计算集群上获得了第一个 Pod 和 Replication-Controller 运行,并创建了一个服务来向世界开放容器:
控制器:
{
"id": "api-controller",
"kind": "ReplicationController",
"apiVersion": "v1beta1",
"desiredState": {
"replicas": 2,
"replicaSelector": {
"name": "api"
},
"podTemplate": {
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "apiController",
"containers": [{
"name": "api",
"image": "gcr.io/my/api",
"ports": [{
"name": "api",
"containerPort": 3000
}]
}]
}
},
"labels": {
"name": "api"
}
}
}
}
服务:
{
"id": "api-service",
"kind": "Service",
"apiVersion": "v1beta1",
"selector": {
"name": "api"
},
"containerPort": "api",
"protocol": "TCP",
"port": 80,
"selector": { "name": "api" },
"createExternalLoadBalancer": true
}
b)容器暴露3000端口,服务端口80,两者有什么联系?
防火墙使用标签。我希望在我的计算集群中有 4-5 个不同的 pods 运行,其中 2 个具有通向世界的开放端口。同一实例上可以有 2 个或更多容器 运行。然而,标签特定于节点,而不是容器。
c) 我是否公开具有相同防火墙配置的所有节点?我无法为容器分配标签,所以不确定如何公开 api 服务?
我会尽力回答您的所有问题。
首先,您需要升级到使用 Kubernetes API 的 v1,因为 v1beta1 和 v1beta3 将在 8 月 5 日之后不再可用: https://cloud.google.com/container-engine/docs/v1-upgrade
此外,使用 YAML。它不那么冗长 ;)
--
现在回答您提出的问题:
a) 我不确定我是否完全理解你在这里问的问题,但听起来 运行 同一集群中的服务(使用 resource limits)会比尝试更容易处理跨集群网络。
b) 您需要指定一个 targetPort
以便服务知道在容器上使用哪个端口。这应该与您在资源控制器中拥有的端口 3000 相匹配。有关详细信息,请参阅 docs。
{
"kind": "Service",
"apiVersion": "v1",
"metadata: {
"labels": [{
"name": "api-service"
}],
},
"spec": {
"selector": {
"name": "api"
},
"ports": [{
"port": 80,
"targetPort": 3000
}]
"type": "LoadBalancer"
}
}
c) 是的。在 Kubernetes 中,kube-proxy 接受任何节点上的流量并将其路由到适当的节点或本地 pod。您无需担心将负载均衡器映射到恰好是 运行 您的 pods 的那些特定节点,或编写防火墙规则(如果您进行滚动更新,它实际上可能会改变!) .即使您的服务不在该节点上 运行,kube-proxy 也会将流量路由到正确的位置。