服务错误地选择了侦听某个不同端口的 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 内的端口 运行.
我尝试了 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 内的端口 运行.