【问题标题】:How to define some Kubernetes Ingress routes with specific ports如何定义一些具有特定端口的 Kubernetes Ingress 路由
【发布时间】:2023-03-10 13:22:01
【问题描述】:

我正在尝试为我的 Kubernetes 集群(目前在本地主机上使用 Docker Desktop)创建一些入口规则,但它们不起作用。

我想要做什么

- App #1 : Some database (e.g. mongodb or RavenDb or Postgres, etc).
- App #2 : Some queue (rabbitmq, etc)
- App #3 : Some web site api #1 
- App #4 : Some web site api #2

访问每个应用的路径

- App #1 : <anything>:port 5200
- App #2 : <anything>:port 5300
- App #3 : /account/*:80, /accounts:80
- App #4 : /order/*:80, /orders/*:80

[注意 -> 我还没有包括 ssl/443 端口,因为我还没有处理过,等等]

下面是我为第一个应用程序(不起作用)提供的示例:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: data-ravendb-ingress
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: data-ravendb-service
          servicePort: dashboard

---
apiVersion: v1
kind: Service
metadata:
  name: data-ravendb-service
  labels:
    app: hornet
    tier: backend
    component: data-ravendb
spec:
  ports:
  - name: dashboard
    port: 5200
    targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: data-ravendb-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hornet
        tier: backend
        component: data-ravendb
    spec:
      containers:
      - name: data-ravendb-container
        image: ravendb/ravendb
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
          name: dashboard

如何设置我的入口以允许这 4 个应用程序正确访问后端服务?

【问题讨论】:

    标签: kubernetes kubernetes-ingress


    【解决方案1】:

    目前不完全支持在 Kubernetes Ingress 中路由除 HTTP/HTTPS 协议之外的任何其他流量。您使用的 Traefik 也是 HTTP 反向代理,因此使用该入口控制器很难或不可能做到这一点。

    Kubernetes: Routing non HTTP Request via Ingress to Container

    【讨论】:

    • 哇,真的吗?所以入口只能接受端口 80 和 443不管使用什么入口控制器?
    • 使用 nginx 控制器有一些解决方法,但它们更像是“黑客”而不是生产就绪解决方案
    • 那么这是否意味着我应该停止尝试使用ingress 而是尝试使用loadbalancer 来代替?
    【解决方案2】:

    正如@Jakub 提到的,ingress 仅支持 http/https 端口。

    您可以为您的网站 API 以及 App1 和 App2 创建具有不同后端路径的入口。但如果您需要使用端口公开,请考虑使用 LoadBalancer 服务。

    根据您的第一个应用程序示例,为什么它不起作用,因为您没有在服务 yaml 中指定 selectors。尝试像下面这样更改它,然后它会起作用。

    apiVersion: v1
    kind: Service
    metadata:
      name: data-ravendb-service
      labels:
        app: hornet
        tier: backend
        component: data-ravendb
    spec:
      selector: # Mandatory to find backends
        app: hornet # Should match to pod label
        tier: backend # Should match to pod label
      ports:
      - name: dashboard
        port: 5200
        targetPort: 8080
    

    希望对你有帮助!

    【讨论】:

    • 非常感谢您的回答/帮助。我真的很想通过 PORTS(不是主机或路径)做 我的一些路线,所以看起来 LB 是我现在的方式。是时候了解更多了:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多