Kubernetes 多租户隔离利器 Calico

栏目: 服务器 · 发布时间: 6年前

内容简介:快,关注这个公众号,一起涨知识

快,关注这个公众号,一起涨知识

Kubernetes 多租户隔离利器 Calico

本文 介绍了一个数据中心网络方案Calico,包括其优势、架构、性能分析、工作原理,以及分析了生态云Kubernetes版应用引擎在Calico中的policy设置策略。

背景

小米生态云旨在为小米生态链企业及合作伙伴提供云计算、大数据、人工智能、安全及合规等一站式云服务和整体解决方案。生态云上有一款基于Kubernetes研发的新版应用引擎已经为几十家企业提供服务,每家企业的数据保护最为重要,为此我们探讨了诸多方案的可行性,最终使用Calico网络方案。

Calico简介

Calico是纯3层的数据中心网络方案,它是目前Kubernetes networkpolicy概念的最佳实现方案之一,利用虚拟路由代理虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心。

Calico优势

1. 支持Kubernetes networkpolicy概念

2. 容器间网络三层隔离,无需要担心arp风暴

3. 自由控制的policy规则

4. 网络拓扑直观易懂,扩展性强

5. 通过iptables和kernel包转发,效率高,损耗低

Calico架构图

Kubernetes 多租户隔离利器 Calico

Calico包括如下重要组件:Felix,Etcd,BGP Client,BGP Route Reflector。Felix 、BGPClient 部署在node节点,BGPRouteReflector部署在Master,下面分别说明一下这些组件。

Felix: 主要负责路由配置以及ACLS规则的配置以及下发,它存在在每个node节点上。

Etcd: 分布式键值存储,主要负责网络元数据一致性,确保Calico网络状态的准确性,一般与Kubernetes共用。

BGP Client(BIRD): 负责把Felix在各node上设置的路由信息广播到Calico网络( 通过BGP协议)。

BGP Route Reflector: 集中式的路由分发。

Calico原理

如下图所示:原网络通过路由表和iptables,再经过数据中心路由,最终到达目地网络路由,最后分配到目地容器。

Kubernetes 多租户隔离利器 Calico

Kubernetes版应用引擎的设置策略

因为企业用户会在Kubernetes版应用引擎中建立多个namespace,故不能使用基于namespace的policy策略,我们使用label的方式进行policy的自定义。

以A公司为例子:

实验环境所用的3个namespace是:ami-a、ami-b、bmi三个

1. 新建namespace并打标签org=ami、org=bmi

kubectl create -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: ami-a
labels:
org: org-ami #为namespace ami-a打org=ami
EOF

kubectl create -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: ami-b
labels:
org: org-ami #为namespace ami-b 打org=ami
EOF

kubectl create -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: bmi
labels:
org: org-bmi #为namespace bmi 打org=bmi
EOF

2.Calico默认策略是相同子网的pod互相访问是通的,不管namespace是否相同。

为此我们需要先建一个全局策略来禁业pod IP访问。然后再单独为ami和bmi建立policy。

(1)全局禁业策略如下:

kubectl create -f - <<EOF
- apiVersion: v1
kind: policy
metadata:
name: cluster-policy.deny-private-egress
spec:
egress:
- action: deny
destination:
nets:     
- 192.168.0.0/16 #禁止192.168.0.0/16 段访问source: {}
- action: deny
destination:
nets:
- 172.16.0.0/12 #禁止172.16.0.0/12 段访问source: {}
order: 900selector: has(calico/k8s_ns) && calico/k8s_ns != 'kube-system' && calico/k8s_ns
!= 'app-engine' && calico/k8s_ns != 'healthspace'


EOF

(2)单独为ami和bmi创建策略如下:

calicoctl create -f - <<EOF
- apiVersion: v1
kind: policy
metadata:
name: ami.allow-access-from-same-rog
spec:
egress:
- action: allow
destination:
selector: k8s_ns/label/org == 'org-ami' #允许label org=ami的出口互相访问source:
selector: k8s_ns/label/org == 'org-ami'ingress:
- action: allow
destination: {}
source:
selector: k8s_ns/label/org == 'org-ami' #允许label org=ami的入口互相访问order: 800selector: k8s_ns/label/org == 'org-ami'

