一、概述

容器网络是容器选择连接到其他容器、主机和外部网络的机制。容器的 runtime 提供了各种网络模式,每种模式都会产生不同的体验。例如,Docker 默认情况下可以为容器配置以下网络:

  • none:将容器添加到一个容器专门的网络堆栈中,没有对外连接。
  • host:将容器添加到主机的网络堆栈中,没有隔离。
  • default bridge: 默认网络模式。每个容器可以通过 IP 地址相互连接。
  • 自定义网桥:用户定义的网桥,具有更多的灵活性、隔离性和其他便利功能。

    二、什么是CNI?

    CNI(Container Network Interface) 是一个标准的,通用的接口。在容器平台,Docker,Kubernetes,Mesos 容器网络解决方案 flannel,calico,weave。只要提供一个标准的接口,就能为同样满足该协议的所有容器平台提供网络功能,而 CNI 正是这样的一个标准接口协议。

    三、Kubernetes 中的 CNI 插件

    CNI 的初衷是创建一个框架,用于在配置或销毁容器时动态配置适当的网络配置和资源。插件负责为接口配置和管理 IP 地址,并且通常提供与 IP 管理、每个容器的 IP 分配、以及多主机连接相关的功能。容器运行时会调用网络插件,从而在容器启动时分配 IP 地址并配置网络,并在删除容器时再次调用它以清理这些资源。
    运行时或协调器决定了容器应该加入哪个网络以及它需要调用哪个插件。然后,插件会将接口添加到容器网络命名空间中,作为一个 veth 对的一侧。接着,它会在主机上进行更改,包括将 veth 的其他部分连接到网桥。再之后,它会通过调用单独的 IPAM(IP地址管理)插件来分配 IP 地址并设置路由。
    在 Kubernetes 中,kubelet 可以在适当的时间调用它找到的插件,为通过 kubelet 启动的 pod进行自动的网络配置。
    Kubernetes 中可选的 CNI 插件如下:

  • Flannel

  • Calico
  • Canal
  • Weave

    四、什么是 Calico?

    Calico 为容器和虚拟机提供了安全的网络连接解决方案,并经过了大规模生产验证(在公有云和跨数千个集群节点中),可与 Kubernetes,OpenShift,Docker,Mesos,DC / OS 和 OpenStack 集成。
    Calico 还提供网络安全规则的动态实施。使用 Calico 的简单策略语言,您可以实现对容器,虚拟机工作负载和裸机主机端点之间通信的细粒度控制。
    Calico 官网:https://www.projectcalico.org/

    五、安装Calico

    ```shell

    切换到usr目录下的local目录,然后创建calico目录,并且切换到calico目录

    cd /usr/local && mkdir calico && cd calico

下载calico.yaml

wget https://docs.projectcalico.org/manifests/calico.yaml

需要去calico看当前最新的版本v3.23可能会修改的

wget https://projectcalico.docs.tigera.io/v3.23/manifests/calico.yaml

查看calico.yaml

vi calico.yaml

  1. 这里是下载好的calico.yml配置文件[calico.yaml](https://www.yuque.com/attachments/yuque/0/2022/yaml/12599655/1652937664657-4fa1ed85-9cec-4795-8170-c74ab1428956.yaml?_lake_card=%7B%22src%22%3A%22https%3A%2F%2Fwww.yuque.com%2Fattachments%2Fyuque%2F0%2F2022%2Fyaml%2F12599655%2F1652937664657-4fa1ed85-9cec-4795-8170-c74ab1428956.yaml%22%2C%22name%22%3A%22calico.yaml%22%2C%22size%22%3A229762%2C%22type%22%3A%22%22%2C%22ext%22%3A%22yaml%22%2C%22status%22%3A%22done%22%2C%22taskId%22%3A%22u53252acd-6303-43bb-b702-4e94bb774cb%22%2C%22taskType%22%3A%22upload%22%2C%22id%22%3A%22ucd974564%22%2C%22card%22%3A%22file%22%7D)
  2. ```shell
  3. # scp 文件的绝对路径 服务的账户名称@IP地址:/服务器的路径
  4. scp C:\Users\Matrix\Desktop\calico.yaml root@192.168.87.110:/usr/local/calico

