kubernetes 1.4 集群搭建

距离 kubernetes 1.4 发布已经有段时间,1.4 版本新增了很多新特性,其中一个比较实用的功能就是增加了集群的快速创建,基本只需要 2 条命令就能搭建成功;但由于众所周知的原因(fuck GFW),导致 kuadm 命令无法工作,以下记录了一下解决方案

一、环境准备

基本环境为 3 台虚拟机,虚拟机信息如下

IP 地址节点
192.168.1.107master
192.168.1.126node1
192.168.1.217node2

1.1、安装 docker

docker 这里使用的是 1.12.1 版本,安装直接根据官方教程来,如果网速较慢可切换国内源,如清华大 docker 源,具体请 Google

1
2
3
4
5
6
7
8
9
10
11
12
13
14
tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum install docker-engine -y

systemctl enable docker
systemctl start docker
systemctl status docker

1.2、修改主机名

由于 3 台虚拟机是从一个基础虚拟机复制而来,为了不影响 kubectl get nodes 查询,需要更改 3 台虚拟机的主机名,以下为 master 节点示例,其他节点对应修改即可

1
2
3
4
5
6
7
8
9
echo "master" > /etc/hostname
# 替换一下 hosts 中的 localhost 等
vim /etc/hosts
# 修改后内容如下
127.0.0.1 master
::1 master
192.168.1.107 master
192.168.1.126 node1
192.168.1.217 node2

二、搭建 kubernetes 集群

2.1、安装基本组件

根据 官方文档教程 需要先安装 kubeletkubeadmkubectlkubernetes-cni 这四个 rpm 包,但是由于 GFW 原因实际上 Google 的 rpm 源无法下载,以下是我通过梯子下载到本地的,rpm 下载方法 可借助 yumdownloader 工具,具体请 Google

1
2
3
4
5
6
7
8
9
10
11
12
# 首先安装 socat
yum install -y socat
# 然后下载相关 rpm,我已经放到了 cdn 里
rpms=(5ce829590fb4d5c860b80e73d4483b8545496a13f68ff3033ba76fa72632a3b6-kubernetes-cni-0.3.0.1-0.07a8a2.x86_64.rpm \
bbad6f8b76467d0a5c40fe0f5a1d92500baef49dedff2944e317936b110524eb-kubeadm-1.5.0-0.alpha.0.1534.gcf7301f.x86_64.rpm \
c37966352c9d394bf2cc1f755938dfb679aa45ac866d3eb1775d9c9b87d5e177-kubelet-1.4.0-0.x86_64.rpm \
fac5b4cd036d76764306bd1df7258394b200be4c11f4e3fdd100bfb25a403ed4-kubectl-1.4.0-0.x86_64.rpm)
for rpmName in ${rpms[@]}; do
wget http://upyun.mritd.me/kubernetes/$rpmName
done
# 最后安装即可
rpm -ivh *.rpm

2.2、启动相关组件

接下来启动 docker 和 kubelet

1
2
3
4
systemctl enable docker
systemctl enable kubelet
systemctl start docker
systemctl start kubelet

此时查看 kubelet 其实是启动失败的,因为缺少相关配置,以下一部部署以后便会自动重启成功

在正式使用 kubeadm 创建集群以前还需要关闭 selinux,在下一个版本这个问题已经被解决

1
2
# 关闭 selinux
setenforce 0

2.3、导入相关 image

kubeadm 会 pull 相关的 image,由于 GFW 的原因会造成无法下载最终失败,所以最好的办法是先用梯子 pull 下来,再 load 进去即可,以下为需要 load 进的镜像

镜像名称版本号
gcr.io/google_containers/kube-proxy-amd64v1.4.0
gcr.io/google_containers/kube-discovery-amd641.0
gcr.io/google_containers/kubedns-amd641.7
gcr.io/google_containers/kube-scheduler-amd64v1.4.0
gcr.io/google_containers/kube-controller-manager-amd64v1.4.0
gcr.io/google_containers/kube-apiserver-amd64v1.4.0
gcr.io/google_containers/etcd-amd642.2.5
gcr.io/google_containers/kube-dnsmasq-amd641.3
gcr.io/google_containers/exechealthz-amd641.1
gcr.io/google_containers/pause-amd643.0

实际上不用梯子可以借助于 DockerHub 的自动构建功能,实现代理下载,如下所示

1
2
3
4
5
6
images=(kube-proxy-amd64:v1.4.0 kube-discovery-amd64:1.0 kubedns-amd64:1.7 kube-scheduler-amd64:v1.4.0 kube-controller-manager-amd64:v1.4.0 kube-apiserver-amd64:v1.4.0 etcd-amd64:2.2.5 kube-dnsmasq-amd64:1.3 exechealthz-amd64:1.1 pause-amd64:3.0 kubernetes-dashboard-amd64:v1.4.0)
for imageName in ${images[@]} ; do
docker pull mritd/$imageName
docker tag mritd/$imageName gcr.io/google_containers/$imageName
docker rmi mritd/$imageName
done

2.4、创建集群

首先在 master 上执行 init 操作

1
kubeadm init --api-advertise-addresses=192.168.1.107

此时显示信息如下表示创建完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
➜  ~ kubeadm init --api-advertise-addresses=192.168.1.107
<master/tokens> generated token: "42354d.e1fb733ed0c9a932"
<master/pki> created keys and certificates in "/etc/kubernetes/pki"
<util/kubeconfig> created "/etc/kubernetes/kubelet.conf"
<util/kubeconfig> created "/etc/kubernetes/admin.conf"
<master/apiclient> created API client configuration
<master/apiclient> created API client, waiting for the control plane to become ready
<master/apiclient> all control plane components are healthy after 18.921781 seconds
<master/apiclient> waiting for at least one node to register and become ready
<master/apiclient> first node is ready after 2.014976 seconds
<master/discovery> created essential addon: kube-discovery, waiting for it to become ready
<master/discovery> kube-discovery is ready after 3.505092 seconds
<master/addons> created essential addon: kube-proxy
<master/addons> created essential addon: kube-dns

Kubernetes master initialised successfully!

You can now join any number of machines by running the following on each node:

kubeadm join --token 42354d.e1fb733ed0c9a932 192.168.1.107

然后在子节点上使用 join 命令加入集群即可

1
kubeadm join --token 42354d.e1fb733ed0c9a932 192.168.1.107

最后稍等片刻在 master 上 get nodes 即可查看,如果想让 master 也运行 pod,只需在 master 上运行 kubectl taint nodes --all dedicated- 即可

1
2
3
4
5
➜  ~ kubectl get nodes                                   
NAME STATUS AGE
master Ready 1m
node1 Ready 1m
node2 Ready 1m

2.5、创建 Pod 网络

创建好集群后,为了能让容器进行跨主机通讯还要部署 Pod 网络,这里使用官方推荐的 weave 方式,也可以采用 flannel,以下为 weave 示例

1
2
# 在 master 上执行
kubectl apply -f https://git.io/weave-kube

到此搭建完成

本文参考 来自天国的 kubernetesInstalling Kubernetes on Linux with kubeadm


本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 国际许可协议进行许可,转载请注明出处。