服务错误地选择了侦听某个不同端口的 Pod

Service is incorrectly selecting Pod listening on some different port

我尝试了 here 中的服务定义示例。

所以,我创建了以下服务:

apiVersion: v1
kind: Service
metadata:
  name: service-simple-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

然后为了测试这个概念,我在下面创建了 Pod:

apiVersion: v1
kind: Pod
metadata:
  name: service-simple-service-pod
  labels:
    app: MyApp
spec:
  containers:
  - name: service-simple-service-pod-container-1
    image: nginx:alpine
    ports:
      - containerPort: 9376

我可以看到为这个 Pod 创建了一个新的端点,到目前为止一切正常,下面是输出:

C:\Users>kubectl describe service/service-simple-service
Name:              service-simple-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=MyApp
Type:              ClusterIP
IP:                10.98.246.70
Port:              <unset>  80/TCP
TargetPort:        9376/TCP
Endpoints:         10.244.0.8:9376
Session Affinity:  None
Events:            <none>

然后为了测试负面概念,我创建了下面的 Pod。

apiVersion: v1
kind: Pod
metadata:
  name: service-simple-service-pod-nouse
  labels:
    app: MyApp
spec:
  containers:
  - name: service-simple-service-pod-nouse-container-1
    image: nginx:alpine
    ports:
      - containerPort: 9378

但令我惊讶的是,这个 Pod 也被选中了:

C:\Users>kubectl describe service/service-simple-service
Name:              service-simple-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=MyApp
Type:              ClusterIP
IP:                10.98.246.70
Port:              <unset>  80/TCP
TargetPort:        9376/TCP
Endpoints:         10.244.0.10:9376,10.244.0.8:9376
Session Affinity:  None
Events:            <none>

我对上面创建的 Service 的理解是,Scheduler 会在端口 9376 上寻找标签为 app: MyApp 和 运行 的任何 Pod,所以我的期望是,因为这个 Pod 运行 在端口 9378 上,因此不会被拾取。所以,我的问题是为什么这个“service-simple-service-pod-nouse”被选中了?

如果有人说我的理解不正确,Service只根据Label选择Pod,那么我的问题是,既然“service-simple-service-pod-nouse”Pod是监听端口9378那么“service-simple-service”服务如何将流量发送到此 Pod?

服务将选择所有标记为该服务的标签 select 的 pods。 service-simple-service 服务将 select 所有标记为 MyApp 的 pods,因为您在服务中告知 select 或 (app: MyApp)。这是 label-select 的常见和预期行为,或者,您可以查看 k8s 官方 doc

apiVersion: v1
kind: Service
metadata:
  name: service-simple-service
spec:
  selector:
    app: MyApp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376

更新

基本上,服务获取请求,然后将流量提供给 pods(这些被标记为服务 select 或),当服务获取 pod 时,它会打开一个该 pod 的端点,当流量到达服务时,它会将这些流量发送到其中一个端点(基本上是去往一个 pod)。容器端口基本上是容器所在的 pod 内的端口 运行.