開始前准備
確定calico數據存儲
Calico同時支持kubernetes api和etcd數據存儲。官方給出的建議是在本地部署中使用K8S API,僅支持Kubernetes模式。而官方給出的etcd則是混合部署(Calico作為Kubernetes和OpenStack的網絡插件運行)的最佳數據存儲。
使用etcd作為calico數據存儲的好處:
- 允許多平台混用calico,如Kubernetes OpenStack上運行Calico
- Kubernetes資源與Calico資源分離
- 一個Calico群集,該群集不僅僅包含一個Kubernetes群集,如可與多個kubernetes集群互通。
壞處:
- 安裝步驟繁瑣
- 無法使用Kubernetes RBAC對calico資源的控制
- 無法使用Kubernetes資源對calico進行管理
下載calico部署清單
curl https://docs.projectcalico.org/manifests/calico-etcd.yaml -o calico.yaml
修改Pod CIDR
Calico默認的Pod CIDR使用的是192.168.0.0/16
,這里一般使用與controller-manager中的--cluster-cidr
保持一,取消資源清單內的 CALICO_IPV4POOL_CIDR
變量的注釋,並將其設置為與所選Pod CIDR相同的值。
calico的IP分配范圍
Calico IPAM從ipPool
分配IP地址。修改Pod的默認IP范圍則修改清單calico.yaml
中的CALICO_IPV4POOL_CIDR
配置Calico的 IP in IP
默認情況下,Calico中的IPIP已經禁用,這里使用的v3.17.2 低版本默認會使用IPIP
要開啟IPIP mode則需要修改配置清單內的 CALICO_IPV4POOL_IPIP
環境變量改為 always
修改secret
# Populate the following with etcd TLS configuration if desired, but leave blank if
# not using TLS for etcd.
# The keys below should be uncommented and the values populated with the base64
# encoded contents of each file that would be associated with the TLS data.
# Example command for encoding a file contents: cat <file> | base64 -w 0
# etcd的ca
etcd-ca: # 填寫上面命令編碼后的值
# etcd客戶端key
etcd-key: # 填寫上面命令編碼后的值
# etcd客戶端訪問證書
etcd-cert: # 填寫上面命令編碼后的值
修改configMap
etcd_endpoints: "https://10.0.0.6:2379"
# If you're using TLS enabled etcd uncomment the following.
# You must also populate the Secret below with these files.
etcd_ca: "/calico-secrets/etcd-ca"
etcd_cert: "/calico-secrets/etcd-cert"
etcd_key: "/calico-secrets/etcd-key"
開始安裝
kubectl apply -f calico.yaml
安裝出錯
/calico-secrets/etcd-cert: permission denied
2021-02-08 02:15:10.485 [INFO][1] main.go 88: Loaded configuration from environment config=&config.Config{LogLevel:"info", WorkloadEndpointWorkers:1, ProfileWorkers:1, PolicyWorkers:1, NodeWorkers:1, Kubeconfig:"", DatastoreType:"etcdv3"}
2021-02-08 02:15:10.485 [FATAL][1] main.go 101: Failed to start error=failed to build Calico client: could not initialize etcdv3 client: open /calico-secrets/etcd-cert: permission denied
找到資源清單內的對應容器(calico-kube-controllers
)的配置。在卷裝載中設置440將解決此問題
volumes:
# Mount in the etcd TLS secrets with mode 400.
# See https://kubernetes.io/docs/concepts/configuration/secret/
- name: etcd-certs
secret:
secretName: calico-etcd-secrets
defaultMode: 0400 # 改為0440
修改calicoctl的數據源
使用單獨的etcd作為calico數據存儲還需要修改calicoctl數據存儲訪問配置
calicoctl
在默認情況下,查找配置文件的路徑為/etc/calico/calicoctl.cfg
上。可以使用--config
覆蓋此選項默認配置(使用中測試不成功,官方給出有這個方法)。
如果calicoctl
無法獲得配置文件,將檢查環境變量。
apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
datastoreType: etcdv3
etcdEndpoints: "https://10.0.0.6:2379"
etcdCACert: |
# 這里填寫etcd ca證書文件的內容,無需轉碼base64
etcdCert: |
# 這里填寫etcd client證書文件的內容,無需轉碼base64
etcdKey: |
# 這里填寫etcd client秘鑰文件的內容,無需轉碼base64
reference: