### 一、资源
官方文档
```
https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/integration
```
### 二、Calico 部署注意事项
在使用 Calico 前当然最好撸一下官方文档,地址在这里 [Calico 官方文档](http://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/),其中部署前需要注意以下几点
- **官方文档中要求 kubelet 配置必须增加 --network-plugin=cni 选项**
- **kube-proxy 组件必须采用 iptables proxy mode 模式(1.2 以后是默认模式)**
- **kubec-proxy 组件不能采用 --masquerade-all 启动,因为会与 Calico policy 冲突**
- **NetworkPolicy API 只要需要 Kubernetes 1.3 以上**
- **启用 RBAC 后需要设置对应的 RoleBinding,参考 官方文档 RBAC 部分**
官方文档rbac
https://docs.projectcalico.org/v2.3/getting-started/kubernetes/installation/hosted/
### 三、系统要求
1. redhat、centos 7系列
2. 默认情况下,NetworkManager不允许Calico管理接口。提前关闭NetworkManager
3. Calico v3.8目前支持:1.13、1.14、1.15
4. Calico作为CNI插件安装。必须通过传递`--network-plugin=cni`参数将kubelet配置为使用CNI网络
5. 支持的kube-proxy模式:iptables(默认)和 ipvs(Kubernetes> = v1.9.3)
6. 内核依赖
```
nf_conntrack_netlink 子系统
ip_tables (对于IPv4)
ip6_tables (对于IPv6)
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
ipip (如果使用Calico网络)
查看内核是否加载:
lsmod |egrep "nf_conntrack_netlink|ip_tables|ip6_tables|ip_set|xt_set|ipt_set|ipt_rpfilter|ipt_REJECT|ipip"
```
```
lsmod 查看目前内核加载了哪些模块。
modprobe [-lcfr] module_name
-c: 列出目前系统所有的模块。
-l: 列出目前在/lib/modules/$(uname -r)/kernel/中的所有模块的完整文件名。
-f: 强制加载指定模块。
-r: 删除指定模块。
modprobe ipv6.ko // 加载ipv6模块。不需要指定模块的完整路径名
modprobe -r ipv6.ko // 删除ipv6模块。
```
7、Linux conntrack表空间不足
```
sysctl -w net.netfilter.nf_conntrack_max=1000000
echo "net.netfilter.nf_conntrack_max=1000000" >> /etc/sysctl.conf
```
### 四、安装calicoctl
1、编译calicoctl配置文件
```
mkdir /etc/calicoctl
cat >/etc/calico/calicoctl.cfg /etc/cni/net.d/10-calico.conf :",
"log_level": "info",
"ipam": {
"type": "calico-ipam"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "/TO/KUBECONFIG>"
}
}
EOF
```
备注:
替换`:`为您的etcd配置。替换`/TO/KUBECONFIG>`为您的kubeconfig文件
#### 3、安装标准CNI环回插件
除了CNI配置文件指定的CNI插件外,Kubernetes还需要标准的CNI环回插件。
下载该文件`loopback`并将其复制到CNI二进制目录。
```
wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz
tar -zxvf cni-plugins-amd64-v0.7.1.tgz
sudo cp loopback /opt/cni/bin/
```
#### 4、安装Calico Kubernetes控制器
该`calico/kube-controllers`容器使Calico的数据存储与Kubernetes保持同步。它作为由部署管理的单个pod运行。
```
wget https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/calico-kube-controllers.yaml
```
修改添加,在最后几行添加环境变量,支持tls认证的etcd
```
image: calico/kube-controllers:v3.8.2
env:
# Configure the location of your etcd cluster.
- name: ETCD_ENDPOINTS
value: ""
- name: ETCD_CA_CERT_FILE
value: "path"
- name: ETCD_CERT_FILE
value: "path"
- name: ETCD_KEY_FILE
value: "path"
```
- 修改``为指向您的etcd群集。
- 使用安装它`kubectl`。
| 环境 | 描述 | 架构 |
| :------------------- | :----------------------------------------------------------- | :----- |
| `ETCD_ENDPOINTS` | 以逗号分隔的要连接的etcd端点列表。示例:`http://10.0.0.1:2379,http://10.0.0.2:2379`。 | string |
| `ETCD_DISCOVERY_SRV` | 通过SRV记录发现etcd端点的域名。与...互斥`ETCD_ENDPOINTS`。例:`example.com` | string |
| `ETCD_CA_CERT_FILE` | 包含颁发etcd服务器证书的CA的根证书的文件的路径。配置Kubernetes控制器以信任etcd服务器提供的证书上的签名。要禁用Kubernetes控制器对服务器的身份验证,请将值设置为`none`。 | 路径 |
| `ETCD_CERT_FILE` | 包含颁发给Kubernetes控制器的客户端证书的文件的路径。使Kubernetes控制器能够参与相互TLS身份验证并向etcd服务器标识自己。例:`/etc/kube-controllers/cert.pem` | 路径 |
| `ETCD_KEY_FILE` | 包含Kubernetes控制器客户端证书私钥的文件的路径。使Kubernetes控制器能够参与相互TLS身份验证并向etcd服务器标识自己。例:`/etc/kube-controllers/key.pem` | |
备注:
控制器官网
https://docs.projectcalico.org/v3.8/reference/kube-controllers/configuration
#### 5、基于角色的访问控制(RBAC)
在启用了RBAC的Kubernetes群集上安装Calico时,必须为某些Kubernetes API提供Calico访问权限。为此,必须在Kubernetes API中配置主题和角色,并且必须为Calico组件提供相应的令牌或证书,以将其标识为已配置的API用户。
**使用Calico网络的Kubernetes API数据存储区**:
```
kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/rbac/rbac-kdd-calico.yaml
```
**带有Calico网络的etcd数据存储**:
```
kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/rbac/rbac-etcd-calico.yaml
```
### 六、DaemonSet和ConfigMap方式安装calico
#### 1、安装etcdv3
### 备注
故障一
![](https://img2018.cnblogs.com/blog/1820425/201909/1820425-20190929085613293-335798119.png)
```
检查
删除nodename文件,然后重新分配pods即可
/var/lib/calico/nodename
```
故障二
![1568795489719](https://img2018.cnblogs.com/blog/1820425/201909/1820425-20190929085613529-88531463.png)
报错原因:由于calico自动检测IP和子网,由于主机上有多个网卡,选择错误的网卡不能和其他calico node节点正常通信,从而bgp邻居建立失败
解决方法:
在“ # Auto-detect the BGP IP address ” 下添加- name: IP_AUTODETECTION_METHOD和value: "can-reach=8.8.8.8",通过检测8.8.8.8dns,判断正确的网卡,
![1568795695309](https://img2018.cnblogs.com/blog/1820425/201909/1820425-20190929085613691-1181564439.png)
下图,是正确找到我们需要指定的网卡
![1568795965598](https://img2018.cnblogs.com/blog/1820425/201909/1820425-20190929085614654-329982387.png)
备注:
如果一个服务器上有多个通公网的网卡,此时8.8.8.8这个dns就不行了,可以寻找本身内网的dns,就可以指定网卡
### 为经作者同意,禁止转载,写作不易