为什么我的 Kubernetes 服务不在我指定的端口上发布?
Why don't my Kubernetes services publish on the port I specify?
在过去的几年里,我一直断断续续地修改 Kubernetes,我不确定这种情况是否一直存在(也许这种行为最近发生了变化),但我似乎无法让服务发布到我想要的端口 - 他们总是在高随机端口 (>30000) 上发布。
例如,我正在 this walkthrough on Ingress 并根据说明创建以下部署和服务对象:
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: hello-world-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- image: "gokul93/hello-world:latest"
imagePullPolicy: Always
name: hello-world-container
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: hello-world-svc
spec:
ports:
- port: 9376
protocol: TCP
targetPort: 8080
selector:
app: hello-world
type: NodePort
据此,我应该有一个侦听端口 8080 的服务,但它是一个高随机端口:
~$ kubectl describe svc hello-world-svc
Name: hello-world-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=hello-world
Type: NodePort
IP: 10.109.24.16
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31669/TCP
Endpoints: 10.40.0.4:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
我还验证了我的 none 个节点正在侦听 8080,但它们正在侦听 31669。
这不是非常理想 - 特别是考虑到 Ingress 部分需要知道正在使用什么 servicePort
(演练在 8080 处引用了它)。
顺便说一句,当我创建 Ingress 控制器时,此行为是相同的 - 它不是像好的负载均衡器那样监听 80 和 443,而是监听高随机端口。
我错过了什么吗?我做错了吗?
马特,
分配随机端口的原因是您正在创建 NodePort 类型的服务。
K8s 文档解释了 NodePort here
根据您的配置,该服务在端口 9376 上公开(后端端口为 8080)。所以 hello-word-svc 应该在:10.109.24.16:9376 可用。基本上可以通过以下方式之一获得此服务:
服务ip/port:- 10.109.24.16:9376
Node ip/port :- [你的计算节点 ip]:31669 <-- 这是因为你的服务类型是 NodePort
您也可以直接查询 pod 以测试 pod 实际上是否公开了服务。
Pod ip/port: 10.40.0.4:8080
由于您的最终目标是使用入口控制器实现服务的外部可达性,"type: ClusterIP" 可能满足您的要求。
在过去的几年里,我一直断断续续地修改 Kubernetes,我不确定这种情况是否一直存在(也许这种行为最近发生了变化),但我似乎无法让服务发布到我想要的端口 - 他们总是在高随机端口 (>30000) 上发布。
例如,我正在 this walkthrough on Ingress 并根据说明创建以下部署和服务对象:
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: hello-world-deployment
spec:
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
- image: "gokul93/hello-world:latest"
imagePullPolicy: Always
name: hello-world-container
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: hello-world-svc
spec:
ports:
- port: 9376
protocol: TCP
targetPort: 8080
selector:
app: hello-world
type: NodePort
据此,我应该有一个侦听端口 8080 的服务,但它是一个高随机端口:
~$ kubectl describe svc hello-world-svc
Name: hello-world-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=hello-world
Type: NodePort
IP: 10.109.24.16
Port: <unset> 8080/TCP
TargetPort: 8080/TCP
NodePort: <unset> 31669/TCP
Endpoints: 10.40.0.4:8080
Session Affinity: None
External Traffic Policy: Cluster
Events: <none>
我还验证了我的 none 个节点正在侦听 8080,但它们正在侦听 31669。
这不是非常理想 - 特别是考虑到 Ingress 部分需要知道正在使用什么 servicePort
(演练在 8080 处引用了它)。
顺便说一句,当我创建 Ingress 控制器时,此行为是相同的 - 它不是像好的负载均衡器那样监听 80 和 443,而是监听高随机端口。
我错过了什么吗?我做错了吗?
马特,
分配随机端口的原因是您正在创建 NodePort 类型的服务。
K8s 文档解释了 NodePort here
根据您的配置,该服务在端口 9376 上公开(后端端口为 8080)。所以 hello-word-svc 应该在:10.109.24.16:9376 可用。基本上可以通过以下方式之一获得此服务:
服务ip/port:- 10.109.24.16:9376
Node ip/port :- [你的计算节点 ip]:31669 <-- 这是因为你的服务类型是 NodePort
您也可以直接查询 pod 以测试 pod 实际上是否公开了服务。
Pod ip/port: 10.40.0.4:8080
由于您的最终目标是使用入口控制器实现服务的外部可达性,"type: ClusterIP" 可能满足您的要求。