【问题标题】:How to route kubernetes nginx-ingress to dashboard in another namespace如何将 kubernetes nginx-ingress 路由到另一个命名空间中的仪表板
【发布时间】:2021-04-27 15:23:36
【问题描述】:

我正在试用 kubernetes,我已经在默认命名空间中部署了我的 Nginx,我正在尝试创建一个虚拟服务器来路由仪表板。

nginx:默认命名空间 仪表板:kubernetes-dashboard 命名空间

但是,当我尝试创建虚拟服务器时,它会警告我 virtualserverroute 不存在或无效?据我了解,如果我想路由到不同的命名空间,我可以通过将命名空间放在服务前面来实现。

nginx-ingress-dashboard.yaml

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: kubernetes-dashboard
spec:
  host: k8.test.com
  tls:
    secret: nginx-tls-secret
    # basedOn: scheme
    redirect:
      enable: true
      code: 301
  upstreams:
  - name: kubernetes-dashboard
    service: kubernetes-dashboard
    port: 8443
  routes:
  - path: /
    route: kubernetes-dashboard/kubernetes-dashboard

kubernetes 仪表盘

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard

任何提示我做错了什么?提前致谢。

192.168.254.9 - - [27/Apr/2021:07:14:43 +0000] "GET /api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ HTTP/2.0" 400 48 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-"2021/04/27 07:14:43 [error] 137#137: *106 readv() failed (104: Connection reset by peer) while reading upstream, client: 192.168.254.9, server: k8.test.com, request: "GET /api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ HTTP/2.0", upstream: "http://192.168.253.130:8443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/", host: "k8.test.com"
192.168.254.9 - - [27/Apr/2021:07:14:43 +0000] "GET /api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ HTTP/2.0" 400 48 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36" "-" 2021/04/27 07:14:43 [error] 137#137: *106 readv() failed (104: Connection reset by peer) while reading upstream, client: 192.168.254.9, server: k8.test.com, request: "GET /api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/ HTTP/2.0", upstream: "http://192.168.253.130:8443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/", host: "k8.test.com"

secret.yaml

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
type: Opaque

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-csrf
  namespace: kubernetes-dashboard
type: Opaque
data:
  csrf: ""

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-key-holder
  namespace: kubernetes-dashboard
type: Opaque

【问题讨论】:

    标签: kubernetes nginx-ingress


    【解决方案1】:

    您需要使用action.pass,而不是定义路由,因为您想将请求直接重定向到服务。

    此外,我对VirtualServer 资源没有太多经验,但Ingress 资源通常应该位于您要提供的服务的同一个命名空间中。即使它们位于不同的命名空间中,入口控制器也会将它们拾取。 (这意味着 tls 机密需要在该命名空间中)

    所以,我会将action.passVirtualServer 放在您要服务的资源的同一个命名空间中,如下所示:

    apiVersion: k8s.nginx.org/v1
    kind: VirtualServer
    metadata:
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      host: k8.test.com
      tls:
        secret: nginx-tls-secret
        # basedOn: scheme
        redirect:
          enable: true
          code: 301
      upstreams:
      - name: kubernetes-dashboard
        service: kubernetes-dashboard
        port: 443
      routes:
      - path: /
        action:
          pass: kubernetes-dashboard
    

    如果您使用路由,则需要使用该名称定义 VirtualServerRoute,如文档中所述 (https://docs.nginx.com/nginx-ingress-controller/configuration/virtualserver-and-virtualserverroute-resources/#virtualserverroute-specification)

    【讨论】:

    • 嗯,不太确定我是否理解正确。“入口资源通常应位于您要服务的服务的同一命名空间中”.. 如果我只想要 1 个入口控制器服务对于所有命名空间,这将起作用吗?
    • 根据我的经验,它有效。我们像那样使用它,但是使用 Ingress 定义,而不是新的 VirtualServer 定义。现在可能会有所不同,也许正确的方法是在 Controller 的同一命名空间中声明 VirtualServer,然后在其他命名空间上定义 VirtualServerRoute,以便您可以像在示例中那样引用它们
    • 我尝试了你的建议,它适用于我的测试应用程序,但是当我将它用于 k8 仪表板时,它提示我 502 bad gateway。 :(
    • 抱歉,我复制粘贴了您的定义,但现在我注意到您使用了错误的端口。 8443是服务的targetPort,需要用到端口。每个端口将流量重定向到关联的 targetPort。我已经确定了答案,请尝试在上游使用端口 443!
    • 感谢您的帮助和发现端口,我的错。但奇怪的是它现在给了我错误 404。我在帖子中添加了来自 pod 的日志。
    猜你喜欢
    • 2018-05-24
    • 2021-12-25
    • 2021-02-10
    • 2018-11-26
    • 2018-08-05
    • 2014-10-24
    • 1970-01-01
    • 2020-01-08
    • 2019-02-18
    相关资源
    最近更新 更多