輕松部署calico


一、資源

官方文檔

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/

三、系統要求

  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 <<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


故障二

1568795489719

報錯原因:由於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

下圖,是正確找到我們需要指定的網卡

1568795965598

備注:

​ 如果一個服務器上有多個通公網的網卡,此時8.8.8.8這個dns就不行了,可以尋找本身內網的dns,就可以指定網卡

為經作者同意,禁止轉載,寫作不易


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM