一个Kubernetes Service定义里可以有一个targetPort和port。
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
port
和targetPort
之间的区别是什么?
一个Kubernetes Service定义里可以有一个targetPort和port。
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
port
和targetPort
之间的区别是什么?
Service:将流量引向一个pod。
TargetPort:你的应用程序在容器内运行的真实的端口。
Port:有些时候,你在容器内的应用程序在不同的端口上提供了不同的服务。
例子:实际的应用程序运行在
8080
,而这个应用程序的健康检查可以在容器的8089
端口上进行。因此,如果你在没有端口的情况下访问Service,它不知道应该把请求重定向到容器的哪个端口。所以Service需要有一个映射,以便它能定位到容器的指定端口上。
kind: Service apiVersion: v1 metadata: name: my-service spec: selector: app: MyApp ports: - name: http nodePort: 30475 port: 8089 protocol: TCP targetPort: 8080 - name: metrics nodePort: 31261 port: 5555 protocol: TCP targetPort: 5555 - name: health nodePort: 30013 port: 8443 protocol: TCP targetPort: 8085
如果你访问
my-service:8089
,流量会被路由到容器(目标端口)的8080
上。同样,如果你访问my-service:8443
,那么它将被重定向到容器的8085
(目标端口)。但是这个myservice:8089
是kubernetes集群内部的,当一个应用程序想与另一个应用程序通信时可以使用。因此,要从集群外部访问该服务,需要在运行kubernetes的主机上公开暴露该端口,这样,流量就会被重定向到容器的一个端口。这就是"node port"(在物理主机暴露的端口)。上面的例子中,你可以通过
host_ip:nodePort
从集群外部访问服务。假设你的主机ip是
10.10.20.20
,你可以通过10.10.20.20:30475
、10.10.20.20:31261
、10.10.20.20:30013
来访问http、metrics、health服务。从 Service(服务)角度来考虑问题:
nodePort
:物理节点上的端口,外部流量将通过该端口进入。port
::服务的端口。targetPort
:要转发流量到pod上容器的真实目标端口。流量从
nodePort
进入,转发到服务的port
,然后转发到pod上的targetPort
。值得强调的是,
nodePort
是为外部流量服务的。集群中的其他pod可能需要访问该服务,将只使用port
,而不是nodePort
,因为这只是对服务的内部访问。另外值得注意的是,如果没有设置
targetPort
,它将默认为与port
相同的值。例如,80:80
代表服务端口80
,目标是容器端口80
。谢谢补充!
你的答案