我正在尝试在Google Cloud上设置以下环境,并遇到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个不同的pod,其中2个具有开放端口到世界各地。可以在同一实例上运行2个或更多容器。但是标签特定于节点,而不是容器。
c)我是否公开了具有相同防火墙配置的所有节点?我无法为容器分配标签,因此不确定如何公开api服务?
答案 0 :(得分:2)
我会尽力回答你所有的问题。
首先,您需要升级到使用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。您无需担心将负载均衡器映射到,或者为恰好运行您的Pod的特定节点编写防火墙规则(如果您进行滚动更新,它实际上可能会更改!)。即使您的服务未在该节点上运行,kube-proxy也会将流量路由到正确的位置。