要求:
1.已存在的k8s集群版本大於v1.1,想要使用NetworkPolicy,需要大於v1.3.0
2.可以被所有節點訪問的etcd集群(可以和k8s共享etcd集群,但是最好建立一個獨立的集群)
calico組件:
整合ks8/calico一共有三個組件:
1.每個節點運行一個calico/node容器;包含了calico路由必須的bgp客戶端
2.calico-cni網絡插件的二進制文件(這是兩個二進制可執行文件和配置文件的組合);直接與kubelet集成,運行在每節點從而發現被創建的容器,添加容器到calico網絡
3.如果想要使用NetworkPolicy,需要安裝Calico policy controller;實現了NetworkPolicy.
安裝calico組件:
兩種方式安裝:
1.手動安裝
2.kubernetes-hosted安裝(1.4以上版本)
手動安裝
1.運行 calico/node 並且配置節點
master節點和每個node節點需要calico/node容器,每個節點也記錄在calico的數據存儲中(etcd)
可以使用calicoctl命令完成
- # Download and install `calicoctl`
- wget https://github.com/projectcalico/calico-containers/releases/download/v0.22.0/calicoctl
- sudo chmod +x calicoctl
- # Run the calico/node container
- sudo ETCD_ENDPOINTS=http://<ETCD_IP>:<ETCD_PORT> ./calicoctl node
查看calicoctl_node文檔獲取更多信息
systemd單元文件示例(calico-node.service)
如果使用systemd作為初始化系統,接下來的服務文件可以被使用:
- [Unit]
- Description=calicoctl node
- After=docker.service
- Requires=docker.service
- [Service]
- User=root
- Environment=ETCD_ENDPOINTS=http://<ETCD_IP>:<ETCD_PORT>
- PermissionsStartOnly=true
- ExecStartPre=/usr/bin/wget -N -P /opt/bin https://github.com/projectcalico/calico-containers/releases/download/v0.22.0/calicoctl
- ExecStartPre=/usr/bin/chmod +x /opt/bin/calicoctl
- ExecStart=/opt/bin/calicoctl node --detach=false
- Restart=always
- RestartSec=10
- [Install]
- WantedBy=multi-user.target
替換<ETCD_IP>:<ETCD_PORT>為你自己的配置
2.下載配置你的calico cni插件
k8s kubelet組件調用calico和calico-ipam插件
下載二進制文件,確保可被執行
- wget -N -P /opt/cni/bin https://github.com/projectcalico/calico-cni/releases/download/v1.4.2/calico
- wget -N -P /opt/cni/bin https://github.com/projectcalico/calico-cni/releases/download/v1.4.2/calico-ipam
- chmod +x /opt/cni/bin/calico /opt/cni/bin/calico-ipam
推薦作為kubelet工作過程的一部分
calico cni插件需要一個標准的cni配置文件,policy部分只有當你為networkpolicy部署calico/kube-policy-controller時被需要
- mkdir -p /etc/cni/net.d
- cat >/etc/cni/net.d/10-calico.conf <<EOF
- {
- "name": "calico-k8s-network",
- "type": "calico",
- "etcd_endpoints": "http://<ETCD_IP>:<ETCD_PORT>",
- "log_level": "info",
- "ipam": {
- "type": "calico-ipam"
- },
- "policy": {
- "type": "k8s"
- }
- }
- EOF
替換<ETCD_IP>:<ETCD_PORT>為你自己的配置
查看配置指南獲取更多關於calico cni的信息
3.部署calico網絡控制器
calico/kube-policy-controller實現了k8s networkpolicy api通過k8s api監聽pod,namespace,networkpolicy事件從而做出對應的時間相應,通過rs運行為一個單獨的pod
安裝policy controller:
修改<ETCD_ENDPOINTS>配置項
安裝kubectl
- $ kubectl create -f policy-controller.yaml
一段時間后,你應該可以看到policy controller已經處於運行狀態
- $ kubectl get pods --namespace=kube-system
- NAME READY STATUS RESTARTS AGE
- calico-policy-controller 2/2 Running 0 1m
kubernetes-hosted安裝
使用k8s安裝calico的方式只使用於v1.4.0以上版本,目前處於試驗階段
在使用k8s安裝calico的方式之前,你必須有一個標准的使用cni網絡的k8s集群,有很多方式實現,不過在這里我們不會都覆蓋,必須滿足安裝calico需要的配置
下載calico self-hosted mainifest文件,calico.yaml
編輯configmap用於配置calico的deployment,然后通過k8s安裝mainifest
- kubectl create -f calico.yaml
在kube-system namespace中你可以看到calico服務啟動
查看 self-hosted文檔獲取更多信息
配置k8s
1.配置kubelet
需要配置kubelet 讓pod啟動時使用calico網絡插件,kubelet可以配置使用calico在啟動時配置參數:
- --network-plugin=cni
- --network-plugin-dir=/etc/cni/net.d
查看kubelet文檔獲取更多信息
kubelet.service單元配置文件示例:
- [Unit]
- Description=Kubernetes Kubelet
- Documentation=https://github.com/kubernetes/kubernetes
- After=calico-node.service
- Requires=calico-node.service
- [Service]
- ExecStartPre=/usr/bin/wget -N -P /opt/bin https://storage.googleapis.com/kubernetes-release/release/v1.4.0/bin/linux/amd64/kubelet
- ExecStartPre=/usr/bin/chmod +x /opt/bin/kubelet
- ExecStartPre=/usr/bin/wget -N -P /opt/cni/bin https://github.com/projectcalico/calico-cni/releases/download/v1.4.2/calico
- ExecStartPre=/usr/bin/chmod +x /opt/cni/bin/calico
- ExecStartPre=/usr/bin/wget -N -P /opt/cni/bin https://github.com/projectcalico/calico-cni/releases/download/v1.4.2/calico-ipam
- ExecStartPre=/usr/bin/chmod +x /opt/cni/bin/calico-ipam
- ExecStart=/opt/bin/kubelet \
- --address=0.0.0.0 \
- --allow-privileged=true \
- --cluster-dns=10.100.0.10 \
- --cluster-domain=cluster.local \
- --config=/etc/kubernetes/manifests \
- --hostname-override=$private_ipv4 \
- --api-servers=http://<API SERVER IP>:8080 \
- --network-plugin-dir=/etc/cni/net.d \
- --network-plugin=cni \
- --logtostderr=true
- Restart=always
- RestartSec=10
- [Install]
- WantedBy=multi-user.target
確保kubelet和calico插件二進制文件存在
配置kube-proxy
為了使calico policy與k8s結合,kube-peoxy成員必須配置脫離自身綁定網卡源地址(nat轉發),在v1.1.0被支持,v1.2.0作為默認啟動模式
強烈建議使用最新文檔版本,若為舊版本有兩種方式啟用:
1.--proxy-mode=iptables
2.annotations api:net.experimental.kubernetes.io/proxy-mode啟動iptables
查看kube-proxy文檔獲取更多信息