Partage de technologie

Politique du réseau k8s

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

  • Isolement de l'espace de noms

Par défaut, tous les pods sont entièrement accessibles. Chaque espace de noms peut être configuré avec des politiques réseau indépendantes pour isoler le trafic entre les pods.

La version 1.7+ sert de politique réseau par défaut en créant une politique réseau qui correspond à tous les pods.

  • La communication entrante entre tous les pods est refusée par défaut.

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny
  5. spec:
  6. podSelector: {}
  7. policyTypes:
  8. - Ingress
  • Une stratégie qui refuse la communication de sortie entre tous les pods par défaut

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny
  5. spec:
  6. podSelector: {}
  7. policyTypes:
  8. - Egress
  • Une politique qui refuse par défaut les communications d'entrée et de sortie entre tous les pods.

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny
  5. spec:
  6. podSelector: {}
  7. policyTypes:
  8. - Ingress
  9. - Egress
  • Une stratégie qui autorise la communication Ingress entre tous les pods par défaut

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: allow-all
  5. spec:
  6. podSelector: {}
  7. ingress:
  8. - {}
  • Une stratégie qui autorise la communication de sortie entre tous les pods par défaut

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: allow-all
  5. spec:
  6. podSelector: {}
  7. egress:
  8. - {}
  • Isolation des dosettes

Contrôlez le trafic entre les pods à l'aide de sélecteurs d'étiquettes, notamment namespaceSelector et podSelector.

  1. 允许 default namespace 中带有 role=frontend 标签的 Pod 访问 default
  2. namespace 中带有 role=db 标签 Pod 的 6379 端口
  3. 允许带有 project=myprojects 标签的 namespace 中所有 Pod 访问 default
  4. namespace 中带有 role=db 标签 Pod 的 6379 端口
  5. apiVersion: networking.k8s.io/v1
  6. kind: NetworkPolicy
  7. metadata:
  8. name: test-network-policy
  9. namespace: default
  10. spec:
  11. podSelector:
  12. matchLabels:
  13. role: db
  14. ingress:
  15. - from:
  16. - namespaceSelector:
  17. matchLabels:
  18. project: myproject
  19. - podSelector:
  20. matchLabels:
  21. role: frontend
  22. ports:
  23. - protocol: tcp
  24. port: 6379
  1. 允许 default namespace 中带有 role=frontend 标签的 Pod 访问 default
  2. namespace 中带有 role=db 标签 Pod 的 6379 端口
  3. 允许带有 project=myprojects 标签的 namespace 中所有 Pod 访问 default
  4. namespace 中带有 role=db 标签 Pod 的 6379 端口
  5. NetworkPolicy
  6. 238
  7. 允许 default namespace 中带有 role=db 标签的 Pod 访问 10.0.0.0/24 网段
  8. 的 TCP 5978 端口
  9. apiVersion: networking.k8s.io/v1
  10. kind: NetworkPolicy
  11. metadata:
  12. name: test-network-policy
  13. namespace: default
  14. spec:
  15. podSelector:
  16. matchLabels:
  17. role: db
  18. policyTypes:
  19. - Ingress
  20. - Egress
  21. ingress:
  22. - from:
  23. - ipBlock:
  24. cidr: 172.17.0.0/16
  25. except:
  26. - 172.17.1.0/24
  27. - namespaceSelector:
  28. matchLabels:
  29. project: myproject
  30. - podSelector:
  31. matchLabels:
  32. role: frontend
  33. ports:
  34. - protocol: TCP
  35. port: 6379
  36. egress:
  37. - to:
  38. - ipBlock:
  39. cidr: 10.0.0.0/24
  40. ports:
  41. - protocol: TCP
  42. port: 5978
  • exemple

Un service nginx a maintenant été configuré. Le port d'accès est 80. L'état par défaut est que tous les pods peuvent accéder à ce service.

  1. $ kubectl get svc
  2. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  3. nginx-deployment NodePort 10.102.52.246 <none> 80:31180/TCP 19d
  4. 启动一个busybox pod来访问nginx-deployment服务
  5. $ kubectl exec -it pod/busybox-test -- sh
  6. / # wget --spider --timeout=1 nginx-deployment
  7. Connecting to nginx-deployment (10.102.52.246:80)
  8. remote file exists
  9. / #

Configurez maintenant la politique réseau pour le service de déploiement nginx afin que le pod ne puisse pas accéder à ce service.

  1. $ cat default-deny.yaml
  2. apiVersion: networking.k8s.io/v1
  3. kind: NetworkPolicy
  4. metadata:
  5. name: default-deny
  6. spec:
  7. podSelector: {}
  8. policyTypes:
  9. - Ingress
  10. $ kubectl create -f default-deny.yaml
  11. networkpolicy.networking.k8s.io/default-deny created
  12. 现在busybox的pod无法访问nginx-deployment服务了
  13. $ kubectl exec -it pod/busybox-test -- sh
  14. / # wget --spider --timeout=1 nginx-deployment
  15. Connecting to nginx-deployment (10.102.52.246:80)
  16. wget: download timed out
  17. / # exit
  18. 查看networkpolicy
  19. $ kubectl get networkpolicy
  20. NAME POD-SELECTOR AGE
  21. default-deny <none> 102s

