1、准备工做
Node 环境
- Linux kernel 3.10 以上
- CentOS 7
- Ubuntu 16.04
- Debian 8
- 修改NetworkManager服务的配置以容许Calico管理网卡
Calico 必须可以在宿主机上管理 cali*
网卡。当 IPIP
被启用时(默认),Calico 还须要可以管理 tunl*
网卡。node
注意: 许多Linux发行版都安装了
NetworkManager
。默认状况下NetworkManager
不容许 Calico 管理网卡。若是你的节点有NetworkManager
,在安装 Calico 以前,你须要按照这个步骤去防止 NetworkManager 控制 Calico 网卡。git
key/value存储
Calico v3.16 全部组件须要把数据存储到 kv数据库,在kubernetes
平台,你能够配置calico访问etcdv3 集群 或者经过kubernetes api datastore
。github
<!--more-->golang
网络组件和端口分布
保证主机和防火墙能容许如下端口通讯正则表达式
Configuration | Host(s) | Connection type | Port/protocol |
---|---|---|---|
Calico networking (BGP) | All | Bidirectional | TCP 179 |
Calico networking with IP-in-IP enabled (default) | All | Bidirectional | IP-in-IP, often represented by its protocol number 4 |
Calico networking with VXLAN enabled | All | Bidirectional | UDP 4789 |
Calico networking with Typha enabled | Typha agent hosts | Incoming | TCP 5473 (default) |
flannel networking (VXLAN) | All | Bidirectional | UDP 4789 |
All | kube-apiserver host | Incoming | Often TCP 443 or 6443* |
etcd datastore | etcd hosts | Incoming | Officially TCP 2379 but can vary |
kubernetes
版本要求
- 1.16
- 1.17
- 1.18
开启CNI plug-in
kubelet 配置添加--network-plugin=cni
参数docker
支持的kube-proxy模式
- IPtables(默认支持)
- ipvs 经过这里 Enabling IPVS in Kubernetes 查看更多细节
清楚旧的cni 插件配置
若是集群以前有flannel,执行如下命令清除干净shell
ifconfig cni0 down ip link delete cni0 ifconfig flannel.1 down ip link delete flannel.1 rm -rf /var/lib/cni/
运行Calico的方式
Calico 有如下三种使用场景: 数据库
- 安装Calico做为策略(policy)和网络(networking)(推荐用法)
- 安装Calico做为策略(policy)和flannel做为网络(networking)
- 安装Calico做为策略(policy)(进阶用法)
注意: 策略是指Kubernetes的网络策略(network policy)。api
安装calico的3种环境
Calico的数据存储(datastore)有2种方式,一个是使用 Kubernetes API
;一个是使用etcd。 在使用不一样数据存储和集群规模不一样的状况下,安装配置的过程会有所不一样网络
本文档基于使用k8s自带etcd集群
2、安装calico
2.1 下载yaml
curl https://docs.projectcalico.org/manifests/calico-etcd.yaml -o calico.yaml
2.2 修改etcd集群地址
kind: ConfigMap apiVersion: v1 metadata: name: calico-config namespace: kube-system data: # 这里的etcd地址是k8s 使用的etcd集群. etcd_endpoints: "http://172.16.0.12:2379,http://172.16.0.16:2379,http://172.16.0.44:2379"
2.3 修改集群网段
默认是192.168.0.0/16网段,注意不要和k8s集群网络冲突。
注意,这个网段应该与kubeapi定义--service-cluster-ip-range的网段同样
# The default IPv4 pool to create on startup if none exists. Pod IPs will be # chosen from this range. Changing this value after installation will have # no effect. This should fall within `--cluster-cidr`. - name: CALICO_IPV4POOL_CIDR value: "10.96.0.0/12"
2.4 修改ip 发现方式
当 Calico 被用做路由,每一个 node 必须配置一个 IPv4 地址 和/或者 一个 IPv6 地址,用做 node 间的路由。为了排除节点特定的 IP 地址的配置,calico/node 这个容器能够被配置为自动检测 IP 地址配置。在许多系统中,一个主机上或许会有多个物理网卡,或者可能有多个 IP 地址配置到一个物理网卡。在这些状况下,自动检测模式下会有多个地址可选,因此难以确认正确的地址。
为了改善选择正确地址的过程,Calico 提供了 IP 自动检测的方法,这些方法基于合适的条件给这个选择定义一些限制。
-
first-found
first-found
方法列举全部网卡 IP 地址而后返回第一个有效网卡上的第一个有效的 IP 地址(基于IP版本和地址的类型)。确切已知的 "local" 网卡会被忽略,例如 docker 网桥。网卡和 IP 地址的顺序根据不一样系统会有差别。
这个是默认的检测方法。然而,因为这个方法只会做很是简单的假设,强烈推荐要么给节点配置一个特定的 IP 地址(应该是经过给 kubelet 指定参数),要么使用另一种检测方法。
e.g.`IP_AUTODETECTION_METHOD=first-found IP6_AUTODETECTION_METHOD=first-found`
-
can-reach=DESTINATION
can-reach
方法使用你的本地路由来决定使用哪一个 IP 地址来到达提供的目的地。可使用 IP 地址或者域名。
使用 IP 地址的例子:IP_AUTODETECTION_METHOD=can-reach=8.8.8.8 IP6_AUTODETECTION_METHOD=can-reach=2001:4860:4860::8888
使用域名的例子:
IP_AUTODETECTION_METHOD=can-reach=www.google.com IP6_AUTODETECTION_METHOD=can-reach=www.google.com
-
interface=INTERFACE-REGEX
interface
方法使用提供的网卡正则表达式(golang语法)去列举匹配到的网卡而后返回在第一个匹配到的网卡上的第一个 IP 地址。网卡和 IP 地址的顺序根据不一样系统会有差别。
网卡 eth0, eth1, eth2 etc. 的有效 IP 地址的例子:IP_AUTODETECTION_METHOD=interface=eth.* IP6_AUTODETECTION_METHOD=interface=eth.*
-
cidr=CIDR
指定cidr段做为地址
- name: IP_AUTODETECTION_METHOD value: "cidr=172.16.0.0/24"
2.5 配置kube-api
环境变量
添加环境变量,覆盖kubernetes svc, 保证node安装成功
- name: calico-node image: harbor.foxchan.com/calico/node:v3.16.1 #envFrom: #- configMapRef: # # Allow KUBERNETES_SERVICE_HOST and KUBERNETES_SERVICE_PORT to be overridden for eBPF mode. # name: kubernetes-services-endpoint # optional: true env: # apiserver emargongsi - name: KUBERNETES_SERVICE_HOST value: "172.16.0.20" - name: KUBERNETES_SERVICE_PORT_HTTPS value: "8443" - name: KUBERNETES_SERVICE_PORT value: "8443"
三 、安装配置calicoctl
3.1 下载binary 文件
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.16.1/calicoctl
3.2 赋予权限
chmod +x calicoctl
3.3 使用环境变量访问
ETCD_ENDPOINTS=http://etcd:2379 calicoctl get bgppeers
4、 配置calico cross-subnet
ipip虽然实现了 calico 跨网段通讯,但对于相同网段间的主机通讯来讲,IP-in-IP 就有点多余了,由于两者宿主机处于同一广播域,2层互通,直接走主机路由便可。此时须要借助calico cross-subnet
$ calicoctl apply -f - << EOF apiVersion: projectcalico.org/v3 kind: IPPool metadata: name: default-ipv4-ippool spec: blockSize: 26 cidr: 10.96.0.0/12 ipipMode: CrossSubnet natOutgoing: true nodeSelector: all() vxlanMode: Never EOF
参考文档
calico官方地址:
https://docs.projectcalico.org/getting-started
自定义安装说明页面
https://docs.projectcalico.org/getting-started/kubernetes/installation/config-options