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