Kubernetes 中容器端口和目标端口的区别?
Difference between Container port and targetport in Kubernetes?
container port
与 Kubernetes 容器中的 targetports
有何不同?
它们是否可以互换使用,如果可以,为什么?
我发现了下面的代码片段,其中 containerPort
用于表示 Kubernetes 中 pod 上的 port
。
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment
labels:
app: demo-voting-app
spec:
replicas: 1
selector:
matchLabels:
name: postgres-pod
app: demo-voting-app
template:
metadata:
name: postgres-pod
labels:
name: postgres-pod
app: demo-voting-app
spec:
containers:
- name: postgres
image: postgres:9.4
ports:
- containerPort: 5432
在上面的代码片段中,他们为 containerPort
参数(在最后一行)提供了 5432。那么,这个 containerPort
与 targetport
有何不同?
据我所知,术语port
一般是指service
(Kubernetes)上的port
。如果我不正确,请纠正我。
pod 规范中的 ContainerPort
要从容器公开的端口列表。在此处公开端口可为系统提供有关容器使用的网络连接的附加信息,但主要是信息性的。此处不指定端口不会阻止该端口被公开
服务规范中的目标端口
要在服务所针对的 pods 上访问的端口号或名称。数字必须在 1 到 65535 的范围内。名称必须是 IANA_SVC_NAME。如果这是一个字符串,它将在目标 Pod 的容器端口中查找为命名端口。如果未指定,则使用 'port' 字段的值(恒等映射)。
因此,服务中的 targetPort
需要与 pod 规范中的 containerPort
匹配,因为这是服务知道哪个容器端口是将流量转发到目的地的方式。
简而言之: targetPort
和 containerPort
基本上指的是同一个端口(所以如果两者都被使用,它们应该具有相同的值) 但它们用于两种不同的上下文并且具有完全不同的目的。
它们不能互换使用,因为它们都是两个不同的 kubernetes resources/objects 规范的一部分:分别是 Service
和 Pod
。虽然 containerPort
的目的可以被视为纯粹的信息,但 Service
需要 targetPort
,它公开了一组 Pods
.
请务必了解,通过在 Pod
/Deployment
规范中使用特定值声明 containerPort
,您无法使 Pod
公开此特定端口,例如如果你在 containerPort
字段声明你的 nginx Pod
暴露端口 8080
而不是默认的 80
,你仍然需要在你的容器中配置你的 nginx 服务器来监听这个端口.
在 Pod
规范中声明 containerPort
是可选的。即使没有它,您的 Service
也会根据它在 targetPort
.
中声明的信息知道将请求定向到哪里
最好记住,不需要在 Service
定义中声明 targetPort
。如果省略它,它默认为您为 port
声明的值(这是 Service
本身的端口)。
containerPort是端口,可以访问容器内的app。
targetPort为端口,暴露在集群中,服务将pod连接到其他服务或用户。
container port
与 Kubernetes 容器中的 targetports
有何不同?
它们是否可以互换使用,如果可以,为什么?
我发现了下面的代码片段,其中 containerPort
用于表示 Kubernetes 中 pod 上的 port
。
apiVersion: apps/v1
kind: Deployment
metadata:
name: postgres-deployment
labels:
app: demo-voting-app
spec:
replicas: 1
selector:
matchLabels:
name: postgres-pod
app: demo-voting-app
template:
metadata:
name: postgres-pod
labels:
name: postgres-pod
app: demo-voting-app
spec:
containers:
- name: postgres
image: postgres:9.4
ports:
- containerPort: 5432
在上面的代码片段中,他们为 containerPort
参数(在最后一行)提供了 5432。那么,这个 containerPort
与 targetport
有何不同?
据我所知,术语port
一般是指service
(Kubernetes)上的port
。如果我不正确,请纠正我。
pod 规范中的 ContainerPort
要从容器公开的端口列表。在此处公开端口可为系统提供有关容器使用的网络连接的附加信息,但主要是信息性的。此处不指定端口不会阻止该端口被公开
服务规范中的目标端口
要在服务所针对的 pods 上访问的端口号或名称。数字必须在 1 到 65535 的范围内。名称必须是 IANA_SVC_NAME。如果这是一个字符串,它将在目标 Pod 的容器端口中查找为命名端口。如果未指定,则使用 'port' 字段的值(恒等映射)。
因此,服务中的 targetPort
需要与 pod 规范中的 containerPort
匹配,因为这是服务知道哪个容器端口是将流量转发到目的地的方式。
简而言之: targetPort
和 containerPort
基本上指的是同一个端口(所以如果两者都被使用,它们应该具有相同的值) 但它们用于两种不同的上下文并且具有完全不同的目的。
它们不能互换使用,因为它们都是两个不同的 kubernetes resources/objects 规范的一部分:分别是 Service
和 Pod
。虽然 containerPort
的目的可以被视为纯粹的信息,但 Service
需要 targetPort
,它公开了一组 Pods
.
请务必了解,通过在 Pod
/Deployment
规范中使用特定值声明 containerPort
,您无法使 Pod
公开此特定端口,例如如果你在 containerPort
字段声明你的 nginx Pod
暴露端口 8080
而不是默认的 80
,你仍然需要在你的容器中配置你的 nginx 服务器来监听这个端口.
在 Pod
规范中声明 containerPort
是可选的。即使没有它,您的 Service
也会根据它在 targetPort
.
最好记住,不需要在 Service
定义中声明 targetPort
。如果省略它,它默认为您为 port
声明的值(这是 Service
本身的端口)。
containerPort是端口,可以访问容器内的app。
targetPort为端口,暴露在集群中,服务将pod连接到其他服务或用户。