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相同。

  1. 如果不写targetPort,则targetPort默认与port相同,那么此时就需要port与containerPort相同。
  2. 如果写了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的联系

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