我正在尝试探索kubernetes服务。当我读取服务定义时,我发现有targetPort和port在服务定义中指定。
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
这里kubernetes服务定义中port和targetPort的区别是什么?有谁澄清了这种困惑?
答案 0 :(得分:68)
端口:端口是使服务对同一K8群集中运行的其他服务可见的端口号。换句话说,如果服务想要调用在同一个Kubernetes集群中运行的另一个服务,它将能够使用服务规范文件中针对“port”指定的端口来执行此操作。
目标端口:目标端口是服务正在运行的POD上的端口。
Nodeport :节点端口是使用Kube-Proxy从外部用户访问服务的端口。 看一下定义示例服务的以下规范:
apiVersion: v1
kind: Service
metadata:
name: test-service
spec:
ports:
- port: 8080
targetPort: 8170
nodePort: 33333
protocol: TCP
selector:
component: test-service-app
请注意上述规范中的以下部分内容:
端口为8080,表示群集中端口8080的其他服务可以访问测试服务。 targetPort是8170,表示测试服务实际上正在pod上的端口8170上运行 nodePort是33333,表示可以通过端口33333上的kube-proxy访问测试服务。
答案 1 :(得分:38)
这有助于我从服务的角度思考问题。
nodePort
:外部流量将进入的节点上的端口port
:此服务的端口 targetPort
转接板上的目标端口,用于将流量转发至流量来自nodePort
,转发到服务上的port
,然后路由到pod上的targetPort
。
值得强调的是,nodePort
是用于外部流量的。集群中可能需要访问服务的其他Pod将仅使用port
,而不使用nodePort
,因为它是内部仅对服务的访问。
还值得注意的是,如果未设置targetPort
,它将默认为与port
相同的值。例如。 80:80
用于服务端口80
,目标是容器端口80
。
答案 2 :(得分:12)
@Manikanta P在上面给出的答案是正确的。但是,对“端口”的解释在初读时可能不清楚。我将举例说明:
考虑一个Web应用程序,它的静态内容(首页,图像等)由httpd托管,而动态内容(例如对请求的响应等)则由tomcat托管。 Web服务器(或静态内容)由端口80
上的httpd提供服务,而Appserver(或动态内容)由端口8080
上的tomcat服务。
开发人员想要什么:用户应该能够从外部访问Web服务器,而不是从外部访问Appserver。
解决方案:Webserver的service.yml中的服务类型为NodePort,而Appserver的service.yml中的服务类型为ClusterIP。
网络服务器的service.yml代码:
spec:
selector:
app: Webserver
type: NodePort // written to make this service accessible from outside.
ports:
- nodePort: 30475 // To access from outside, type <host_IP>:30475 in browser.
port: 5050 // (ignore for now, I will explain below).
protocol: TCP
targetPort: 80 // port where httpd runs inside the webserver pod.
Appserver的service.yml代码
spec:
selector:
app: appserver
type: ClusterIP // written to make this service NOT accessible from outside.
ports:
- port: 5050 // port to access this container internally
protocol: TCP
targetPort: 8080 // port where tomcat runs inside the appserver pod.
还请注意,在Web服务器的httpd.conf
文件中,我们将编写IP,该IP将用户的请求重定向到appserver。该IP地址为:host_IP:5050
。
这里到底发生了什么?
用户写hostIP:30475
并查看Web服务器的页面。这是因为它由端口80
(目标端口)上的httpd提供服务。用户单击按钮时,将发出请求。此请求被重定向到Appserver,因为在httpd.conf
文件中提到了端口5050
,这是Appserver的容器与Webserver的容器内部进行通信的端口。当appserver收到请求时,由于tomcat在端口8080
内运行,它能够处理该请求。
答案 3 :(得分:5)
简而言之
nodeport:
侦听nodeip:port上所有辅助节点上的外部请求,并将请求转发到端口。
port:
容器的内部集群服务端口,用于侦听来自节点端口的传入请求并转发到targetPort。
targetPort:
从端口接收请求,然后转发到正在监听的容器pod(port)。即使您未指定,默认情况下也会为该端口分配与port相同的端口号。
答案 4 :(得分:2)
除了其他答案,该答案还参考Kubernetes的文档:
https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/:
targetPort
:是容器接受流量的端口,
port
:是抽象的Service端口,可以是其他Pod用于访问Service的任何端口
https://kubernetes.io/docs/concepts/services-networking/service/:
Pod中的端口定义具有名称,您可以在服务的
targetPort
属性中引用这些名称。即使服务中使用单一配置的名称混合Pod,也可以通过不同的端口号使用相同的网络协议,这仍然有效。
答案 5 :(得分:1)
服务:这会将流量定向到吊舱。
TargetPort:这是您的应用程序在容器上运行的实际端口。
端口:有时,容器中的应用程序在不同的端口上提供不同的服务。例如:-实际应用程序可以运行8080,并且此应用程序的运行状况检查可以在容器的8089端口上运行。 因此,如果您在没有端口的情况下访问该服务,它将不知道应将请求重定向到容器的哪个端口。服务需要有一个映射,以便它可以访问容器的特定端口。
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,则流量将路由到容器(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:30475,10.10.20.20:31261,10.10.20.20:30013来访问http,指标,健康服务
答案 6 :(得分:1)
“目标端口”是容器运行所在的端口。
Port:端口将流量从服务重定向到容器。
公开部署
master $ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 31s
master $ kubectl expose deployment nginx --name=nginx-svc --port=8080 --target-port=80
service/nginx-svc exposed
master $ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc ClusterIP 10.107.209.151 <none> 8080/TCP 5s
NodePort:是使服务能够从外部访问的端口。
希望这个答案。
答案 7 :(得分:1)
如果容器侦听端口9376,则 targetPort :9376
如果服务在端口80上侦听,则 端口:80
然后,服务端口配置如下所示
ports:
- protocol: TCP
port: 80
targetPort: 9376
最后,请求已接收到服务的端口,并转发到了Pod的 targetPort 。
答案 8 :(得分:1)
这个答案是给绝对初学者的:
案例 1:
假设没有 nodPort 或端口,现在您想运行您的应用程序并将其公开给外部,您将需要:
因此,为了从外部访问,我们发现需要三个端口。
一切正常: servicePort === targetPort === networkPort
情况 2: 现在假设一个服务与我们集群中的另一个服务通信,或者假设一个服务收到来自外部的请求,并且它发出一个事件触发我们集群内部的另一个服务。
假设Service X通过nodePort Service暴露在外面,X服务收到请求后想和Y服务通信。
Y 服务需要以下端口
端口 === 任意
targetPort === 应用端口
内部服务 X:
app.post('/posts/create', async (req, res) => {
const id = randomBytes(4).toString('hex');
const { title } = req.body;
posts[id] = {
id,
title
};
await axios.post('http://event-bus-srv:4010/events', {
type: 'PostCreated',
data: {
id,
title
}
});
res.status(201).send(posts[id]);
});
配置和服务内部 Y
apiVersion: v1
kind: Service
metadata:
name: event-bus-srv
spec:
selector:
app: event-bus
type: ClusterIP
ports:
- name: event-bus
protocol: TCP
port: 4010
targetPort: 4009
app.listen(4009, () => {
console.log('Listening on 4009');
});
答案 9 :(得分:0)
targetport:容器在 pod 内侦听的一个或多个端口。
nodeport:主要用于接受消费者请求。 (例如:从消费者到容器中运行的网络服务器的 HTTP 请求)
nodeport 在所有接口上的所有节点上侦听,即 0.0.0.0:nodeport。发送到 nodeport 的消费者服务请求被路由到容器的目标端口,以便容器可以完成请求。
port:kubernetes pod 网络内使用的端口,主要用于 pod 之间交换请求。在这里,来自另一个 Pod 的请求也被路由到对应 Pod 的容器目标端口。
摘要:所有请求都在目标端口中结束。 nodeport 用于 k8s 网络外部的请求,port 用于内部请求。