【kubernetes/k8s概念】k8s 网络策略

清疚 2022-04-02 07:28 506阅读 0赞
  1. 如果您想在 IP 地址或端口级别(OSI 3 4 层)控制流量,那么您可以考虑将 Kubernetes NetworkPolicies 用于集群中的特定应用程序。
  1. 默认 Pod 是未隔离的,它们可以从任何的源接收请求。Pod 的使用网络策略后,Pod 就会变成隔离的。 一旦 Namespace 中配置的网络策略能够选择一个特定的 Pod,这个 Pod 将拒绝任何该网络策略不允许的连接。(Namespace 中其它未被网络策略选中的 Pod 将继续接收所有流量)
  2. 默认情况下,每个Pod之间是可以相互访问的。但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制
  1. Pod 可以与之通信的实体通过以下 3 个标识符的组合来标识:
  • 允许的其他 pod(例外:pod 不能阻止对自身的访问)
  • 允许的命名空间
  • IP 块(例外:始终允许进出 Pod 运行的节点的流量,无论 Pod 或节点的 IP 地址如何)

    在定义基于 pod 或命名空间的 NetworkPolicy 时,您可以使用选择器来指定允许哪些流量进出与选择器匹配的 Pod。

    同时,当创建基于 IP 的 NetworkPolicies 时,我们定义基于 IP 块(CIDR 范围)的策略。

前提

  1. 需要有一个支持网络策略的 Kubernetes 集群。支持 NetworkPolicy 的网络如下:
  • Calico
  • Romana
  • Weave 网络

网络策略资源对象定义

  1. apiVersion: networking.k8s.io/v1
  2. kind: NetworkPolicy
  3. metadata:
  4. name: test-network-policy
  5. namespace: default
  6. spec:
  7. podSelector:
  8. matchLabels:
  9. role: db
  10. policyTypes:
  11. - Ingress
  12. - Egress
  13. ingress:
  14. - from:
  15. - ipBlock:
  16. cidr: 172.17.0.0/16
  17. except:
  18. - 172.17.1.0/24
  19. - namespaceSelector:
  20. matchLabels:
  21. project: myproject
  22. - podSelector:
  23. matchLabels:
  24. role: frontend
  25. ports:
  26. - protocol: TCP
  27. port: 6379
  28. egress:
  29. - to:
  30. - ipBlock:
  31. cidr: 10.0.0.0/24
  32. ports:
  33. - protocol: TCP
  34. port: 5978
  • podSelector: 每个 NetworkPolicy 都包含一个 podSelector,用于选择策略适用的 pod 分组。 示例策略选择标签为“role=db”的 pod。 空的 podSelector 选择命名空间中的所有 pod。
  • policyTypes: 每个 NetworkPolicy 都包含一个 policyTypes 列表,其中可能包含 Ingress、Egress 或两者。 policyTypes 字段指示给定的策略是否适用于到选定 Pod 的入口流量、来自选定 Pod 的出口流量,或两者。 如果 NetworkPolicy 上未指定任何策略类型,则默认情况下将始终设置 Ingress,如果 NetworkPolicy 有任何出口规则,则将设置 Egress。
  • ingress: 每个 NetworkPolicy 可能包含一个允许的入口规则列表。 每个规则都允许匹配 from 和 ports 部分的流量。 示例策略包含一条规则,该规则匹配来自三个源之一的单个端口上的流量,第一个通过 ipBlock 指定,第二个通过命名空间选择器指定,第三个通过 podSelector 指定。
  • egress: 每个 NetworkPolicy 可能包含一个允许的出口规则列表。 每个规则都允许与 to 和 ports 部分匹配的流量。 示例策略包含单个规则,该规则将单个端口上的流量匹配到 10.0.0.0/24 中的任何目的地。

1. 默认策略

  1. 默认情况下,如果命名空间中不存在任何策略,则允许进出该命名空间中的 Pod 的所有入口和出口流量。 以下示例允许您更改该命名空间中的默认行为。

1.1 默认拒绝所有入口流量

  1. 您可以通过创建一个选择所有 Pod 但不允许任何进入这些 Pod 的流量的 NetworkPolicy 来为命名空间创建“默认”隔离策略。
  2. ---
  3. apiVersion: networking.k8s.io/v1
  4. kind: NetworkPolicy
  5. metadata:
  6. name: default-deny-ingress
  7. spec:
  8. podSelector: {}
  9. policyTypes:
  10. - Ingress
  11. 这确保即使是未被任何其他 NetworkPolicy 选择的 pod 仍将被隔离。 此策略不会更改默认的出口隔离行为。

1.2 默认允许所有入口流量

  1. 如果您希望允许所有流量流向命名空间中的所有 pod(即使添加的策略导致某些 pod 被视为“隔离”),您可以创建一个策略,明确允许该命名空间中的所有流量。
  2. ---
  3. apiVersion: networking.k8s.io/v1
  4. kind: NetworkPolicy
  5. metadata:
  6. name: allow-all-ingress
  7. spec:
  8. podSelector: {}
  9. ingress:
  10. - {}
  11. policyTypes:
  12. - Ingress

测试例子

1. 创建nginx deployment并将服务暴露

kubectl run nginx —image=nginx —replicas=2

kubectl expose deployment nginx —port=80

2. 测试服务能够被其它的 pod 访问

  1. nginx80
  2. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3pob25nbGluemhhbmc_size_16_color_FFFFFF_t_70][]

3. 添加networkpolicy限制访问 nginx 服务

  1. kubectl apply -f
  2. 拥有标签 access: true pod 可以访问
  3. kind: NetworkPolicy
  4. apiVersion: networking.k8s.io/v1
  5. metadata:
  6. name: access-nginx
  7. spec:
  8. podSelector:
  9. matchLabels:
  10. run: nginx
  11. ingress:
  12. - from:
  13. - podSelector:
  14. matchLabels:
  15. access: "true"

4. 当访问标签没有定义时测试访问服务

  1. [root@httpserver-7777-845f5fd9c8-7tpw6 /]# curl nginx:80
  2. curl: (7) Failed connect to nginx:80; Connection timed out

参考:

https://kubernetes.io/docs/concepts/services-networking/network-policies/

发表评论

表情:
评论列表 (有 0 条评论,506人围观)

还没有评论,来说两句吧...

相关阅读

    相关 k8s基本概念

    是什么? 基于容器技术的分布式架构,支持自动化部署,大规模可伸缩,应用容器化管理。复制多个容器(集装箱docker),集群。 做什么? 负载均衡,容器自动化复制和

    相关 k8s概念

    k8s中大部分概念如node/pod等都可以看做资源对象,k8s其实是一个高度自动化的资源控制系统,通过跟踪比对etcd里的资源期望状态和当前环境里的实际资源状态差异来实现自动