一、資源
官方文檔
https://docs.projectcalico.org/v3.8/getting-started/kubernetes/installation/integration
二、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/
三、系統要求
- 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 < 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 < { "name": "calico-k8s-network", "cniVersion": "0.6.0", "type": "calico", "etcd_endpoints": "http://<etcd>:<etcd>",/<etcd>/<etcd> "log_level": "info", "ipam": {
"type": "calico-ipam"
},
"policy": {
"type": "k8s"
},
"kubernetes": {
"kubeconfig": ""
}
}
EOF
備註:
替換 : 為您的etcd配置。替換為您的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>"/<etcd>
- 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
備註
故障一
檢查
刪除nodename文件,然後重新分配pods即可
/var/lib/calico/nodename
故障二
報錯原因:由於calico自動檢測IP和子網,由於主機上有多個網卡,選擇錯誤的網卡不能和其他calico node節點正常通信,從而bgp鄰居建立失敗
解決方法:
在“ # Auto-detect the BGP IP address ” 下添加- name: IPAUTODETECTIONMETHOD和value: "can-reach=8.8.8.8",通過檢測8.8.8.8dns,判斷正確的網卡,
下圖,是正確找到我們需要指定的網卡
備註:
如果一個服務器上有多個通公網的網卡,此時8.8.8.8這個dns就不行了,可以尋找本身內網的dns,就可以指定網卡
閱讀更多 IT那達慕 的文章