考虑一个非常简单的 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
(也称为8080
)处将所有请求路由到带有此标签targetPort
的Pod。服务定义中还有另一个port
字段,在此情况下为80
。 port
用于什么用途?我们什么时候应该使用它?
在文档中,也有以下一行:
默认情况下,
targetPort
将被设置为与端口字段相同的值。参考:https://kubernetes.io/docs/concepts/services-networking/service/
换句话说,我们什么时候应该保持targetPort
和port
相同,什么时候不保持?
答案 0 :(得分:4)
在osascript -e 'tell application "VLC" to get name of current item'
服务中,您可以定义3种端口:
TargetPort :
正如您在问题中提到的,这是您的pod的端口,实际上是您在副本清单中定义的nodePort
的端口。
端口(servicePort):
这定义了其他本地资源可以引用的端口。引用Kubernetes文档:
此服务将在本地显示为.spec.clusterIP:spec.ports [*]。port
意思是,这不是公共可访问的,但是您可以通过具有此端口的其他资源(群集内)来引用您的服务端口。例如,当您为此服务创建入口时。在您的入口中,您需要在containerPort
字段中显示此端口:
servicePort
NodePort :
这是节点上公开公开服务的端口。再次引用文档:
此服务将在[公共]上显示为[NodeIP]:spec.ports [*]。nodePort
答案 1 :(得分:3)
Port
。 TargetPort
是容器正在侦听的内容。当它们不相等时,一种用例是在非root用户下运行容器并且通常无法绑定到1024以下的端口。在这种情况下,您可以侦听8080,但客户端仍将连接到80,这可能对他们来说更简单。 / p>
答案 2 :(得分:0)
服务:这会将流量定向到吊舱。
TargetPort:这是您的应用程序在容器上运行的实际端口。
端口:有时,容器中的应用程序在不同的端口上提供不同的服务。例如:-实际应用程序可以运行8080,并且此应用程序的运行状况检查可以在容器的8089端口上运行。 因此,如果您在没有端口的情况下访问该服务,它将不知道应将请求重定向到容器的哪个端口。服务需要有一个映射,以便它可以访问容器的特定端口。
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
nodePort: 32111
port: 8089
protocol: TCP
targetPort: 8080
- name: metrics
nodePort: 32353
port: 5555
protocol: TCP
targetPort: 5555
- name: health
nodePort: 31002
port: 8443
protocol: TCP
targetPort: 8085
如果您点击my-service:8089,则流量将路由到容器(targetPort)的8080。同样,如果您点击my-service:8443,则它将被重定向到容器(targetPort)的8085。
但是此myservice:8089是kubernetes集群的内部组件,可以在一个应用程序想要与另一个应用程序通信时使用。因此,要从集群外部访问服务,需要有人公开运行kubernetes的主机上的端口 以便将流量重定向到容器的端口。在那可以使用nodePort。
在上面的示例中,您可以通过host_ip:Nodeport从集群外部(邮递员或任何restclient)访问该服务
假设您的主机IP为10.10.20.20,则可以按10.10.20.20:32111,10.10.20.20:32353,10.10.20.20:31002来访问http,指标,健康服务
答案 3 :(得分:0)
让我们举个例子,并尝试借助图表来理解。 考虑一个具有2个节点和一个服务的群集。每个节点有2个容器,每个节点有2个容器,分别是应用容器和Web容器。
NodePort:3001(每个节点的群集级别公开端口)
端口:80(服务端口)
targetPort:8080(应用程序容器端口在docker暴露中应该提到)
targetPort:80(在docker公开中应该提到Web容器端口)
现在下图应该可以帮助我们更好地理解它。
参考:https://theithollow.com/2019/02/05/kubernetes-service-publishing/