Compartir tecnología

Política de red de K8

2024-07-12

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

  • Aislamiento del espacio de nombres

De forma predeterminada, todos los Pods son totalmente accesibles. Cada espacio de nombres se puede configurar con políticas de red independientes para aislar el tráfico entre Pods.

v1.7+ sirve como política de red predeterminada al crear una política de red que coincide con todos los Pods

  • La comunicación de ingreso entre todos los Pods está denegada de forma predeterminada.

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny
  5. spec:
  6. podSelector: {}
  7. policyTypes:
  8. - Ingress
  • Una política que deniega la comunicación de salida entre todos los Pods de forma predeterminada.

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny
  5. spec:
  6. podSelector: {}
  7. policyTypes:
  8. - Egress
  • Una política que deniega la comunicación de entrada y salida entre todos los Pods de forma predeterminada.

  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
  • Una política que permite la comunicación de Ingress entre todos los Pods de forma predeterminada.

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: allow-all
  5. spec:
  6. podSelector: {}
  7. ingress:
  8. - {}
  • Una política que permite la comunicación de salida entre todos los Pods de forma predeterminada.

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: allow-all
  5. spec:
  6. podSelector: {}
  7. egress:
  8. - {}
  • Aislamiento de cápsulas

Controle el tráfico entre Pods mediante el uso de selectores de etiquetas, incluidos namespaceSelector y 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
  • ejemplo

Ahora se ha configurado un servicio nginx. El puerto de acceso es 80. El estado predeterminado es que todos los pods pueden acceder a este servicio.

  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. / #

Ahora configure la política de red para el servicio de implementación nginx para que el pod no pueda acceder a este servicio.

  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

Cree otra política de red que ejecute el acceso al Pod con 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. / #
  • eliminar política de red

Después de eliminar la política de red, todos los pods pueden acceder al servicio de implementación de nginx de forma predeterminada.

  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
  • Ejemplos de configuración de varias políticas de acceso

  • Denegar el acceso a servicios específicos

Primero inicie un servicio nginx y etiquete este servicio

  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
  • Permitir que solo Pods específicos accedan a los servicios

  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
  • Deshabilite el acceso mutuo entre todos los Pods en el espacio de nombres

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: default-deny
  5. namespace: default
  6. spec:
  7. podSelector: {}
  • Evitar que otros espacios de nombres accedan a los servicios

  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: {}
  • Permitir solo el espacio de nombres especificado para acceder a los servicios

  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
  • Permitir el acceso de la red externa a los servicios

  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: []