Kubernetes服务未映射正确的端口

时间:2019-04-03 15:14:03

标签: azure kubernetes port kubernetes-service

我想在Azure Kubernetes群集上公开MQTT服务器的默认端口(1883)和WS端口(9001)。

无论如何,这是我当前编写的部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mqtt-server
spec: 
  replicas: 1
  selector: 
    matchLabels: 
      app: mqtt-server
  template: 
    metadata: 
      labels: 
        app: mqtt-server
        type: backend 
    spec: 
      containers: 
        - name: mqtt-server
          image: eclipse-mosquitto:1.5.4
          resources: 
            requests:
              cpu: 250m
              memory: 256Mi
          ports:
            - name: mqtt-dflt-port
              containerPort: 1883
            - name: mqtt-ws-port
              containerPort: 9001
---
apiVersion: v1
kind: Service
metadata:
  name: mqtt-server-service
spec:
  selector:
    app: mqtt-server
  type: LoadBalancer
  ports:
  - name: mqtt-dflt-port
    protocol: TCP
    port: 1883
    targetPort: 1883
  - name: mqtt-ws-port
    protocol: TCP
    port: 1884
    targetPort: 9001

当我部署它时,一切都很好,但是MQTT代理无法访问,并且我的服务描述如下:

mqtt-server-service   LoadBalancer   10.0.163.167   51.143.170.64   1883:32384/TCP,1884:31326/TCP   21m

为什么1883/9001端口未按预期转发?

2 个答案:

答案 0 :(得分:2)

首先,请确保您从以下位置连接到服务的群集IP: 集群,而不是从外部。 不要打扰对服务IP进行查询,以判断该服务是否可访问 (请记住,服务的群集IP是虚拟IP,对其执行ping操作将永远无法进行)。 如果您已经定义了准备情况调查,请确保其成功;否则

pod将不包含在服务中。 要确认广告连播是服务的一部分,请检查相应的End- 用kubectl指向对象获取端点。 如果您尝试通过FQDN或FQDN的一部分访问该服务(例如, ple,myservice.mynamespace.svc.cluster.local或myservice.mynamespace)和 它不起作用,请查看是否可以使用其群集IP(而不是FQDN)访问它。 检查您是否连接到服务公开的端口,而不是 目标端口。 尝试直接连接到Pod IP,以确认您的Pod正在接受连接。 正确端口上的位置。 如果您甚至无法通过广告连播的IP访问您的应用,请确保您的应用没有 仅绑定到本地主机。

答案 1 :(得分:1)

我没有发现任何错误,您请求的端口已转发到。并且服务在节点上创建了临时端口以使流量通过(它总是这样做)。服务有端点,一切正常。

仅仅提供更多的上下文,它总是这样做,因为它需要将流量路由到某个端口,但是由于可能被占用,因此它不能依赖于此确切的端口,因此它使用30.000范围内的随机端口(默认情况下) )。

https://kubernetes.io/docs/concepts/services-networking/service/#nodeport

如果必须指定已知的静态端口分配,则可以在服务的端口定义中添加nodePort: some-number。默认情况下,节点端口在30000-32767中分配。