nodePort、port、targetPort和containerPort
containerPort用在deployment的container标签下,与Dockerfile文件中EXPOSE的端口应一致nodePort、port、targetPort用在service组件中nodePort:k8s服务对外暴露服务的端口,暴露之后,可以对外提供服务port:k8s服务之间相互访问的端口targetPort:当一个pod中有多个容器时,Service怎么知道要选择哪个容器
containerPort用在deployment的container标签下,与Dockerfile文件中EXPOSE的端口应一致
nodePort、port、targetPort用在service组件中
nodePort:k8s服务对外暴露服务的端口,暴露之后,可以对外提供服务
port:k8s服务之间相互访问的端口
targetPort:当一个pod中有多个容器时,Service怎么知道要选择哪个容器的端口呢?就是根据targetPort来确定。一般来说targetPort应该是对外提供服务的容器的端口。
例如,我们有个Spring项目,server.port=9090,在制作docker的时候要EXPOSE相同的端口
FROM java:8
ADD demo.jar /app-springboot.jar
EXPOSE 9090 #一定要是9090
ENTRYPOINT ["java","-jar","/app-springboot.jar"]
在制作Deployment的时候,containerPort要指定9090
apiVersion: apps/v1
kind: Deployment
metadata:
name: ws-backenddpt
namespace: default
labels:
app: ws-backend
spec:
replicas: 1
selector:
matchLabels:
app: ws-backend # has to match .spec.template.metadata.labels
template:
metadata:
labels:
app: ws-backend # has to match .spec.selector.matchLabels
spec:
containers:
- name: ws-backend
image: ws-backend:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 9090 #注意这里
name: ws-backend
在制作Service的时候,唯一要保证的是targetPort与Deployment里面的containerPort相同。
- 如果不写targetPort,则targetPort默认与port相同,那么此时就需要port与containerPort相同。
- 如果写了targetPort,targetPort必须与containerPort相同,否则无法将流量传到后端应用。
kind: Service
apiVersion: v1
metadata:
name: ws-backendsvc
namespace: default
labels:
app: ws-backend
spec:
type: NodePort
ports:
- port: 8081 # 如果port是9090,则targetPort可以省略
targetPort: 9090 #与Deployment里面的containerPort相同
nodePort: 30260
selector:
app: ws-backend
port可以为targetPod引流
Note: A Service can map any incoming port to a targetPort. By default and for
convenience, the targetPort is set to the same value as the port field.
来源:Service
作用
containerPort:建立了Pod和container的联系
nodePort:建立了集群内外的联系
port:建立了集群内部服务的联系。这个在微服务部署时特别有用。比如将我们的前端、后端和数据库抽象成三个Service,他们之间就可以通过Service的<CLUSTER-NAME:port>来相互访问。
targetPort:建立了Service和container的联系
更多推荐
所有评论(0)