Service Kubernetes服务定义中targetPort和port之间的差异
Kubernetes在服务定义中可以有Service Kubernetes服务定义中targetPort和port之间的差异,service,kubernetes,port,Service,Kubernetes,Port,Kubernetes在服务定义中可以有targetPort和port: 种类:服务 版本:v1 元数据: 姓名:我的服务 规格: 选择器: 应用程序:MyApp 端口: -协议:TCP 港口:80 目标港:9376 端口和目标端口之间有什么区别?服务:这会将流量引导到pod TargetPort:这是容器中运行应用程序的实际端口 端口:有时,容器内的应用程序在不同的端口上提供不同的服务 示例:实际应用程序可以运行8080,此应用程序的运行状况检查可以在容器的8089端口上运行。 因此,如果您点
targetPort
和port
:
种类:服务
版本:v1
元数据:
姓名:我的服务
规格:
选择器:
应用程序:MyApp
端口:
-协议:TCP
港口:80
目标港:9376
端口
和目标端口
之间有什么区别?服务:这会将流量引导到pod
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的主机上的端口
这样,流量将重定向到容器的某个端口。这是节点端口
(主机上公开的端口)。
从上面的示例中,您可以通过host\u 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 services
编辑:根据评论编辑。以上@Manikanta p给出的答案是正确的。然而,“港口”的解释在一读时可能有点不清楚。我会举例说明: 考虑一个Web应用程序,它的静态内容(首页、图像等)由httpd托管,而动态内容(如对请求的响应等)由tomcat托管。Web服务器(或静态内容)由httpd在端口
80
提供服务,而Appserver(或动态内容)由tomcat在端口8080
提供服务
开发人员想要的:用户应该能够从外部访问Web服务器,但不能从外部访问Appserver
解决方案:其service.yml中的Web服务器的服务类型将是NodePort,而其service.yml中的Appserver的服务类型将是ClusterIP
Web服务器的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.
还要注意,在Web服务器的httpd.conf
文件中,我们将编写将用户请求重定向到appserver的IP。此IP将为:主机\u IP:5050
这里到底发生了什么?
用户写入
hostIP:30475
并查看Web服务器的页面。这是因为httpd正在端口80
(targetport)为其提供服务。当用户单击按钮时,会发出请求。此请求被重定向到Appserver,因为在httpd.conf
文件中提到了端口5050
,这是Appserver的容器和Web服务器的conatainer内部通信的端口。当appserver接收到请求时,它能够为请求提供服务,因为tomcat在其内部的端口8080
上运行,这有助于我从服务的角度思考问题
:节点上的端口,外部通信将在其中进入nodePort
:此服务的端口端口
pod上要将流量转发到的目标端口targetPort
节点端口
进入,转发到服务上的端口
,然后路由到pod上的目标端口
值得进一步强调的是,nodePort
用于外部流量。群集中可能需要访问服务的其他POD将只使用端口
,而不是节点端口
,因为它是对服务的内部唯一访问
还值得注意的是,如果未设置
targetPort
,它将默认为与port
相同的值。例如,80:80
对于服务港80
目标集装箱港80
除了其他答案外,此答案还参考Kubernetes的文档:
:
targetPort
:是集装箱接受运输的港口
端口
:是抽象的服务端口,可以是其他POD用于访问服务的任何端口
:
POD中的端口定义有名称,您可以在服务的targetPort
属性中引用这些名称。即使服务中存在使用单个配置名称的混合POD,并且通过不同的端口号可以使用相同的网络协议,这也可以工作
“目标端口”是容器运行的端口
端口:端口将流量从服务重定向到容器
公开部署
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
master$kubectl获取部署
姓名就绪最新可用年龄
nginx 1/1 31s
master$kubectl公开部署nginx--name=nginx svc--port=8080--target port=80
服务/nginx svc暴露
master$kubectl获得svc
名称类型CLUSTER-IP外部IP端口年龄
nginx svc群集IP 10.107.209.151 8080/TCP 5s
NodePort:是要使用的端口吗
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
ports:
- protocol: TCP
port: 80
targetPort: 9376
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]);
});
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');
});