主题
在 Deployment和Service中,我们能看到这几个port的名词,这几个之间port之间的关系容易让人混淆,所以这里做一遍梳理,以此巩固记忆
笔记
举例来说,如下的yaml文件中,存在containerPort,port,targetPort,nodePort
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文件
- 先建立了一个
Deployment,管理3个pod的期望,监听pod的80端口,pod name为myapp - 然后创建一个
Service,将pod:myapp的80端口在Cluster内暴露,暴露的端口为8080 ;再通过NodePort的方式,将service:mysvc-node-port匹配到的每个Node对外暴露30001端口 流程类似下图(途中的端口号与文件的不同,仅做举例展示)
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内