Créez une autre règle réseau qui exécute l'accès aux pods avec access=true :

  1. 表示所有带有 access=true label 的pods都可以访问nginx-deployment服务
  2. $ cat nginx-policy.yaml
  3. apiVersion: networking.k8s.io/v1
  4. kind: NetworkPolicy
  5. metadata:
  6. name: access-nginx
  7. spec:
  8. podSelector:
  9. matchLabels:
  10. app: nginx
  11. ingress:
  12. - from:
  13. - podSelector:
  14. matchLabels:
  15. access: "true"
  16. 启动一个带有access=true label的busybox服务
  17. $ cat busybox-test.yaml
  18. apiVersion: v1
  19. kind: Pod
  20. metadata:
  21. annotations:
  22. cni.projectcalico.org/containerID: fefc92be6bb04bacdf757a0b4132d72c2133c94dbfa684296cf59772817fc939
  23. cni.projectcalico.org/podIP: 172.16.43.1/32
  24. cni.projectcalico.org/podIPs: 172.16.43.1/32
  25. creationTimestamp: "2024-06-28T08:39:13Z"
  26. labels:
  27. access: "true"
  28. purpose: demonstrate-busybox
  29. name: busybox-test
  30. namespace: default
  31. resourceVersion: "208006"
  32. uid: 2d94690d-4f16-4bb6-a540-4682334170af
  33. spec:
  34. containers:
  35. - command:
  36. - sleep
  37. - "3600"
  38. image: busybox
  39. imagePullPolicy: IfNotPresent
  40. name: busybox
  41. resources:
  42. ... ...
  43. $ kubectl apply -f busybox-test.yaml
  44. 此时看到busybox-test这个pod已经带有access=true的label了
  45. $ kubectl describe pod busybox-test
  46. Name: busybox-test
  47. Namespace: default
  48. Priority: 0
  49. Service Account: default
  50. Node: kevin-pc/192.168.227.129
  51. Start Time: Fri, 28 Jun 2024 16:39:13 +0800
  52. Labels: access=true
  53. 然后通过busybox-test访问nginx服务就可以访问到了
  54. $ kubectl exec -it pod/busybox-test -- sh
  55. / # wget --spider -timeout=1 nginx-deployment
  56. Connecting to nginx-deployment (10.102.52.246:80)
  57. remote file exists
  58. / #
  • supprimer la stratégie de réseau

Après avoir supprimé la stratégie réseau, tous les pods peuvent accéder au service de déploiement nginx par défaut.

  1. $ kubectl get networkpolicy
  2. NAME POD-SELECTOR AGE
  3. access-nginx app=nginx 10m
  4. default-deny <none> 17m
  5. $ kubectl delete network policy access-nginx
  • Exemples de configuration de plusieurs politiques d'accès

  • Refuser l'accès aux services spécifiés

Démarrez d’abord un service nginx et étiquetez ce service

  1. kubectl run web --image=nginx --labels app=web,env=prod --expose --po
  2. rt 80

  1. (没有配置ingress,所以所有的pod都没法访问这个服务)
  2. kind: NetworkPolicy
  3. apiVersion: networking.k8s.io/v1
  4. metadata:
  5. name: web-deny-all
  6. spec:
  7. podSelector:
  8. matchLabels:
  9. app: web
  10. env: prod
  • Autoriser uniquement les pods spécifiés à accéder aux services

  1. kubectl run apiserver --image=nginx --labels app=bookstore,role=api -
  2. -expose --port 80

  1. kind: NetworkPolicy
  2. apiVersion: networking.k8s.io/v1
  3. metadata:
  4. name: api-allow
  5. spec:
  6. podSelector:
  7. matchLabels:
  8. app: bookstore
  9. role: api
  10. ingress:
  11. - from:
  12. - podSelector:
  13. matchLabels:
  14. app: bookstore
  • Désactiver l'accès mutuel entre tous les pods de l'espace de noms

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny
  5. namespace: default
  6. spec:
  7. podSelector: {}
  • Empêcher d'autres espaces de noms d'accéder aux services

  1. kind: NetworkPolicy
  2. apiVersion: networking.k8s.io/v1
  3. metadata:
  4. namespace: default
  5. name: web-deny-other-namespaces
  6. spec:
  7. podSelector:
  8. matchLabels:
  9. ingress:
  10. - from:
  11. - podSelector: {}
  • Autoriser uniquement l'espace de noms spécifié à accéder aux services

  1. kind: NetworkPolicy
  2. apiVersion: networking.k8s.io/v1
  3. metadata:
  4. name: web-allow-prod
  5. spec:
  6. podSelector:
  7. matchLabels:
  8. app: web
  9. ingress:
  10. - from:
  11. - namespaceSelector:
  12. matchLabels:
  13. purpose: production
  • Autoriser l'accès du réseau externe aux services

  1. kubectl run web --image=nginx --labels=app=web --port 80
  2. kubectl expose deployment/web --type=LoadBalancer

  1. kind: NetworkPolicy
  2. apiVersion: networking.k8s.io/v1
  3. metadata:
  4. name: web-allow-external
  5. spec:
  6. podSelector:
  7. matchLabels:
  8. app: web
  9. ingress:
  10. - ports:
  11. - port: 80
  12. from: []