一、資源
官方文檔
https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/integration
二、Calico 部署注意事項
在使用 Calico 前當然最好擼一下官方文檔,地址在這里 Calico 官方文檔,其中部署前需要注意以下幾點
- 官方文檔中要求 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/
三、系統要求
-
redhat、centos 7系列
-
默認情況下,NetworkManager不允許Calico管理接口。提前關閉NetworkManager
-
Calico v3.8目前支持:1.13、1.14、1.15
-
Calico作為CNI插件安裝。必須通過傳遞
--network-plugin=cni
參數將kubelet配置為使用CNI網絡 -
支持的kube-proxy模式:iptables(默認)和 ipvs(Kubernetes> = v1.9.3)
-
內核依賴
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 <<EOF
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
datastoreType: "etcdv3"
etcdEndpoints: "https://10.39.7.51:2379,https://10.39.7.52:2379,https://10.39.7.57:2379"
etcdKeyFile: "/etc/kubernetes/ssl/etcd-key.pem"
etcdCertFile: "/etc/kubernetes/ssl/etcd.pem"
EOF
備注:
使用etcd如果沒有tls認證,則去除etcdKeyFile和etcdCertFile倆個選項
五、安裝Calico
1、使用systemd unit管理calico
[Unit]
Description=calico-node
After=docker.service
Requires=docker.service
[Service]
User=root
PermissionsStartOnly=true
ExecStart=/usr/bin/docker run --net=host --privileged \
--name=calico-node \
-e NODENAME=${CALICO_NODENAME} \
-e IP=${CALICO_IP} \
-e IP6=${CALICO_IP6} \
-e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \
-e AS=${CALICO_AS} \
-e NO_DEFAULT_POOLS=${CALICO_NO_DEFAULT_POOLS} \
-e ETCD_ENDPOINTS=${ETCD_ENDPOINTS} \
-e ETCD_CA_CERT_FILE=${ETCD_CA_CERT_FILE} \
-e ETCD_CERT_FILE=${ETCD_CERT_FILE} \
-e ETCD_KEY_FILE=${ETCD_KEY_FILE} \
-v /lib/modules:/lib/modules \
-v /run/docker/plugins:/run/docker/plugins \
-v /data/calico:/var/run/calico \
-v /data/calico:/var/log/calico \
-v /data/calico:/var/lib/calico \
calico/node:v3.8.2
ExecStop=/usr/bin/docker rm -f calico-node
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
2、安裝Calico CNI插件
下載Calico
wget -N https://github.com/projectcalico/cni-plugin/releases/download/v3.8.2/calico-amd64
wget -N https://github.com/projectcalico/cni-plugin/releases/download/v3.8.2/calico-ipam-amd64
mv ./calico-amd64 /usr/local/bin/calico
mv ./calico-ipam-amd64 /usr/local/bin/calico-ipam
chmod +x /usr/local/bin/calico /usr/local/bin/calico-ipam
mkdir -p /etc/cni/net.d
cat >/etc/cni/net.d/10-calico.conf <<EOF
{
"name": "calico-k8s-network",
"cniVersion": "0.6.0",
"type": "calico",
"etcd_endpoints": "http://<ETCD_IP>:<ETCD_PORT>",
"log_level": "info",
"ipam": {
"type": "calico-ipam"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": "</PATH/TO/KUBECONFIG>"
}
}
EOF
備注:
替換<ETCD_IP>:<ETCD_PORT>
為您的etcd配置。替換</PATH/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: "<ETCD_ENDPOINTS>"
- name: ETCD_CA_CERT_FILE
value: "path"
- name: ETCD_CERT_FILE
value: "path"
- name: ETCD_KEY_FILE
value: "path"
- 修改
<ETCD_ENDPOINTS>
為指向您的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
備注
故障一
檢查
刪除nodename文件,然后重新分配pods即可
/var/lib/calico/nodename
故障二
報錯原因:由於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,判斷正確的網卡,
下圖,是正確找到我們需要指定的網卡
備注:
如果一個服務器上有多個通公網的網卡,此時8.8.8.8這個dns就不行了,可以尋找本身內網的dns,就可以指定網卡