1、Kubernetes(K8s) 网络策略
网络策略(NetworkPolicy)定义了同一名称空间中的Pod如何相互通信以及网络端点。它需要在API服务器的运行时配置中启用extensions/v1beta1/networkpolicies
。它的资源使用标签来选择Pod,并定义规则来允许访问命名空间中定义的特定Pod的流量。
2、组网策略
通常情况下,需要配置Namespace隔离策略。一般负载均衡器需要使用这种组网策略。
kind: Namespace apiVersion: v1 metadata: annotations: net.beta.kubernetes.io/network-policy: | { "ingress": { "isolation": "DefaultDeny" } }
$ kubectl annotate ns <namespace> "net.beta.kubernetes.io/network-policy = {\"ingress\": {\"isolation\": \"DefaultDeny\"}}"
创建了Namespace命名空间之后,就需要通过Yaml文件创建网络策略,
例如,
kind: NetworkPolicy apiVersion: extensions/v1beta1 metadata: name: allow-frontend namespace: myns spec: podSelector: matchLabels: role: backend ingress: - from: - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 6379
3、策略规则
.spec.PodSelector | Pod选择器,基于标签选择与Network Policy处于同一namespace下的pod, 如果pod被选中,则对其应用Network Policy中定义的规则。此为可选字段, 当没有此字段时,表示选中所有Pod。 |
.spec.PolicyTypes | Network Policy定义的规则可以分成两种, 一种是入Pod的Ingress规则, 一种是出Pod的Egress规则。 本字段可以看作是一个开关, 如果其中包含Ingress, 则Ingress部分定义的规则生效, 如果是Egress则Egress部分定义的规则生效, 如果都包含则全部生效。当然此字段也可选, 如果没有指定的话,则默认Ingress生效, 如果Egress部分有定义的话,Egress才生效。 |
.spec.ingress与.spec.egress | ingress与egress可以包含多条规则。 当包含多条时,条目之间的逻辑关系是“或”, 只要匹配其中一条就可以。 .spec.ingress[].from也是数组, 数组成员对访问Pod的外部source进行描述, 符合条件的source才可以访问Pod。 |
1)默认禁止所有入pod流量(Default deny all ingress traffic)
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress
2)默认允许所有入pod流量(Default allow all ingress traffic)
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all spec: podSelector: {} ingress: - {}
3)默认禁止所有出pod流量(Default deny all egress traffic)
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Egress
4)默认允许所有出pod流量(Default allow all egress traffic)
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-all spec: podSelector: {} egress: - {} policyTypes: - Egress
5)默认禁止所有出入pod流量(Default deny all ingress and all egress traffic)
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress - Egress