带你玩转kubernetes-k8s(第47篇:深入分析k8s网络原理[在K8s中使用网络插件)

释放双眼,带上耳机,听听看~!

Kubernetes目前支持两种网络插件的实现。
◎ CNI插件:根据CNI规范实现其接口,以与插件提供者进行对接。
◎ kubenet插件:使用bridge和host-local CNI插件实现一个基本的cbr0。
为了在Kubernetes集群中使用网络插件,需要在kubelet服务的启动参数上设置下面两个参数。
◎ –network-plugin-dir:kubelet启动时扫描网络插件的目录。
◎ –network-plugin:网络插件名称,对于CNI插件,设置为cni即可,无须关注–network-plugin-dir的路径。对于kubenet插件,设置为kubenet,目前仅实现了一个简单的cbr0 Linux网桥。
在设置–network-plugin="cni"时,kubelet还需设置下面两个参数。
◎ –cni-conf-dir:CNI插件的配置文件目录,默认为/etc/cni/net.d。该目录下配置文件的内容需要符合CNI规范。
◎ –cni-bin-dir:CNI插件的可执行文件目录,默认为/opt/cni/bin。
目前已有多个开源项目支持以CNI网络插件的形式部署到Kubernetes集群中,进行Pod的网络设置和网络策略的设置,包括Calico、Canal、Cilium、Contiv、Flannel、Romana、Weave Net等。

Kubernetes网络策略

    为了实现细粒度的容器间网络访问隔离策略,Kubernetes从1.3版本开始,由SIG-Network小组主导研发了Network Policy机制,目前已升级为networking.k8s.io/v1稳定版本。Network Policy的主要功能是对Pod间的网络通信进行限制和准入控制,设置方式为将Pod的Label作为查询条件,设置允许访问或禁止访问的客户端Pod列表。目前查询条件可以作用于Pod和Namespace级别。

    为了使用Network Policy,Kubernetes引入了一个新的资源对象NetworkPolicy,供用户设置Pod间网络访问的策略。但仅定义一个网络策略是无法完成实际的网络隔离的,还需要一个策略控制器(Policy Controller)进行策略的实现。策略控制器由第三方网络组件提供,目前Calico、Cilium、Kube-router、Romana、Weave Net等开源项目均支持网络策略的实现。
Network Policy的工作原理如下图所示,policy controller需要实现一个API Listener,监听用户设置的NetworkPolicy定义,并将网络访问规则通过各Node的Agent进行实际设置(Agent则需要通过CNI网络插件实现)。

 

带你玩转kubernetes-k8s(第47篇:深入分析k8s网络原理[在K8s中使用网络插件)

 

网络策略配置说明

      网络策略的设置主要用于对目标Pod的网络访问进行限制,在默认情况下对所有Pod都是允许访问的,在设置了指向Pod的NetworkPolicy网络策略之后,到Pod的访问才会被限制。

下面通过一个例子对NetworkPolicy资源对象的使用进行说明:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1apiVersion:  networking.k8s.io/v1
2kind: NetworkPolicy
3metadata:
4  name: test-network-policy
5  namespace: default
6spec:
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    - namespacesSelector:
20        matchLabels:
21          project: mopoject
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
35

主要的参数说明如下。
◎ podSelector:用于定义该网络策略作用的Pod范围,本例的选择条件为包含“role=db”标签的Pod。
◎ policyTypes:网络策略的类型,包括ingress和egress两种,用于设置目标Pod的入站和出站的网络限制。
◎ ingress:定义允许访问目标Pod的入站白名单规则,满足from条件的客户端才能访问ports定义的目标Pod端口号。

  • from:对符合条件的客户端Pod进行网络放行,规则包括基于客户端Pod的Label、基于客户端Pod所在的Namespace的Label或者客户端的IP范围。
  • ports:允许访问的目标Pod监听的端口号。

◎ egress:定义目标Pod允许访问的“出站”白名单规则,目标Pod仅允许访问满足to条件的服务端IP范围和ports定义的端口号。

  • to:允许访问的服务端信息,可以基于服务端Pod的Label、基于服务端Pod所在的Namespace的Label或者服务端IP范围。
  • ports:允许访问的服务端的端口号。

通过本例的NetworkPolicy设置,对目标Pod的网络访问的效果如下。
◎ 该网络策略作用于Namespace“default”中含有“role=db”Label的全部Pod。
◎ 允许与目标Pod在同一个Namespace中的包含“role=frontend”Label的客户端Pod访问目标Pod。
◎ 允许属于包含“project=myproject”Label的Namespace的客户端Pod访问目标Pod。
◎ 允许从IP地址范围“172.17.0.0/16”的客户端Pod访问目标Pod,但是不包括IP地址范围“172.17.1.0/24”的客户端。
◎ 允许目标Pod访问IP地址范围“10.0.0.0/24”并监听5978端口的服务。

     这里是关于namespaceSelector和podSelector的说明:在from或to的配置中,namespaceSelector和podSelector可以单独设置,也可以组合配置。如果仅配置podSelector,则表示与目标Pod属于相同的Namespace,而组合设置则可以设置Pod所属的Namespace,例如:


1
2
3
4
5
6
7
8
1 - from:
2    - namespacesSelector:
3        matchLabels:
4          project: mopoject
5    - podSelector:
6        matchLabels:
7          role: frontend
8

     表示允许访问目标Pod的来源客户端Pod应具有如下属性:属于有“project=myproject”标签的Namespace,并且有“role=frontend”标签。

在Namespace级别设置默认的网络策略

   在Namespace级别还可以设置一些默认的全局网络策略,以方便管理员对整个Namespace进行统一的网络策略设置。

默认禁止任何客户端访问该Namespace中的所有Pod:


1
2
3
4
5
6
7
8
9
10
1apiVersion: networking.k8s.io/v1
2kind: NetworkPolicy
3metadata:
4  name: default-deny
5spec:
6  podSelector: {}
7  policyTypes:
8  - Ingress
9
10

默认允许任何客户端访问该Namespace中的所有Pod:


1
2
3
4
5
6
7
8
9
10
11
1apiVersion: networking.k8s.io/v1
2kind: NetworkPolicy
3metadata:
4  name: allow-all
5spec:
6  podSelector:{}
7  ingress:
8  - {}
9  policyTypes:
10  - Ingress
11

默认禁止该Namespace中的所有Pod访问外部服务:


1
2
3
4
5
6
7
8
9
10
1apiVersion: networking.k8s.io/v1
2kind: NetworkPolicy
3metadata:
4  name: default-deny
5spec:
6  podSelector: {}
7  policyTypes:
8  - Egress
9
10

默认允许该Namespace中的所有Pod访问外部服务:


1
2
3
4
5
6
7
8
9
10
11
1apiVersion: networking.k8s.io/v1
2kind: NetworkPolicy
3metadata:
4  name: allow-all
5spec:
6  podSelector:{}
7  egress:
8  - {}
9  policyTypes:
10  - Egress
11

默认禁止任何客户端访问该Namespace中的所有Pod,同时禁止访问外部服务:


1
2
3
4
5
6
7
8
9
10
1apiVersion: networking.k8s.io/v1
2kind: NetworkPolicy
3metadata:
4  name: default-deny
5spec:
6  podSelector: {}
7  policyTypes:
8  - Ingress
9  - Egress
10

NetworkPolicy的发展

     Kubernetes从1.12版本开始,引入了对SCTP协议的支持,目前为Alpha版本的功能,可以通过打开–feature-gates=SCTPSupport=true特性开关启用。开启之后,可以在NetworkPolicy资源对象中设置protocol字段的值为SCTP,启用对SCTP协议的网络隔离设置。这要求CNI插件提供对SCTP协议的支持。

小结:

      本节内容到结束,本节内容比较简单,相信大家都可以理解。

      谢谢大家的浏览和支持!

      多多点关注哦!

 

 

给TA打赏
共{{data.count}}人
人已打赏
安全运维

故障复盘的简洁框架-黄金三问

2021-9-30 19:18:23

安全运维

OpenSSH-8.7p1离线升级修复安全漏洞

2021-10-23 10:13:25

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索