Kubernetes服务可以在服务定义中有一个targetPort和port:
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
端口和targetPort有什么区别?
Kubernetes服务可以在服务定义中有一个targetPort和port:
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
端口和targetPort有什么区别?
当前回答
在简而言之
nodeport:监听nodeip:nodeport上所有工作节点上的外部请求,并将请求转发到port。
ClusterIP:请求来自入口,指向服务名称和端口。
port:容器的内部集群服务端口,监听来自节点端口的传入请求并转发到targetPort。
targetPort:从端口接收请求并转发到它正在侦听的容器吊舱(端口)。即使不指定,默认情况下也会分配与port相同的端口号。
所以流量流入——>服务——>端点(基本上有POD IP)——>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:服务对外访问的端口。
希望这是答案。
它帮助我从服务的角度考虑问题。
nodePort:节点上外部流量进入的端口 port:该服务的端口 targetPort pod上转发流量的目标端口
流量从nodePort进入,转发到服务上的port,然后路由到pod上的targetPort。
值得强调的是,nodePort用于外部流量。集群中其他可能需要访问服务的pod将只使用port,而不是nodePort,因为它只在内部访问服务。
另外值得注意的是,如果没有设置targetPort,它将默认为与port相同的值。例如,80:80服务端口80针对集装箱端口80。
由于人们已经在Kubernetes Service定义中解释了port和targetPort,我将添加关于Dockerfile、Kubernetes Deployment和Kubernetes Ingress的信息,因为它们是公共工作流的一部分。
第1部分-应用程序及其Dockerfile
假设您在端口3000上运行Flask服务器,在端口4000上运行Golang服务器。当你使用Docker容器化这些应用程序时,你必须在dockerfile中公开端口3000和4000:
Python
应用程序
...
...
if __name__ == "__main__":
app.run(host='0.0.0.0', port=3000)
Dockerfile
FROM python:3.10-alpine
...
...
EXPOSE 3000
CMD ...
戈朗
应用程序
...
...
func main() {
...
log.Fatal(http.ListenAndServe(":4000", nil))
}
Dockerfile
FROM golang:1.18-alpine
...
...
EXPOSE 4000
CMD ...
第2部分- Dockerfiles和Kubernetes部署
Dockerfiles中的公开端口必须与部署清单中的containerPort匹配。
Python部署清单
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-flask-api
spec:
...
...
app: flask-api
template:
metadata:
labels:
app: flask-api
spec:
containers:
- name: flask-api
image: ...
ports:
- containerPort: 3000
...
...
Golang部署清单
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-backend-api
spec:
...
...
app: go-api
template:
metadata:
labels:
app: go-api
spec:
containers:
- name: go-api
image: ...
ports:
- containerPort: 4000
...
...
第3部分- Kubernetes部署和服务
部署清单中的containerPort必须与服务清单中的targetPort匹配
Python服务清单
apiVersion: v1
kind: Service
metadata:
name: flask-api-service
spec:
type: NodePort
selector:
app: flask-api
ports:
- port: 80
targetPort: 3000
Golang服务舱单
apiVersion: v1
kind: Service
metadata:
name: go-api-service
spec:
type: NodePort
selector:
app: go-api
ports:
- port: 443
targetPort: 4000
第4部分- Kubernetes服务和入口
服务清单中的端口必须与入口中的端口号匹配
适用于Python和Golang应用程序的AWS入口
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: microservice-app-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
rules:
- host: foo.biz.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: go-api-service
port:
number: 443
- host: bar.biz.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: flask-api-service
port:
number: 80
Flow
传入请求命中端口号上的入节点 入口将此请求转发到服务端口 服务端口将该端口映射到targetPort 从服务targetPort请求到部署containerPort 部署containerPort是应用程序的Docker映像,它在Dockerfile中公开了相应的端口 最后,Dockerfile中的公开端口将请求发送给应用程序
在简而言之
nodeport:监听nodeip:nodeport上所有工作节点上的外部请求,并将请求转发到port。
ClusterIP:请求来自入口,指向服务名称和端口。
port:容器的内部集群服务端口,监听来自节点端口的传入请求并转发到targetPort。
targetPort:从端口接收请求并转发到它正在侦听的容器吊舱(端口)。即使不指定,默认情况下也会分配与port相同的端口号。
所以流量流入——>服务——>端点(基本上有POD IP)——>POD