Kubernetes(K8s) NetworkPolicy(网络策略)

Kubernetes(简称K8S) 是Google开源的分布式的容器管理平台,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。本文主要介绍Kubernetes(K8s) NetworkPolicy(网络策略)。

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
推荐阅读
cjavapy编程之路首页