搭建一个kubernetes集群对于新手来说比较困惑,感觉很难入手,虽然kubernetes官方提供了minikube
来快速搭建一个单机版的集群。希望这篇文章对你有所帮助,本文描述了kubernetes的编译和多节点集群的搭建步骤基于ubuntu14.04 x86系统,为了方便,kubernetes的各个组件是运行在docker容器中的。
搭建集群需要提前安装好docker, etcd, Go(编译使用)
1)安装docker的步骤略过,网上资料很多。
2)安装Go的步骤也略过吧:)
3)编译kubernetes:
从github上clone源码到你的GOPATH目录下的src/k8s.io(需要提前创建)目录下,
git clone https://github.com/kubernetes/kubernetes.git
然后cd
到kubernetes
目录下,首先下载编译需要的第三方包(注意这里会有坑,你懂的,如果下载不下来,那就自行百度吧,我是不是该把那些包也贴出来, 哈哈。。。),然后直接make
编译就好。
cd kubernetes go get ./... make build
大约5分钟编译完成,这时ls
一下会发现多了一个_output
目录,对,我们要的就是它,这些个二进制文件。进入_output/bin
目录,找到hyperkube
这个二进制文件(这个二进制文件包含了kubernetes各个组件的可执行文件,有它就足够了),完成。
我们找到了二进制文件,可是如何让它们在容器中运行呢?不用担心,kubernetes已经提供编译hyperkube
镜像的文件,还有etcd
的,下面会讲到。
编译hyperkube
镜像:
在kubernetes
目录下有个cluster
文件夹,然后你会发现它下面还有个images
,对,你猜对了,就在这里:
cluster/images/hyperkube make build VERSION=xxx ARCH=amd64
编译完成后,你会发现你的docker images
里有了hyperkube
镜像。
同理,编译etcd
:
cd cluster/images/etcd make build ARCH=amd64
4)到此,所需的组件已经准备好,我们开始搭建多节点的集群,多节点跨主机,主要需要注意网络那一块,kubernetes
的集群是扁平管理的,就是说在不同节点上的容器可以相互ping
通。我用的是flannel
,关于flannel
的安装和使用,请参考后续章节。
下面贴出主要的组件配置,仅供参考。hostIP
表示master所在主机的IP,xxx:xx
表示你编译好的hyperkube
镜像,
首先启动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节点:
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=2docker 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=2docker 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节点:
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=所在主机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
这里还需要一个kube-dns
插件,在早期的kubernetes版本中是提供了启动DNS
的yaml
文件的(等找到后再贴出来吧),直接使用kubectl create -f xxx.yaml
命令就可以启动。
关于kubelet-kubeconfig 、scheduler-kubeconfig 、controller-manager-kubeconfig 是service account, 其中kubelet-kubeconfig配置如下:
current-context: service-account-contextapiVersion: v1kind: Configcontexts:- context: cluster: local user: kubelet namespace: default name: service-account-contextclusters:- name: local cluster: certificate-authority: /etc/kubernetes/cert/ca.pem apiVersion: v1 server: hostIP:443users:- name: kubelet user: client-certificate: /etc/kubernetes/cert/kubelet.pem client-key: /etc/kubernetes/cert/kubelet-key.pem
作者:Mark_Zhang
链接:https://www.jianshu.com/p/d96c5e6ec93a