J'essaie de mettre en œuvre une stratégie réseau dans mon cluster kubernetes pour isoler mes pods dans un espace de noms mais leur permettre toujours d'accéder à Internet depuis que j'utilise Azure MFA pour l'authentification.
C'est ce que j'ai essayé mais je n'arrive pas à le faire fonctionner. Ingress fonctionne comme prévu mais ces règles bloquent toutes les sorties.
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: grafana-policy namespace: default spec: podSelector: matchLabels: app: grafana ingress: - from: - podSelector: matchLabels: app: nginx-ingress
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress
Quelqu'un qui peut me dire comment je fais fonctionner la configuration ci-dessus pour que j'autorise également le trafic Internet mais bloque le trafic vers d'autres POD? p>
3 Réponses :
Pouvez-vous essayer comme ça?
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress,Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0
Cela devrait permettre la sortie vers toutes les destinations. Mais si la destination est un pod, elle doit être bloquée par les règles d'entrée manquantes de la même NetworkPolicy.
J'ai déjà essayé quelque chose comme ça, de toute façon je viens d'ajouter votre NetworkPolicy et mon pod est capable de parler avec Azure mais le trafic de pod à pod est toujours autorisé. Je teste en apportant une console au pod et en faisant curl vers un autre pod dans le même espace de noms.
Kubernetes autorisera tout le trafic sauf s'il existe une politique réseau. Si une stratégie réseau est définie, elle autorisera uniquement le trafic défini par la stratégie réseau et refusera tout le reste.
Par défaut, les pods ne sont pas isolés; ils acceptent le trafic de n'importe quelle source.
Les pods deviennent isolés grâce à une NetworkPolicy qui les sélectionne. Une fois qu'il y a un NetworkPolicy dans un espace de noms sélectionnant un pod particulier, ce pod rejettera toutes les connexions qui ne sont autorisées par aucun NetworkPolicy. (Les autres pods de l'espace de noms qui ne sont sélectionnés par aucun NetworkPolicy continueront d'accepter tout le trafic.)
Vous devrez donc également spécifier les règles de sortie pour que cela fonctionne comme vous le souhaitez :)
Essayez d'ajouter une politique de refus de tout réseau par défaut sur l'espace de noms, puis d'ajouter une politique d'autorisation Internet après.
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-internet-only spec: podSelector: {} policyTypes: - Egress egress: - to: - ipBlock: cidr: 0.0.0.0/0 except: - 10.0.0.0/8 - 192.168.0.0/16 - 172.16.0.0/20
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: default-deny-all spec: podSelector: {} policyTypes: - Ingress - Egress
Cela bloquera tout le trafic à l'exception d'Internet sortant. Dans la stratégie Autoriser uniquement Internet, il existe une exception pour toutes les adresses IP privées, ce qui empêchera la communication de pod à pod. Vous devrez également autoriser Egress to Core DNS à partir de kube-system si vous avez besoin de recherches DNS, car la politique default-deny-all bloquera les requêtes DNS.
Cela ne fonctionne pas pour moi: (lorsque j'ajoute cela, mes PODs sont toujours capables de communiquer mais ils ne peuvent pas accéder à Internet.
Je pense que 172.16.0.0/20
devrait être 172.16.0.0/12
selon en.wikipedia.org/wiki/Private_network#Private_IPv4_addresses