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 code>, 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
3 Réponses :
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.
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
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.
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
.
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