如何使用k8s入口服务通过一个端口服务多个解决方案webui

How to service multiple solution webui through one port using k8s ingress service

我需要基于 URL 使用一个使用 k8s ingress 的开放端口为 gitlab、nexus 和 jupyterhub 提供服务。

如果在create ingress的时候把路径写成“/”,是可以正常使用的,但是如果这样写“/nexus”,在重定向的过程中就会出现问题。

你们有没有人解决过同样的问题?请帮忙

我的ingress.yaml如下

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  creationTimestamp: "2022-04-06T05:56:40Z"
  generation: 7
  name: nexus-ing
  namespace: nexus
  resourceVersion: "119075924"
  selfLink: /apis/extensions/v1beta1/namespaces/nexus/ingresses/nexus-ing
  uid: 4b4f97e4-225e-4faa-aba3-6af73f69c21d
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          serviceName: nexus-service
          servicePort: 8081
        path: /nexus(/|$)(.*)
        pathType: ImplementationSpecific
status:
  loadBalancer:
    ingress:
    - ip: 172.30.1.87

这是nexus本身的问题。您的入口按预期工作,您无法从这方面做更多事情。

这里的问题是 nexus 网页,即 index.html,以这样一种方式请求资源,它正在寻找错误的地方。您可以通过打开网络选项卡并检查缺少静态信息的请求 URL 来查看。

为了明白我的意思,让我们检查下面的 HTML 个图片标签。

<img id="1" src="./statics/some-image.svg" alt="some image" />

<img id="2" src="/statics/some-image.svg" alt="some image" />

您可以看到第一个正在使用相对路径,并且可以与您的配置一起使用,因为请求 URL 将相对于浏览器中的位置,然后 nexus 部分被入口控制器。

然而,第二个使用的是绝对路径,所以它在请求中不会有连接部分URL并且入口控制器将无法将其路由到正确的服务。

这是剥离路径前缀时的常见问题。只有在正确配置剥离前缀时所服务的应用程序时,它才能完全工作。

在你的情况下,这意味着检查服务的文档,如果你有办法影响它。

基于主机名而不是路径进行路由可能更直接。即 nexus.myhost.com。为此,您需要一个域并将相应的 A 记录指向您的入口服务 IP/使用通配符记录。

我自己解决这个问题

  1. 我编辑了我的电脑主机文件
172.30.1.87     nexus.k8s.io
172.30.1.87     gitlab.k8s.io
  1. 我编辑了同一个服务命​​名空间中的每个 Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  namespace: nexus
spec:
  ingressClassName: nginx
  rules:
  - host: nexus.k8s.io
    http:
      paths:
      - backend:
          serviceName: nexus-service
          servicePort: 8081
        path: /
status:
  loadBalancer:
    ingress:
    - ip: 172.30.1.87
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: gitlab-ingress
  namespace: gitlab
spec:
  ingressClassName: nginx
  rules:
  - host: gitlab.k8s.io
    http:
      paths:
      - backend:
          serviceName: gitlab-webservice
          servicePort: 8181
        path: /
status:
  loadBalancer:
    ingress:
    - ip: 172.30.1.87
  1. 连接测试 入口主机名 + 入口控制器节点端口