Answers:
服务:这将流量引导到吊舱。
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
则将流量路由到8080
容器(targetPort)。同样,如果您单击,my-service:8443
则将其重定向到8085
容器(targetPort)。但这myservice:8089
是kubernetes集群的内部功能,可以在一个应用程序想要与另一应用程序通信时使用。因此,要从集群外部访问服务,需要有人公开运行kubernetes的主机上的端口,以便将流量重定向到容器的端口。这是node port
(主机上暴露的端口)。在上面的示例中,您可以通过以下方式从群集外部(邮递员或任何其他客户端)访问服务:host_ip:nodePort
假设你的主机机的ip是10.10.20.20
可以通过打HTTP,指标,卫生服务10.10.20.20:30475
,10.10.20.20:31261
,10.10.20.20:30013
。
编辑:根据Raedwald评论进行编辑。
port
和targetPort
有所不同的好处是什么?因此,例如查看您的health
示例,为什么要使用port
8443
代替8085
?基本上,为什么有两个参数而不是只公开targetPort
服务上的所有?
从服务的角度来看,这对我有所帮助。
nodePort
:节点上将要传入外部流量的端口port
:此服务的端口targetPort
Pod上用于将流量转发到的目标端口流量进来nodePort
,转发到port
服务上,然后路由到targetPort
Pod上。
值得强调的是更多nodePort
用于外部流量的信息。集群中可能需要访问服务的其他Pod只会使用port
,而不是nodePort
内部访问服务的唯一容器。
同样值得注意的是,如果targetPort
未设置,则默认值为port
。例如,80:80
以服务端口为80
目标的容器端口80
。
port
和targetPort
。您确实消除了混乱。
@Manikanta P上面给出的答案是正确的。但是,对“端口”的解释在初读时可能不清楚。我将举例说明:
考虑一个Web应用程序,它的静态内容(首页,图像等)由httpd托管,而动态内容(例如对请求的响应等)则由tomcat托管。Web服务器(或静态内容)由端口的httpd提供服务,80
而Appserver(或动态内容)由端口的tomcat提供服务8080
。
开发人员的要求:用户应该能够从外部访问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.
还要注意,在httpd.conf
Web服务器的文件中,我们将编写IP,该IP将用户的请求重定向到appserver。该IP地址为:host_IP:5050
。
这里到底发生了什么?用户编写hostIP:30475
并查看Web服务器的页面。这是因为它是由端口80
(targetport)上的httpd提供服务的。用户单击按钮时,将发出请求。此请求被重定向到Appserver,因为在httpd.conf
文件5050
中提到了端口,这是Appserver的容器和Webserver的容器内部进行通信的端口。当appserver收到请求时,由于tomcat在port中运行,它能够处理请求8080
。
httpd.conf
在“由于httpd.conf文件中,提到端口5050”
除其他答案外,该答案还参考Kubernetes的文档:
https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/:
targetPort
:是容器接受流量的端口,
port
:是抽象的Service端口,可以是其他Pod用于访问Service的任何端口
https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/:
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
NodePort:是使服务能够从外部访问的端口。
希望这个答案。