Calico在Kubernetes中的搭建

一,需求

Kubernetes官方推薦的是Flannel,可是Flannel是一個overlay的網絡,對性能會有必定的影響。Calico剛好能解決一下overlay網絡的不足。
Calico在Kubernetes上是以plugin的方式運行的,即calico會檢測Kubernetes對於pod或者service的操做,來控制ip的分配和回收。
 

二,準備

主要參考:
 
1,三臺主機:centos
    10.11.151.97 Kubernetes Master
    10.11.151.100 node1
    10.11.151.101 node2
     在/etc/hosts中添加這三臺主機:
     10.11.151.97 tc-151-97
2,Master:
     kube-apiserver
     kube-controller-manager
     kube-scheduler
     etcd
     docker
     calico-node image
 
    Nodes:
      kube-proxy
      kubelet
      docker
      calico-node image
      etcd
      iperf image
      calicoctl (https://github.com/projectcalico/calico-docker/releases)目前最新版本0.12.0
      calico-Kubernetes plugin( https://github.com/projectcalico/calico-kubernetes/releases/tag/v0.6.0)目前最新版本0.6.0
 

三,創建Etcd Cluster

三臺主機創建一個Etcd cluster。在97上運行的腳本爲:
#!/bin/sh
export localip=10.11.151.97
export name=bjcnctest0
export port1=2380
export port2=2379
export port3=4002
 
sudo ./etcd \
-name $name \
-initial-advertise-peer-urls http://$localip:$port1 \
-listen-peer-urls http://0.0.0.0:$port1 \
-listen-client-urls http://0.0.0.0:$port2,http://0.0.0.0:$port3 \
-advertise-client-urls http://$localip:$port2,http://$localip:$port3\
-initial-cluster-token etcd-cluster \
-initial-cluster bjcnctest0=http://$localip:$port1,bjcnctest1=http://10.11.151.100:$port1,bjcnctest2=http://10.11.151.101:$port1 \
-initial-cluster-state new &

三臺主機上分別運行etcd,組建好cluster,正確組建後,每一個主機應該看到published namehtml

 

四,設置Master

運行kube-apiserver:

./kube-apiserver --logtostderr=true --v=0 --etcd_servers=http://127.0.0.1:2379 --kubelet_port=10250 --allow_privileged=false --service-cluster-ip-range=172.16.0.0/12 --insecure-bind-address=0.0.0.0 --insecure-port=8080 2>&1 >apiserver.out &

kube-controller-manager:node

./kube-controller-manager --logtostderr=true --v=0 --master=http://tc-151-97:8080 --cloud-provider="" 2>&1 >controller.out &

kube-scheduler:git

./kube-scheduler --logtostderr=true --v=0 --master=http://tc-151-97:8080 2>&1 > scheduler.out &

在Master上運行Calico服務:github

./calicoctl node --ip=10.11.151.97

用docker ps能夠看到Calico node的containerdocker

Master上的運行比較簡單。
 
五,Nodes
Kubernetes在使用Calico的試試能夠有兩種IP的分配方式,第一種是使用docker網橋ip地址段進行分配,另一種是用Calico IPAM來進行分配。
下面以第一種進行描述:
在10.11.151.100上的操做爲

1,新建一個網橋cbr0:

vi /etc/sysconfig/network-scripts/ifcfg-cbr0
-----------------------
DEVICE=cbr0
TYPE=Bridge
IPADDR=172.1.0.0
NETMASK=255.255.255.0
ONBOOT=yes
BOOTPROTO=static

這裏給出一個ip地址段172.1.0.0/24,每一個主機上可使用256個IP。centos

若是當前主機上已經運行了docker,先中止:systemctl stop docker
從新啓動docker的時候將docker使用本身新建的網橋:
vi /usr/lib/systemd/system/docker.service
在/usr/bin/docker daemon的啓動參數中添加「--bridge=cbr0 --iptables=false --ip-masq=false
儘可能不要影響本來的docker配置。從新開啓docker:systemctl start docker
用ifconfig能夠看到一個cbr0的網絡。
在101主機上換個一個IP段,好比172.1.1.0。

2,運行Calico服務

./calicoctl node --ip=10.11.151.100

3,將calico-kubernetes插件放到kubernetes使用插件的位置,重命名:

mv calico-kubernetes /usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/calico
chmod +x /usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/calico

4,安裝Kubernetes

運行kube-proxy:
KUBE_API_ROOT=http://10.11.151.97:8080/api/v1/ ./kube-proxy --logtostderr=true --v=0 --master=http://tc-151-97:8080 --proxy-mode=iptables &

這裏KUBE_API_ROOT變量會傳遞給Calico,calico能夠經過master的api去獲取當前的pod或者node信息。api

運行kubelet:
CALICO_IPAM=false KUBE_API_ROOT=http://10.11.151.97:8080/api/v1/ ./kubelet --logtostderr=true --v=0 --api_servers=http://tc-151-97:8080 --address=0.0.0.0 --network-plugin=calico --allow_privileged=false --pod-infra-container-image=10.11.150.76:5000/kubernetes/pause:latest > a.txt &

CALICO_IPAM=false是指定Calico的網絡ip分配使用docker的網橋ip地址段,也就上上面咱們本身新建的cbr0的網段。網絡

----------------------------------插入開始------------------------------------------
這裏插入使用另一種IP分配方式的方法
若是CALICO_IPAM設置爲true(calico plugin從0.5.0之後默認爲true)那麼會從calico的pool中去獲取ip地址段。而會忽略docker0的網橋IP設置。
使用命令查看當前有的ip pool:
./calicoctl pool show
用remove命令刪除不用的IP pool,用add的方式添加IP pool。
./calicoctl pool add 172.0.0.0/8 --nat-outgoing
這樣若是使用CALICO_IPAM=true的時候運行kubelet,calico爲pod分配IP會默認從pool中獲取ip,獲取的原則是每一個主機上默認分配一個64大小的IP段,若是這個主機上使用了超過了64個,那麼就會從新找到一個能夠用的64的段。
-------------------------------------插入結束---------------------------------------
這裏--network-plugin=calico指定kubernetes使用calico的網絡,kubelet會去調用 /usr/libexec/kubernetes/kubelet-plugins/net/exec/calico/calico插件,接管kubelet的ip分配任務。
能夠在/var/log/calico/kubernetes/calico.log查看calico插件的日誌,看看是否是異常。
到此,NODE的配置建立成功。
在101上一樣配置一下kubernetes。
 

六,測試一下

咱們循環建立1個pod在100上,1個pod在101上:
test.yaml:
apiVersion: v1
kind: ReplicationController
metadata:
name: test-5
spec:
replicas: 1
template:
metadata:
labels:
app: test-5
spec:
containers:
- name: iperf
image: 10.11.150.76:5000/openxxs/iperf:1.2
nodeSelector:
kubernetes.io/hostname: tc-151-100

在master上:app

./kubelet create -f test.yaml
在101上建立只須要把hostname改成tc-151-101。
建立完成後,使用./calicoctl endpoint show --detailed查看IP分配和endpoint狀況,看看IP分配是否成功。
或者直接docker ps查看建立出來的container ID,exec進去,ip addr show看一下ip,而後ping 101上的container看看是否是成功的。

建立多點Pods吧:

test2.yaml:
apiVersion: v1
kind: ReplicationController
metadata:
name: test-5
spec:
replicas: 70
template:
metadata:
labels:
app: test-5
spec:
containers:
- name: iperf
image: 10.11.150.76:5000/openxxs/iperf:1.2
nodeSelector:
kubernetes.io/hostname: tc-151-100

這裏咱們在100主機上建立70個iperf的pods。ide

但是!
咱們發現竟然只有40啓動起來了!另外的30個資源分配失敗。查找緣由發現,kubelet默認只能最多建立40個pods。咱們將kubelet重啓,加上參數--max-pods=200,將最大pods數量設置爲200。從新建立,70pods均建立成功。
相關文章
相關標籤/搜索