? Calico 必须能够在宿主机上管理 cali*
网卡。当 IPIP
被启用时(默认),Calico 还需要能够管理 tunl*
网卡。
注意: 许多Linux发行版都安装了
NetworkManager
。默认情况下NetworkManager
不允许 Calico 管理网卡。如果你的节点有NetworkManager
,在安装 Calico 之前,你需要按照这个步骤去防止 NetworkManager 控制 Calico 网卡。
Calico v3.16 所有组件需要把数据存储到 kv数据库,在kubernetes
平台,你可以配置calico访问etcdv3 集群 或者通过kubernetes api datastore
。
<!--more-->
保证主机和防火墙能允许以下端口通信
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
版本要求kubelet 配置添加--network-plugin=cni
参数
如果集群之前有flannel,执行以下命令清除干净
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/
Calico 有以下三种使用场景:
注意: 策略是指Kubernetes的网络策略(network policy)。
Calico的数据存储(datastore)有2种方式,一个是使用 Kubernetes API
;一个是使用etcd。 在使用不同数据存储和集群规模不同的情况下,安装配置的过程会有所不同
本文档基于使用k8s自带etcd集群
curl https://docs.projectcalico.org/manifests/calico-etcd.yaml -o calico.yaml
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"
默认是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"
当 Calico 被用作路由,每个 node 必须配置一个 IPv4 地址 和/或者 一个 IPv6 地址,用作 node 间的路由。为了排除节点特定的 IP 地址的配置,calico/node 这个容器可以被配置为自动检测 IP 地址配置。在许多系统中,一个主机上或许会有多个物理网卡,或者可能有多个 IP 地址配置到一个物理网卡。在这些情况下,自动检测模式下会有多个地址可选,所以难以确认正确的地址。
为了改善选择正确地址的过程,Calico 提供了 IP 自动检测的方法,这些方法基于合适的条件给这个选择定义一些限制。
first-foundfirst-found
方法列举所有网卡 IP 地址然后返回第一个有效网卡上的第一个有效的 IP 地址(基于IP版本和地址的类型)。确切已知的 "local" 网卡会被忽略,例如 docker 网桥。网卡和 IP 地址的顺序根据不同系统会有差异。
这个是默认的检测方法。然而,由于这个方法只会作非常简单的假设,强烈推荐要么给节点配置一个特定的 IP 地址(应该是通过给 kubelet 指定参数),要么使用另外一种检测方法。
e.g.
`IP_AUTODETECTION_METHOD=first-found IP6_AUTODETECTION_METHOD=first-found`
can-reach=DESTINATIONcan-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-REGEXinterface
方法使用提供的网卡正则表达式(golang语法)去列举匹配到的网卡然后返回在第一个匹配到的网卡上的第一个 IP 地址。网卡和 IP 地址的顺序根据不同系统会有差异。
网卡 eth0, eth1, eth2 etc. 的有效 IP 地址的例子:IP_AUTODETECTION_METHOD=interface=eth.* IP6_AUTODETECTION_METHOD=interface=eth.*
指定cidr段作为地址
- name: IP_AUTODETECTION_METHOD
value: "cidr=172.16.0.0/24"
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"
curl -O -L https://github.com/projectcalico/calicoctl/releases/download/v3.16.1/calicoctl
chmod +x calicoctl
ETCD_ENDPOINTS=http://etcd:2379 calicoctl get bgppeers
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
原文:https://blog.51cto.com/foxhound/2536925