修改第 4434 行,将 192.168.0.0/16 修改为 10.244.0.0/16,可以通过如下命令快速查找到:CALICO_IPV4POOL_CIDR

  • vim编辑器显示行号:set number
  • vim编辑器查找字符:/要查找的字符,输入小写 n 下一个匹配项,输入大写 N 上一个匹配项

image.png
现在还是配#号注释的配置还没有生效,需要将其更改成下图的配置:
image.png
开始安装Calico网络插件

apt-get update && kubectl apply -f calico.yaml

# 输出如下信息
Hit:1 http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic InRelease
Hit:2 https://mirrors.aliyun.com/ubuntu bionic InRelease
Hit:3 https://mirrors.aliyun.com/ubuntu bionic-updates InRelease
Hit:4 https://mirrors.aliyun.com/ubuntu bionic-backports InRelease
Hit:5 https://mirrors.aliyun.com/ubuntu bionic-security InRelease
Hit:6 https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial InRelease
Reading package lists... Done
configmap/calico-config created
customresourcedefinition.apiextensions.k8s.io/bgpconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/bgppeers.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/blockaffinities.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/caliconodestatuses.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/clusterinformations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/felixconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/globalnetworksets.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/hostendpoints.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamblocks.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamconfigs.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipamhandles.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ippools.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/ipreservations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/kubecontrollersconfigurations.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networkpolicies.crd.projectcalico.org created
customresourcedefinition.apiextensions.k8s.io/networksets.crd.projectcalico.org created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-node created
clusterrolebinding.rbac.authorization.k8s.io/calico-node created
daemonset.apps/calico-node created
serviceaccount/calico-node created
deployment.apps/calico-kube-controllers created
serviceaccount/calico-kube-controllers created
poddisruptionbudget.policy/calico-kube-controllers created

六、验证 Calico 安装是否成功

  • 查看 Calico 网络插件处于 Running 状态即表示安装成功
  • Calico再下载镜像需要的镜像时有点慢,需要耐心等待。 ```shell watch kubectl get pods —all-namespaces

输出如下:

NAMESPACE NAME READY STATUS RESTARTS AGE kube-system calico-kube-controllers-6b77fff45-h4z4k 1/1 Running 0 7m35s kube-system calico-node-dx7g8 1/1 Running 0 7m35s kube-system calico-node-f2r4r 1/1 Running 0 7m35s kube-system calico-node-qhljz 1/1 Running 0 7m36s kube-system coredns-6d8c4cb4d-5wqwt 1/1 Running 0 18m kube-system coredns-6d8c4cb4d-cdllc 1/1 Running 0 18m kube-system etcd-node 1/1 Running 0 19m kube-system kube-apiserver-node 1/1 Running 0 19m kube-system kube-controller-manager-node 1/1 Running 0 19m kube-system kube-proxy-7cdrk 1/1 Running 0 16m kube-system kube-proxy-dmtmb 1/1 Running 0 18m kube-system kube-proxy-fvxq2 1/1 Running 0 15m kube-system kube-scheduler-node 1/1 Running 0 19m


- 查看节点状态处于 **Ready** 即表示安装成功
```shell
kubectl get node

# 输出如下:
NAME                 STATUS   ROLES                  AGE   VERSION
kubernetes-node-01   Ready    <none>                 17m   v1.23.6
kubernetes-node-02   Ready    <none>                 16m   v1.23.6
node                 Ready    control-plane,master   19m   v1.23.6

七、删除 Calico 网络插件

# 删除操作
kubectl delete -f calico.yaml