Calico 是一个联网和网络策略供应商。 Calico 支持一套灵活的网络选项,因此你可以根据自己的情况选择最有效的选项,包括非覆盖和覆盖网络,带或不带 BGP。 Calico 使用相同的引擎为主机、Pod 和(如果使用 Istio 和 Envoy)应用程序在服务网格层执行网络策略。Calico以其性能、灵活性而闻名。Calico的功能更为全面,更为复杂。它不仅提供主机和pod之间的网络连接,还涉及网络安全和管理。Calico CNI插件在CNI(container network interface)框架内封装了Calico的功能。
GitHub地址: https://github.com/projectcalico/calico
官方文档:https://projectcalico.docs.tigera.io/about/about-calico
想了解flannel的小伙伴,可以参考我这篇文章:Kubernetes(k8s)CNI(flannel)网络模型原理
其它CNI插件,可以查看k8s官网:https://kubernetes.io/docs/concepts/cluster-administration/addons/
Calico不使用重叠网络比如flannel和libnetwork重叠网络驱动,它是一个纯三层的方法,使用虚拟路由代替虚拟交换,每一台虚拟路由通过BGP协议传播可达信息(路由)到剩余数据中心;Calico在每一个计算节点利用Linux Kernel实现了一个高效的vRouter来负责数据转发,而每个vRouter通过BGP协议负责把自己上运行的workload的路由信息像整个Calico网络内传播——小规模部署可以直接互联,大规模下可通过指定的BGP route reflector来完成。
Calico 的核心组件:
边界网关协议(BGP)是运行于 TCP上的一种自治系统的路由协议,也是互联网上一个核心的去中心化自治路由协议。网络可达信息包括列出的自治系统(AS)的信息。这些信息有效地构造了 AS 互联的拓朴图并由此清除了路由环路,同时在 AS 级别上可实施策略决策。在互联网中,一个自治系统(AS)是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。
可以把calico中的node节点当成一个AS,而node节点中的容器是AS中的router,calico通过BGP解析,将整个网络中容器地址的路由表绘制出来。
BGP两种模式:
Calico的IPIP模式工作原理如下图:
Calico使用的这个tunl0设备,是一个IP隧道(IP tunnel)设备
在上面的例子中,IP包进入IP隧道设备之后,就会被Linux内核的IPIP驱动接管。IPIP驱动会将这个IP包直接封装在一个宿主机网络的IP包中,如下所示:
官方文档:https://projectcalico.docs.tigera.io/getting-started/kubernetes/helm
# 添加源
helm repo add projectcalico https://projectcalico.docs.tigera.io/charts
# helm repo update
# 下载
helm pull projectcalico/tigera-operator --version v3.24.5
# 解压
tar -xf tigera-operator-v3.24.5.tgz
# 安装,默认命名空间:calico-system
helm install calico ./tigera-operator --namespace tigera-operator --create-namespace
# 检查tigera-operator所有资源
kubectl get all -n tigera-operator
wget https://docs.projectcalico.org/manifests/calico.yaml
kubectl apply -f calico.yaml
# 查看
kubectl get all -n kube-system|grep calico
### 1、查看已安装flannel信息
cat /etc/cni/net.d/10-flannel.conflist
### 2、删除flannel布署资源
kubectl delete -f kube-flannel.yml
### 3、清除flannel遗留信息,在集群各节点清理flannel网络的残留文件
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni
rm -rf /etc/cni/net.d
# 下载
wget https://docs.projectcalico.org/manifests/calico.yaml
# 安装
kubectl apply -f calico.yaml
# 查看
kubectl get all -n kube-system|grep calico
# 如果节点NotReady,重启以下容器或者kubelet试试
systemctl restart containerd docker
关于网络策略,可以参考我这篇文章:【云原生】k8s 中的 hostNetwork 和 NetworkPolicy 讲解与实战操作
官方文档:https://projectcalico.docs.tigera.io/security/kubernetes-policy
允许来自同一命名空间中的 Pod 的入口流量,在以下示例中,传入带有标签的 Pod 的 label color: red,仅当它们来自 pod 带有label color: red,才被允许转到80端口。
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
namespace: default
spec:
podSelector:
matchLabels:
color: blue
ingress:
- from:
- podSelector:
matchLabels:
color: red
ports:
- port: 80
在以下示例中,仅当传入流量来自带有标签 color: red的 Pod 时,才允许传入流量,在带有标签的命名空间中带有标签shape: square,在端口上 80.
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-same-namespace
namespace: default
spec:
podSelector:
matchLabels:
color: blue
ingress:
- from:
- podSelector:
matchLabels:
color: red
namespaceSelector:
matchLabels:
shape: square
ports:
- port: 80
【示例1】pod
利用注解 cni.projectcalico.org/ipAddrs
# vi fixed-ip-test-pod.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
annotations:
cni.projectcalico.org/ipAddrs: "["10.244.1.200"]"
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
【示例2】控制器 单pod
利用注解 cni.projectcalico.org/ipAddrs
# vi fixed-ip-test-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: fixed-ip-test
namespace: default
labels:
k8s-app: cloudnativer-test
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
k8s-app: cloudnativer-test
template:
metadata:
labels:
k8s-app: cloudnativer-test
annotations:
cni.projectcalico.org/ipAddrs: "["10.244.1.220"]"
spec:
containers:
- name: fixed-ip-test
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
【示例3】控制器 多pod固定IP池
需要创建额外IP池(除了默认IP池),利用注解cni.projectcalico.org/ipv4pools。
这里先安装一个客户端工具calicoctl
wget https://github.com/projectcalico/calico/releases/download/v3.24.5/calicoctl-linux-amd64
mv calicoctl-linux-amd64 /usr/local/bin/calicoctl
chmod +x /usr/local/bin/calicoctl
编排
# vi fixed-ip-test-deployment2.yaml
# apiVersion: projectcalico.org/v3
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: new-pool1
spec:
blockSize: 31
cidr: 10.244.3.220/24
ipipMode: Never
natOutgoing: true
---
# apiVersion: projectcalico.org/v3
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
name: new-pool2
spec:
blockSize: 31
cidr: 10.244.4.221/24
ipipMode: Never
natOutgoing: true
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: fixed-ip-test2
namespace: default
labels:
k8s-app: cloudnativer-test
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
selector:
matchLabels:
k8s-app: cloudnativer-test
template:
metadata:
labels:
k8s-app: cloudnativer-test
annotations:
# 【注意】不能使用单引号
"cni.projectcalico.org/ipv4pools": "["new-pool1","new-pool2"]"
spec:
containers:
- name: fixed-ip-test
image: nginx:1.7.9
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
查看
# 查看ip池
calicoctl get ippool
kubectl get pods -owide
【温馨提示】要更改用于Pod的默认IP范围,请修改calico.yaml清单文件中CALICO_IPV4POOL_CIDR部分。
目前比较常用的是flannel和calico,flannel的功能比较简单,不具备复杂网络的配置能力,不支持网络策略;calico是比较出色的网络管理插件,单具备复杂网络配置能力的同时,往往意味着本身的配置比较复杂,所以相对而言,比较小而简单的集群使用flannel,考虑到日后扩容,未来网络可能需要加入更多设备,配置更多策略,则使用calico更好。
两个插件使用的都比较广泛,如果需要设置网络策略,规划更复杂的网络,固定IP等,就建议使用Calico;如果只是简单的使用网络插件的通讯功能就选择Flannel。
关于Kubernetes(k8s)CNI(Calico)网络模型原理介绍与部署就先到这里了,有疑问的小伙伴,欢迎给我留言,后续会持续更新【云原生+大数据】相关的文章,请小伙伴耐心等待~
页面更新:2024-03-08
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号