1
votes

Installez deux contrôleurs d'entrée Traefik sur le même cluster Kubernetes

J'ai une situation dans laquelle je prévois d'utiliser deux contrôleurs d'entrée traefik séparés dans le cluster Kubernetes.

J'ai quelques URL que je souhaite rendre accessibles via VPN uniquement, et quelques-unes qui peuvent être accessibles publiquement.

Dans l'architecture actuelle, j'ai un contrôleur traefik-ingress et deux ALB séparés, un interne et un connecté à Internet, tous deux pointant vers traefik.
Disons que j'ai une URL public.example.com et private.example.com . public.example.com pointe vers ALB accessible sur Internet et private.example.com pointe vers ALB interne. Mais que se passe-t-il si quelqu'un apprend à connaître le pointage de public.example.com et pointe private.example.com vers le même pointage dans son / etc / hosts , il pourra accéder à mon site privé.

Pour éviter cela, je prévois d'exécuter deux traefik-ingress-controller séparés, l'un qui ne servira qu'une URL privée et une URL publique. Cela peut-il être fait? Ou y a-t-il un autre moyen d'éviter cela


0 commentaires

3 Réponses :


4
votes

Vous pouvez y parvenir avec un seul contrôleur Ingress à l'intérieur du cluster, mais en créant divers objets Kubernetes Ingress .

Pour le site privé : - considérez l'annotation whitelist-source-range dans la ressource d'entrée.

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/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          serviceName: test
          servicePort: 80

Pour le site 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/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


1 commentaires

Cette réponse est quelque peu correcte pour certaines situations, mais elle ne résout pas mon problème. Parce que dans le cas d'ALB, qu'il soit interne ou face à Internet, les requêtes proviennent toutes d'IP privée uniquement (d'ALB). Et la liste blanche d'adresses IP privées ne fonctionne pas. Bien que merci pour votre réponse, j'ai appris quelque chose de nouveau.



0
votes

Plusieurs déploiements Træfik peuvent s'exécuter simultanément dans le même cluster. Par exemple, il est concevable d'avoir un déploiement avec le trafic interne et un autre avec le trafic externe.

Dans de tels cas, il est conseillé de classer les objets Ingress via une étiquette et de configurer l'option labelSelector pour chaque déploiement Træfik en conséquence. Pour rester fidèle à l'exemple interne / externe ci-dessus, tous les objets Ingress destinés au trafic interne peuvent recevoir une étiquette traffic-type: internal tandis que les objets désignés pour le trafic externe reçoivent un traffic-type: external < / code> étiquette. Les sélecteurs de libellés sur les déploiements Træfik seraient alors respectivement traffic-type = interna l et traffic-type = external .


0 commentaires

1
votes

Pour déployer deux contrôleurs traefik-ingress séparés, pour servir le trafic privé et public séparément, j'ai utilisé kubernetes.ingressclass = traefik args.

Voici ce que la documentation dit pour kubernetes.ingressclass :

---
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"

J'ai créé deux déploiements, ayant une valeur distincte pour kubernetes.ingressclass.

Un avec kubernetes.ingressclass = traefik , qui était derrière un ALB public et kubernetes.ingressclass = traefik-internal , qui était derrière un ALB privé / interne

Pour les services que je souhaite diffuser en privé, j'utilise les annotations suivantes dans les objets d'entrée:

annotations:
  kubernetes.io/ingress.class: traefik

et pour le public

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


0 commentaires