在同一个 kubernetes 集群上安装两个 traefik ingress controller

Install two traefik ingress controller on same kubernetes Cluster

我有一种情况,我计划在 Kubernetes 集群中使用两个单独的 traefik 入口控制器。

我有几个 URL 我希望只能通过 VPN 访问,还有一些可以 public 访问。

在当前架构中,我有一个 traefik-ingress 控制器和两个独立的 ALB,一个内部的和一个面向互联网的,都指向 traefik。
比方说,我有一个 URL public.example.comprivate.example.compublic.example.com 指向面向 Internet 的 ALB,private.example.com 指向内部 ALB。但是,如果有人知道 public.example.com 的指向并将 private.example.com 指向他的 /etc/hosts 中的相同指向,他将能够访问我的私人网站。

为了避免这种情况,我计划 运行 两个单独的 traefik-ingress-controller,一个将仅服务于私有 URL 和一个 public URL .这可以做到吗?或者有没有其他方法可以避免这种情况

您可以使用集群内的单个 Ingress 控制器来实现此目的,但可以通过创建各种 Ingress Kubernetes 对象来实现。

私人网站:- 考虑入口资源中的 whitelist-source-range 注释。

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#whitelist-source-range

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: 10.0.0.0/24,172.10.0.1
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          serviceName: test
          servicePort: 80

对于 Public 网站:-

https://kubernetes.io/docs/concepts/services-networking/ingress/#the-ingress-resource

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          serviceName: test
          servicePort: 80

多个 Træfik Deployment 可以 运行 在同一个 cluster.For 实例中并发,可以想象一个 Deployment 处理内部流量,另一个 Deployment 处理外部流量。

对于这种情况,建议通过标签对 Ingress 对象进行分类,并相应地为每个 Træfik 部署配置 labelSelector 选项。为了坚持上面的 internal/external 示例,所有用于内部流量的 Ingress 对象都可以接收到 traffic-type: internal 标签,而指定用于外部流量的对象接收到 traffic-type: external 标签。 Træfik 部署上的标签选择器将分别为 traffic-type=internal 和 traffic-type=external

为了部署两个单独的 traefik-ingress 控制器,分别为私有和 public 流量提供服务,我使用了 kubernetes.ingressclass=traefik args。

这是 kubernetes.ingressclass 的文档必须说明的内容:

--kubernetes.ingressclass  Value of kubernetes.io/ingress.class annotation to watch for

我创建了两个部署,kubernetes.ingressclass 具有不同的值。

一个 kubernetes.ingressclass=traefik,位于 public ALB 之后,kubernetes.ingressclass=traefik-internal,位于 private/internal ALB

之后

对于我想私下提供的服务,我在入口对象中使用了以下注释:

annotations:
    kubernetes.io/ingress.class: traefik-internal

和 public

annotations:
  kubernetes.io/ingress.class: traefik

我的deployment.yaml

---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: traefik-internal-ingress-controller
  namespace: kube-system
  labels:
    k8s-app: traefik-internal-ingress-lb
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: traefik-internal-ingress-lb
  template:
    metadata:
      labels:
        k8s-app: traefik-internal-ingress-lb
    spec:
      serviceAccountName: traefik-internal-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: traefik:v1.7
        name: traefik-internal-ingress-lb
        ports:
        - name: http
          containerPort: 80
        - name: admin
          containerPort: 8080
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
        - --accesslog=true
        - --kubernetes.ingressclass=traefik-internal ##this makes it to watch only for ingress objects with annotaion "kubernetes.io/ingress.class: traefik-internal"

希望这对某人有所帮助。