考虑一个非常简单的service.yaml文件:
kind: Service
apiVersion: v1
metadata:
name: gateway-service
spec:
type: NodePort
selector:
app: gateway-app
ports:
- name: gateway-service
protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080
我们知道服务会将所有请求路由到端口app=gateway-app
(a.k.a.8080
)的targetPort
标签。服务定义中还有另一个port
字段,在这种情况下是80
。这个port
用于什么?我们什么时候应该使用它?
从文档中,还有这一行:
默认情况下,
targetPort
将设置为与端口字段相同的值。参考:https://kubernetes.io/docs/concepts/services-networking/service/
换句话说,什么时候我们应该保持targetPort
和port
相同,什么时候不?
在nodePort
服务中,您可以定义3种类型的端口:
TARGETPORT:
正如您在问题中提到的,这是您的pod的相应端口,基本上是您在副本清单中定义的containerPort
s。
端口(servicePort):
这定义了其他本地资源可以引用的端口。引自Kubernetes文档:
此服务将[本地]显示为.spec.clusterIP:spec.ports [*]。port
这意味着,这不是公开访问的,但是您可以通过此端口通过其他资源(在群集内)引用您的服务端口。例如,您为此服务创建入口。在您的入口处,您将被要求在servicePort
字段中显示此端口:
...
backend:
serviceName: test
servicePort: 80
NodePort:
这是节点上公开公开您的服务的端口。再次引用文档:
此服务将[公开]显示为[NodeIP]:spec.ports [*]。nodePort
Port
是客户将连接到的。 TargetPort
是容器正在收听的内容。当它们不相等时的一个用例是当你在非root用户下运行容器并且通常不能绑定到1024以下的端口时。在这种情况下你可以监听8080但是客户端仍然会连接到80,这对他们来说可能更简单。