Установите два входных контроллера traefik на одном кластере Kubernets - PullRequest
0 голосов
/ 29 марта 2020

У меня есть ситуация, когда я планирую использовать два отдельных входных контроллера traefik внутри кластера Kubernetes.

У меня есть несколько URL-адресов, к которым я хочу получить доступ только через VPN, и несколько, которые могут быть общедоступный.

В текущей архитектуре у меня есть один контроллер входа в traefik и два отдельных ALB, один внутренний и один intex-101facing, оба указывают на traefik.
Скажем, у меня есть URL public.example.com и private.example.com. public.example.com указывает на целочисленный ALB rnet, а private.example.com указывает на внутренний ALB. Но что, если кто-то узнает указание public.example.com и указывает private.example.com на то же указание в своем /etc/hosts, он сможет получить доступ к моему личному веб-сайту.

Чтобы избежать этого, я планирую запустить два отдельных traefik-ingress-controller, один из которых будет обслуживать только частный URL-адрес и один общедоступный c URL-адрес. Можно ли это сделать? Или есть другой способ избежать этого

Ответы [ 3 ]

3 голосов
/ 29 марта 2020

Этого можно достичь с помощью одного контроллера Ingress внутри кластера, но создав различные Ingress объекты Kubernetes.

Для частного сайта : - рассмотрите аннотацию whitelist-source-range во входном ресурсе.

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#whitelist -источник-диапазон

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

Для Publi c сайт : -

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
0 голосов
/ 28 апреля 2020

Чтобы развернуть два отдельных контроллера входа в трафик, для обслуживания private и publi c traffi c по отдельности, я использовал kubernetes.ingressclass=traefik args.

Это то, что документация должна сказать для kubernetes.ingressclass :

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

Я создал два развертывания с отдельным значением для kubernetes.ingressclass.

Одно с kubernetes.ingressclass=traefik, которое находилось за публикацией c ALB и kubernetes.ingressclass=traefik-internal, что находился за частным / внутренним ALB

Для служб, которые я хочу обслуживать в частном порядке, я использую следующие аннотации во входных объектах:

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

и для публикации c

annotations:
  kubernetes.io/ingress.class: traefik

Мой deploy.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"

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 29 марта 2020

Несколько развертываний Træfik могут выполняться одновременно в одном и том же кластере. Например, возможно иметь одну сделку по развертыванию с внутренней и другую с внешним трафиком c.

Для таких случаев рекомендуется классифицировать объекты Ingress по метке и соответственно настраивать опцию labelSelector для каждого развертывания Træfik. Чтобы придерживаться внутреннего / внешнего примера выше, все объекты Ingress, предназначенные для внутреннего трафика c, могут получить метку traffic-type: internal, в то время как объекты, предназначенные для внешнего трафика c, получают метку traffic-type: external. Селекторы меток в Træfik Deployments будут тогда traffic-type=interna l и traffic-type=external соответственно.

...