繁体   English   中英

在同一个 kubernetes 集群上安装两个 traefik 入口控制器

[英]Install two traefik ingress controller on same kubernetes Cluster

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

我有一些 URL,我只想通过 VPN 访问,而很少可以公开访问。

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

为了避免这种情况,我计划运行两个单独的 traefik-ingress-controller,一个只提供私有 URL 和一个公共 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

对于公共站点:-

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

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

这是文档对kubernetes.ingressclass

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

我创建了两个部署,分别为kubernetes.ingressclass值。

一个带有kubernetes.ingressclass=traefik ,它在公共 ALB 后面和kubernetes.ingressclass=traefik-internal ,它在私有/内部 ALB 后面

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

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

并为公众

annotations:
  kubernetes.io/ingress.class: traefik

我的部署.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"

希望这可以帮助某人。

多个 Træfik 部署可以在同一个集群中同时运行。例如,可以想象让一个部署处理内部流量,另一个部署处理外部流量。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM