k8s学习笔记-问题-NodePort/Port/TargetPort/contianerPort 的区别与关系

695 阅读2分钟

主题

在 Deployment和Service中,我们能看到这几个port的名词,这几个之间port之间的关系容易让人混淆,所以这里做一遍梳理,以此巩固记忆

笔记

举例来说,如下的yaml文件中,存在containerPortporttargetPortnodePort

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deploy
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
      release: stable
  template:
    metadata:
      labels:
        app: myapp
        release: stable
        env: test
    spec:
      containers:
        - name: myapp
          image: wangyanglinux/myapp:v2
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: mysvc-node-port
  namespace: default
spec:
  type: NodePort
  selector:
    app: myapp
    release: stable
  ports:
    - name: http
      port: 8080
      targetPort: 80
      nodePort: 30001

文件说明

上述yaml文件

  1. 先建立了一个Deployment,管理3个pod的期望,监听pod的80端口,pod name为myapp
  2. 然后创建一个Service,将pod:myapp80端口在Cluster内暴露,暴露的端口为8080 ;再通过NodePort的方式,将service:mysvc-node-port匹配到的每个Node对外暴露30001端口 流程类似下图(途中的端口号与文件的不同,仅做举例展示) image.png

port说明

对于这些port,含义分别如下:

  • containerPort:
    • 位置:Deployment/spec.template.spec.containers[0].port[0]
    • 功能:监听pod内的80端口。
    • 生效范围:pod内
  • targetPort
    • 位置:Service/`spec.ports[0]·
    • 功能:监听pod内的80端口。
    • 生效范围:pod内

备注:targetPort和containerPort是同一个端口

  • port

    • 位置:Service/spec.template.spec.containers[0].port[0]
    • 功能:指定pod的在集群内的暴露端口
    • 生效范围:暴露在集群内
  • NodePort

    • 位置:Service/spec.template.spec.containers[0].port[0]
    • 功能:指定Node在容器外的暴露端口,缺省则自动分配(3000-32767)
    • 生效范围:暴露在集群外

从client访问角度来看,三者的入方向访问流量方向为 NodePort->Port->TargetPort

从暴露的维度来看:

  • NodePort对集群外部暴露
  • Port在集群内部暴露
  • TargetPort在Pod内