EOF

calicoctl create -f - <<EOF
- apiVersion: v1
kind: policy
metadata:
name: bmi.allow-access-from-same-rog
spec:
egress:
- action: allow
destination:
selector: k8s_ns/label/org == 'org-bmi' #允许label org=bmi的出口互相访问source:
selector: k8s_ns/label/org == 'org-bmi'ingress:
- action: allow
destination: {}
source:
selector: k8s_ns/label/org == 'org-bmi' #允许label org=bmi的入口互相访问order: 800selector: k8s_ns/label/org == 'org-bmi'

EOF

order越小代表执行策略越靠前,Calico执行的是聚合策略。

通过这样的配置 即使namespace不同,但只要label相同,网络就会互通,我们为每家企业提供不同的label,这样就达到我们目地。

3.让我们来验证一下

(1)我们新建了三个namespace别分是:

ami-a label org-ami

ami-b label org-ami

bmi label org-bmi

两个ami label相同,bmi单独一个label。

建立完成后,使用命令kubectl get namespace ns -o yaml 分别看下建立后的namespace label。

Kubernetes 多租户隔离利器 Calico

(2)分别在每个namespace中建一个container ,使用kubectl create -f .建立三个container。

Kubernetes 多租户隔离利器 Calico

创建完成的pod IP如下:

Kubernetes 多租户隔离利器 Calico

(3)PING测试

登陆ami-a的nginx pod 去PING ami-b的pod IP看是否通:

Kubernetes 多租户隔离利器 Calico

结果是通的。

登陆ami-b的nginx pod 去PING ami-a的pod IP看是否通:

Kubernetes 多租户隔离利器 Calico

结果也是通的。

登陆 ami-a中nginx pod 去PING bmi的pod IP是否相通:

Kubernetes 多租户隔离利器 Calico

结果显示不通。

以上结果验证了我们使用Calico做的policy策略得以生效,并满足我们的需求。

Calico性能

Calico是基于Golang开发,CNI网络模型,并发性能好,且policy也是基于iptables,建立各种ACLS,iptables又是基于内核转发,再加上不像flannel有对包进行加解密的操作,节省了CPU的资源。

经过网上测试和内部测试,结论:性能仅次于物理连接。

1. 网上各网络组件测试结果:

Kubernetes 多租户隔离利器 Calico

2. 内部Calico和flannel 对比测试:

Kubernetes 多租户隔离利器 Calico

总结

Calico之所以能大规模应用,主要是其良好的性能,并且policy的配置足够灵活,可以满足大部分公有云厂商的需求。Calico不光可以应用于Kubernetes,还可以应用于像openstack、VM等其他云管理平台。

唯一的不足就是当node过多(几万台级),维护的路由表就会过大,全表扫描会有性能问题(目前生态云还未有),如果出现性能问题可以改成IPVS的方式。

更多policy配置文件可以点击左下方 阅读原文 ,查看官方文档。

Kubernetes 多租户隔离利器 Calico


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

探索需求

探索需求

章柏幸、王媛媛、谢攀、杰拉尔德・温伯格、唐纳德・高斯 / 章柏幸、王媛媛、谢攀 / 清华大学出版社 / 2004-7-1 / 39.00元

本书将与您一起寻找"什么是客户真正想要的"这一问题的答案。 本书着眼于系统设计之前的需求过程,它是整个开发过程(如何设计人们想要的产品和系统)中最有挑战性的那部分。通过对一些需求分析中的常见误区和问题的分析和讨论,从和客户沟通开始,深入研究一些可能的需求,澄清用户和开发者期望值,最终给出了能够大幅度提高项目成功几率的一些建议方法。 本书由该领域内公认的两位作者合著,搜集了他们在大大小小......一起来看看 《探索需求》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具