1. 程式人生 > >新增calico到現有的kubernetes叢集中

新增calico到現有的kubernetes叢集中

譯自:http://docs.projectcalico.org/v1.5/getting-started/kubernetes/installation/

要求

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