一个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。谢谢补充!
你的答案