kubernetes集群部署
鑒于docker如此火爆,Google推出kubernetes管理docker集群,不少人估計會進行嘗試。kubernetes得到了很多大公司的支持,kubernetes集群部署工具也集成了gce,coreos,aws等iaas平臺,部署起來也相當的方便。鑒于網上眾多資料基于的是不少老版本,本篇文章針對最新的kubernetes及其依賴組件的部署簡要闡述。通過本文可以比較粗暴的運行你的kubernetes集群,要優雅還需要更多的工作。部署主要分為三步:
1、準備機器并打通網絡
如果要部署kubernetes集群至少3臺機器,一個作為master兩個作為minion。如果有4臺機器還可以一個作為etcd服務,如果更多可以部署一個etcd集群和更多的minion,這里以4臺機器為例子,這里說的機器可以是物理機也可以是kvm虛擬機。機器列表:
master:10.180.64.6
etcd: 10.180.64.7
minion1:10.180.64.8
minion2:10.180.64.9
至于網絡可以使用flannel,或者openvswitch,這方面的資料網上很多,可以google或者baidu下。
2、部署相關組件
kubernetes安裝主要分成3部分:etcd集群、master節點和minions。
本文為了方便以4臺云主機為例搭建一個kubernetes集群,云主機機器分配如下所示:
ip |
角色 |
10.180.64.6 |
Kubernetes master |
10.180.64.7 |
Etcd node |
10.180.64.8 |
Kubernetes minion1 |
10.180.64.9 |
Kubernetes minion2 |
2.1 etcd集群
本次示例中以一臺云主機作為etcd node,如需etcd集群請參照后續etcd使用介紹進行搭建。
root@cnsdev-paas-master:~# curl -L https://github.com/coreos/etcd/releases/download/v2.0.0-rc.1/etcd-v2.0.0-rc.1-linux-amd64.tar.gz-o etcd-v2.0.0-rc.1-linux-amd64.tar.gz
root@cnsdev-paas-master:~# tar xzvf etcd-v2.0.0-rc.1-linux-amd64.tar.gz
root@cnsdev-paas-master:~# cdetcd-v2.0.0-rc.1-linux-amd64
拷貝etcd下的所有可執行文件到/bin下
2.2. master節點
master節點上只涉及kubernetes安裝,首先下載kubernetes執行以下指令。
root@cnsdev-paas-master:~#wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v0.8.0/kubernetes.tar.gz
root@cnsdev-paas-master:~#tar -zxvfkubernetes.tar.gz
root@cnsdev-paas-master:~#cdkubernetes/server/kubernetes
root@cnsdev-paas-master:~#tar -zxvfkubernetes-server-linux-amd64.tar.gz
root@cnsdev-paas-master:~#cd server/bin
在master節點上將kube-apiserver、kube-controller-manager、kube-scheduler、kubecfg、kubectl拷貝到/bin
2.3. minion節點
minion節點涉及到kubernetes、cadvisor和docker的安裝,master上安裝是已經下載了kubernetes,將解壓出的kubelet和kube-proxy拷貝到所有minion上。
在minion節點上將kubelet、kube-proxy拷貝到/bin。
(ps:拷不拷貝到/bin都無所謂,將這些可執行文件的路徑加到$PATH中可以)
安裝cadvisor:
root@cnsdev-paas-master:wget https://github.com/google/cadvisor/releases/download/0.7.1/cadvisor
直接是可執行文件,不用解壓了,拷貝到/bin下
安裝docker:
在minion上安裝docker,kubernetes會調用docker api創建pod作為worker容器,同時kubernetes本身的agent線程等也可以運行在docker里面,這樣kubernetes升級也會比較容易。
debian 7下安裝docker可以使用ubuntu的源,運行以下指令:
root@cnsdev-paas-master:echo debhttp://get.docker.io/ubuntu docker main | sudo tee/etc/apt/sources.list.d/docker.list
root@cnsdev-paas-master:apt-key adv--keyserver keyserver.ubuntu.com --recv-keys36A1D7869245C8950F966E92D8576A8BA88D21E9
root@cnsdev-paas-master:apt-getupdate
root@cnsdev-paas-master:apt-getinstall -y lxc-docker
運行一下dockerversion看看是否正常。
3、運行kubernetes集群
3.1. kubernetes配置文件
本節涉及的配置文件和在GCE上以及通過yum安裝的kubernetes的配置文件不一定吻合,是全手動安裝的暫時解決方案,如果已經集成到kubernetes項目下的cluster,可以運行kubernetes本身的一鍵部署采用salt部署整個集群,不需要手動操作,所以這里配置文件只適用于尚未被支持的平臺上進行部署。所有需要的配置文件和執行腳本打包為kube-start.tar.gz。
3.1.1. etcd配置文件
etcd配置文件為cfg-etcd:
ETCD_NAME="-nameetcd-1"
etcd節點名稱,如果etcd集群只有一個node,這一項可以注釋不用配置,默認名稱為default,這個名字后面會用到。
ETCD_PEER_ADDRESS="-initial-advertise-peer-urls http://hostip:7001"
etcd集群之間node的通訊地址,一般指定7001或者2380端口,這里etcd node的ip為10.180.64.7,所以這一項配置修改為http://10.180.64.7:7001。
ETCD_CLIENT_ADDRESS="-advertise-client-urls http://hostip:4001"
etcd node對外服務的地址,一般指定4001或者2379端口,這里修改為http://10.180.64.7:4001。
ETCD_DATA_DIR="-data-dir /home/data/etcd"
etcd存儲數據的目錄,自己指定,不同的目錄相同的配置也會導致產生不同的etcd集群。
ETCD_LISTEN_PEER_ADDRESS="-listen-peer-urls http://0.0.0.0:7001"
etcd node監聽的地址,如果為0.0.0.0將會監聽所有接口,這里配置為http://0.0.0.0:7001。
ETCD_LISTEN_CLIENT_ADDRESS="-listen-client-urls http://0.0.0.0:4001"
對外服務監聽地址,配置為http://0.0.0.0:4001。
ETCD_CLUSTER_MEMBERS="-initial-clusteretcd-1=http://ip_etcd-1:7001 etcd-2=http://ip_etcd-2:7001"
etcd集群成員地址的列表,因為為etcd集群內部,所以需指定7001或者2380端口,這里只有一個node,而且沒有配置ETCD_NAME,那么默認名稱為default,這里配置為default=http://10.180.64.7:70001。
ETCD_CLUSTER_STATE="-initial-cluster-statenew"
etcd集群狀態,new表示新建一個集群,existing表示已經存在。
ETCD_ARGS=""
需要額外添加的參數,可以自己添加,etcd的所有參數可以通過etcd -h查看。
3.1.2. kubernetes集群配置文件
cfg-common:
KUBE_ETCD_SERVERS="--etcd_servers=http://10.180.64.7:4001"
etcd服務地址,前面已經啟動了etcd服務,這里配置為http://10.180.64.7:4001。
KUBE_LOGTOSTDERR="--logtostderr=true"
表示錯誤日志記錄到文件還是輸出到stderr。
KUBE_LOG_LEVEL="--v=0"
日志等級。
KUBE_ALLOW_PRIV="--allow_privileged=false"
允許運行特權容器。
3.1.3. apiserver配置文件
cfg-apiserver:
KUBE_API_ADDRESS="--address=0.0.0.0"
監聽的接口,如果配置為127.0.0.1則只監聽localhost,配置為0.0.0.0會監聽所有接口,這里配置為0.0.0.0。
KUBE_API_PORT="--port=8080"
apiserver的監聽端口,默認8080,不用修改。
KUBE_MASTER="--master=10.180.64.6:8080"
apiserver的服務地址,controller-manager、scheduler及kubelet都會用到這個配置,這里配置為10.180.64.6:8080
KUBELET_PORT="--kubelet_port=10250"
minion上kubelet監聽的端口,默認10250,無需修改
KUBE_SERVICE_ADDRESSES="--portal_net=10.254.0.0/16"
kubernetes可以分配的ip的范圍,kubernetes啟動的每一個pod以及serveice都會分配一個ip地址,將從這個范圍分配。
KUBE_API_ARGS=""
需要額外添加的配置項,簡單地啟用一個集群無需配置。
3.1.4. controller配置文件
cfg-controller-manager:
KUBELET_ADDRESSES="--machines=10.180.64.8,10.180.64.9"
kubernetes集群中minion的列表,這里配置為10.180.64.8,10.180.64.9
KUBE_CONTROLLER_MANAGER_ARGS=""
需要額外添加的參數
3.1.5. scheduler配置文件
cfg-schedule:
如果需要額外參數可以自行添加,這里暫時不添加新的參數。
3.1.6. kubelet配置文件
cfg-kubelet:
KUBELET_ADDRESS="--address=10.180.64.8"
minion監聽的地址,每個minion根據實際的ip配置,這里minion1上為10.180.64.8,minion2上為10.180.64.9。
KUBELET_PORT="--port=10250"
監聽端口,不要修改,如果修改,同時需要修改master上配置文件中涉及的配置項。
KUBELET_HOSTNAME="--hostname_override=10.180.64.8"
kubernetes看到的minion的名稱,使用kubecfglist minions時看到的將是這個名稱而不是hostname,設置和ip地址一樣便于識別。
KUBELET_ARGS=""
額外增加的參數
3.1.7. proxy配置文件
cfg-proxy:
如有額外參數自行配置,這里不需要添加。
3.2. kubernetes啟動
將kube-start.tar.gz解壓,拷貝cfg-etcd、kube-etcd到etcd node上,為kube-etcd增加可執行權限。拷貝其中的cfg-common、cfg-apiserver、cfg-controller-manager、cfg-schedule、apiserver、controller、schedule拷貝到master上,為apiserver、controller和schedule增加可執行權限。拷貝cfg-common、cfg-kubelet、cfg-proxy、cadv、kube、proxy到所有minion主機上,同時確保每一個minion的cfg-kubelet修改正確,為cadv、kube、proxy增加可執行權限。
首先在etcd node上運行etcd服務,執行
root@cnsdev-paas-master:./kube-etcd &
檢驗etcd是否正常,在master上執行
root@cnsdev-paas-master:curl -L http://10.180.64.7:4001/version
etcd 2.0.0-rc.1
然后在master上順序執行
root@cnsdev-paas-master:./apiserver&
root@cnsdev-paas-master:./controller &
root@cnsdev-paas-master:./schedule &
最后在所有的節點上順序執行
root@cnsdev-paas-master:./cadv &
root@cnsdev-paas-master:./kube &
root@cnsdev-paas-master:./proxy &
所有組件都運行之后,到master上檢測下狀態。
查看下集群狀況
root@cnsdev-paas-master:~# kubecfg listminions
Minionidentifier Labels
---------- ----------
10.180.64.9
10.180.64.8
可以看出集群中有兩個節點10.180.64.8和10.180.64.9,正是部署的2個節點。
查看當前集群的pod
root@cnsdev-paas-master:~#kubecfg list pods
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
e473c35e-961d-11e4-bc28-fa163e8b5289 dockerfile/redis 10.180.64.9/ name=redisRunning
這里的redis你就當沒看見,如果剛創建的集群這個時候是沒有pod的,當然如果你是在gce或者aws上一鍵創建的,默認可能會看到kubernetes命名的pod,這是默認啟動的狀態監測的東東。
集群已經創建好了,那就來創建個tomcat的replicationController玩玩吧。有多種接口方式可以實現這個,這里選擇json,需要寫一個tomcat-controller.json的文件告訴kubernetes該怎么創建這個controller。當然文件的名字可以隨意點,只要能看懂就行。tomca-controller.json大概長這個樣子:
{
"id":"tomcatController",
"kind":"ReplicationController",
"apiVersion":"v1beta1",
"desiredState": {
"replicas": 2,
"replicaSelector":{"name":"tomcatCluster"},
"podTemplate":{
"desiredState": {
"manifest": {
"version": "v1beta1",
"id": "tomcat",
"containers": [{
"name": "tomcat",
"image":"tutum/tomcat",
"ports":[{
"containerPort":8080,"hostPort":80}
]
}]
}
},
"labels": {"name":"tomcatCluster"}}
},
"labels": {
"name":"tomcatCluster",
}
}
里面各項值的含義看完kubernetes實現分析之后就會明白了。寫好文件之后就讓kubernetes執行吧。
root@cnsdev-paas-master:/home/pod# kubecfg -ctomcat-pod.json create replicationControllers
如果告訴你success,那么可以查看下集群的controller
root@cnsdev-paas-master:/home/pod# kubecfg listreplicationControllers
Name Image(s) Selector Replicas
---------- ---------- ---------- ----------
redisController dockerfile/redis name=redis 1
tomcatController tutum/tomcat name=tomcatCluster 2
請無視redis,這時候看到tomcat的replicationController已經起來了,Replicas=2表示要在集群里面運行2個docker,docker運行的鏡像就是tutum/tomcat了,如果你的minion上面沒有這個鏡像那么kubernetes就要去docker hub上為你下載了,如果本地有這個鏡像那么kubernetes就直接在minion上為你運行2個tomcat的container(pod),來看看這一切是不是真的。
root@cnsdev-paas-master:/home/pod# kubecfg listpods
Name Image(s) Host Labels Status
---------- ---------- ---------- ---------- ----------
643582db-97d1-11e4-aefa-fa163e8b5289 tutum/tomcat 10.180.64.9/ name=tomcatCluster Running
e473c35e-961d-11e4-bc28-fa163e8b5289 dockerfile/redis 10.180.64.9/ name=redis Running
64348fde-97d1-11e4-aefa-fa163e8b5289 tutum/tomcat 10.180.64.8/ name=tomcatCluster Running
更多的使用請看接口章節。