搭建一個(gè)kubernetes集群對(duì)于新手來(lái)說(shuō)比較困惑,感覺(jué)很難入手,雖然kubernetes官方提供了minikube
來(lái)快速搭建一個(gè)單機(jī)版的集群冗荸。希望這篇文章對(duì)你有所幫助禀梳,本文描述了kubernetes的編譯和多節(jié)點(diǎn)集群的搭建步驟基于ubuntu14.04 x86系統(tǒng)杜窄,為了方便,kubernetes的各個(gè)組件是運(yùn)行在docker容器中的算途。
搭建集群需要提前安裝好docker, etcd, Go(編譯使用)
1)安裝docker的步驟略過(guò)塞耕,網(wǎng)上資料很多。
2)安裝Go的步驟也略過(guò)吧:)
3)編譯kubernetes:
從github上clone源碼到你的GOPATH目錄下的src/k8s.io(需要提前創(chuàng)建)目錄下郊艘,
git clone https://github.com/kubernetes/kubernetes.git
然后cd
到kubernetes
目錄下荷科,首先下載編譯需要的第三方包(注意這里會(huì)有坑,你懂的纱注,如果下載不下來(lái)畏浆,那就自行百度吧,我是不是該把那些包也貼出來(lái)狞贱, 哈哈刻获。。瞎嬉。)蝎毡,然后直接make
編譯就好厚柳。
cd kubernetes
go get ./...
make build
大約5分鐘編譯完成,這時(shí)ls
一下會(huì)發(fā)現(xiàn)多了一個(gè)_output
目錄沐兵,對(duì)别垮,我們要的就是它,這些個(gè)二進(jìn)制文件扎谎。進(jìn)入_output/bin
目錄碳想,找到hyperkube
這個(gè)二進(jìn)制文件(這個(gè)二進(jìn)制文件包含了kubernetes各個(gè)組件的可執(zhí)行文件,有它就足夠了)毁靶,完成胧奔。
我們找到了二進(jìn)制文件,可是如何讓它們?cè)谌萜髦羞\(yùn)行呢预吆?不用擔(dān)心龙填,kubernetes已經(jīng)提供編譯hyperkube
鏡像的文件,還有etcd
的拐叉,下面會(huì)講到岩遗。
編譯hyperkube
鏡像:
在kubernetes
目錄下有個(gè)cluster
文件夾,然后你會(huì)發(fā)現(xiàn)它下面還有個(gè)images
巷嚣,對(duì)喘先,你猜對(duì)了,就在這里:
cluster/images/hyperkube
make build VERSION=xxx ARCH=amd64
編譯完成后廷粒,你會(huì)發(fā)現(xiàn)你的docker images
里有了hyperkube
鏡像窘拯。
同理,編譯etcd
:
cd cluster/images/etcd
make build ARCH=amd64
4)到此坝茎,所需的組件已經(jīng)準(zhǔn)備好涤姊,我們開始搭建多節(jié)點(diǎn)的集群,多節(jié)點(diǎn)跨主機(jī)嗤放,主要需要注意網(wǎng)絡(luò)那一塊思喊,kubernetes
的集群是扁平管理的,就是說(shuō)在不同節(jié)點(diǎn)上的容器可以相互ping
通次酌。我用的是flannel
恨课,關(guān)于flannel
的安裝和使用,請(qǐng)參考后續(xù)章節(jié)岳服。
下面貼出主要的組件配置剂公,僅供參考。hostIP
表示master所在主機(jī)的IP吊宋,xxx:xx
表示你編譯好的hyperkube
鏡像纲辽,
首先啟動(dòng)etcd
docker run -d -p 4001:4001 -v /var/etcd/data:/var/etcd/data -name etcd xxx:xx etcd \
-name etcd0 -data-dir /var/etcd/data -advertise-client-urls hostIP:4001 -listen-client-urls http://0.0.0.0:4001 -initial-advertise-peer-urls hostIP:2380 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster-1 -initial-cluster etcd0=hostIP:2380 -initial-cluster-state new
master節(jié)點(diǎn):
docker run -d -p 8443:8443 -v /etc/kubernetes:/etc/kubernetes (CA證書目錄) -name apiserver xxx:xx /hyperkube apiserver --bind-address=0.0.0.0
--insecure-bind-address=127.0.0.1
--etcd-servers=hostIP:4001
--allow-privileged=true
--service-cluster-ip-range=10.10.10.0/24
--secure-port=8443
--insecure-port=8080
--advertise-address=hostIP
--tls-cert-file=/etc/kubernetes/cert/apiserver.pem
--tls-private-key-file=/etc/kubernetes/cert/apiserver-key.pem
--client-ca-file=/etc/kubernetes/cert/ca.pem
--admission-control=LimitRanger,NamespaceLifecycle,ServiceAccount,ResourceQuota
--v=2
docker run -d -v /etc/kubernetes:/etc/kubernetes -name controller-manager xxx:xx /hyperkube controller-manager --kubeconfig=/etc/kubernetes/controller-manager-kubeconfig
--service-account-private-key-file=/etc/kubernetes/cert/apiserver-key.pem
--root-ca-file=/etc/kubernetes/cert/ca.pem
--v=2
docker run -d -v /etc/kubernetes:/etc/kubernetes -name scheduler xxx:xx /hyperkube scheduler
--kubeconfig=/etc/kubernetes/scheduler-kubeconfig
--master=hostIP:443
--cluster-dns=10.10.10.10
--cluster-domain=cluster.local
--v=6
minion節(jié)點(diǎn):
docker run -d -v /etc/kubernetes:/etc/kubernetes -name kubelet xxx:xx /hyperkube kubelet
--api-servers=hostIP:443
--allow-privileged=true
--cluster-dns=10.10.10.10
--cluster-domain=cluster.local
--config=/etc/kubernetes/manifests
--kubeconfig=/etc/kubernetes/kubelet-kubeconfig
--v=2
--file-check-frequency=5s
--hostname-override=所在主機(jī)IP
--pod-infra-container-image=就是google的pause鏡像
--tls-cert-file=/etc/kubernetes/cert/kubelet.pem
--tls-private-key-file=/etc/kubernetes/cert/kubelet-key.pem
--logtostderr=false
--log_dir=/var/log/kubernetes
docker run -d -v /etc/kubernetes:/etc/kubernetes -name kube-proxy xxx:xx /hyperkube proxy --master=hostIP:443
--kubeconfig=/etc/kubernetes/kubelet-kubeconfig
--proxy-mode=userspace
這里還需要一個(gè)kube-dns
插件,在早期的kubernetes版本中是提供了啟動(dòng)DNS
的yaml
文件的(等找到后再貼出來(lái)吧),直接使用kubectl create -f xxx.yaml
命令就可以啟動(dòng)拖吼。
關(guān)于kubelet-kubeconfig 鳞上、scheduler-kubeconfig 、controller-manager-kubeconfig 是service account, 其中kubelet-kubeconfig配置如下:
current-context: service-account-context
apiVersion: v1
kind: Config
contexts:
- context:
cluster: local
user: kubelet
namespace: default
name: service-account-context
clusters:
- name: local
cluster:
certificate-authority: /etc/kubernetes/cert/ca.pem
apiVersion: v1
server: hostIP:443
users:
- name: kubelet
user:
client-certificate: /etc/kubernetes/cert/kubelet.pem
client-key: /etc/kubernetes/cert/kubelet-key.pem