在自定义界面上进入自托管 Kubernetes

Ingress on self-hosted Kubernetes on custom interface

我想在我的自托管 Kubernetes (microk8s) 上部署一个 ngingx-ingress 控制器,该控制器可配置为侦听一个或多个接口(外部 IP)。

甚至不确定这是否容易实现,我应该切换到外部解决方案,例如 HAProxy 或 nginx。

要求的行为:

192.168.0.1-H"domain.com":443/frontend -> 192.168.0.1 (eth0) -> ingress -> service-frontend
192.168.0.1-H"domain.com":443/backend -> 192.168.0.1 (eth0) -> ingress -> service-backend
88.88.88.88-H"domain.com":443/frontend -> 88.88.88.88 (eth1) -> ? -> [403 or timeout]
88.88.88.88-H"domain.com":443/backend -> 88.88.88.88 (eth1) -> ? -> [403 or timeout]

稍后应该可以打开 eth1 接口,以便该接口上的请求与 eth0 上的请求行为相同。

我希望能够部署多个服务实例以实现负载平衡。我想将配置保留在我的命名空间中(如果可能的话),这样我就可以随时删除并立即应用所有内容。

我正在使用本指南作为参考:https://kubernetes.github.io/ingress-nginx/deploy/baremetal/

我能够使用 minikube 进行一些操作,但显然无法公开任何外部 IP,而且性能非常糟糕。为此,我只是配置了一个“kind: Ingress”,仅此而已。

到目前为止,microk8s 默认的入口控制器似乎监听所有接口,我只能在它自己的命名空间中配置它。自己定义ingress好像没有什么效果

I would like to deploy an ngingx-ingress controller on my self-hosted Kubernetes (microk8s) that is configurable to listen on one or more interfaces (external IPs).

对于上述场景,您必须部署 Nginx 入口的多个入口控制器,并在其中保留不同的 class 名称

官方文档:https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/

所以在这种情况下,您必须使用 Loadbalancer IP 创建 Kubernetes 服务,每个服务都将指向各自的部署,class 将在入口中使用对象。

如果您希望通过单个入口控制器使用多个域,您可以通过将主机提及到入口来轻松实现。

两个域的示例:

  1. bar.foo.dev
  2. foo.bar.dev

YAML 示例

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: frontdoor-bar
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/use-regex: "true"
spec:
  tls:
    - hosts:
        - bar.foo.dev
      secretName: tls-secret-bar
  rules:
    - host: bar.foo.dev
      http:
        paths:
          - backend:
              serviceName: barfoo
              servicePort: 80
            path: /(.*)
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: frontdoor-foo
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - foo.bar.dev
      secretName: tls-secret-foo
  rules:
    - host: foo.bar.dev
      http:
        paths:
          - backend:
              serviceName: foobar
              servicePort: 9000
            path: /(.*)

一个潜在的修复比预期的要简单得多,不需要弄乱 MetalLB 或其他任何东西。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
  annotations:
    kubernetes.io/ingress.class: "public"
    nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.0.0/24
...

这并没有解决跨多个接口拆分 Ingress 的问题,但它确实解决了限制 public 访问的问题。 默认情况下,裸机入口将监听所有接口,这可能是一个安全问题。

此解决方案无需在 Microk8s 上启用入口即可工作:

kind: Ingress
metadata:
  annotations:
    ingress.kubernetes.io/service-upstream: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: "/"
  name: ingress-resource
  namespace: namespace-name
spec:
  rules:
  - http:
      paths:
      - backend:
          service:
            name: service-name
            port:
              number: service-port
        path: /namespace-name/service-name(/|$)(.*)
        pathType: Prefix

  • kubectl get svc -n ingress-nginx

  • 现在获取 CLUSTER-IP 或 EXTERNAL-IP 并且:

    卷曲ip/namespace-here/service-here