为什么我的 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" 可能满足您的要求。