Build Kubernetes cluster on AWS

Posted by Chris Qiqiang(ECNU) on 2018-09-30

因为实验原因需要搭设一个简单的kubernetes集群,实现分布式TensorFlow的运行。踩了不少的坑,下面说一下自己的一些总结。
kubernetes集群分为master节点和n个node节点,master上运行的服务有kube-apiserver、kube-controllermanager、kube-scheduler,作用不作赘诉,node运行的服务是kubelet、kube-proxy。要安装kubernetes,首先要搭建etcd集群,而后在每个机器上安装完整的kubernetes或者相应的服务,修改配置文件使得kubernetes集群初步建成。然后利用flannel这个工具将集群内部网络打通,最后运行一个kube-dns的服务提供集群内部dns解析的工作。
官方有搭建过程的资料,不过没什么可读性,网上有很多搭建教程博客,自己试过几个,出现bug是难免的,有时候真的挺难找到问题所在,尤其是运行dns的时候。主要原因是kubernetes版本,导入的镜像版本不尽相同。dns部分网上很多教程还是在装skydns,自从kubernetes1.4之后好像就变成了kubedns+dnsmasq的组合,而且网上的博客如果强行几个凑一起,会出现一些意料以外的错误。自己遇到很多坑,装了好几遍,在kubernetes中文社区找到了一个良心博客。网址:
https://www.kubernetes.org.cn/4041.html
下面说一下我的安装步骤,大致和这个社区帖相同,主要步骤是按照上面的方法走(因为自己是个小萌新,会补上一点对萌新不友好的小疏漏):

准备工具

从百度云上下载压缩包(整体来说这个压缩包包含了搭建kubernetes集群的所有必须文件)之后,如果是搭建本地集群直接u盘拷就行了,如果是云端机器的话需要用到xshell+xftp整合版,软件装好可能会缺相应的dll和vc的两个库,
https://www.portablesoft.org/xshell-xftp-integrated/。
装好之后,通过ssh连接机器,利用xftp可以直接将本地文件夹复制到云端机器上。集群内的所有的机器都需要复制。

安装

也许很多博客上的第一步就是修改hosts文件,虽然这样是为了集群节点看起来比较清晰,但是相信我,没什么用,自己做实验集群小的时候没什么卵用,如果设置不当在你之后配置文件运行程序的时候会出现预料之外的bug。所以在安装过程中就按刚才说的那个博客上的步骤,所有地方都用ipv4的地址。以下是一些注意点。
(1)tar -xzvf k8s_v1.10.0_install.tar.gz #解压
(2)cd /home/centos/k8s_v1.10.0_install/etcd #进入etcd文件夹
(3)编辑install_etcd.sh,将其中的CURRENT_HOST_IP=ifconfig ens192 | grep 'inet ' | awk '{ print $2}' 以及ETCD_LISTEN_IP 修改为每个机器对应的ip(源文件的最外层引号不能用的)保存。三个机器同时运行install_etcd.sh。
(4)此时etcdctl member list是行不通的,因为bash没有这个命令,但是systemctl status etcd是active的,进入bin目录,执行./etcdctl member list 发现是没问题的,所以只是没加进环境变量而已。修改环境变量:
vim /etc/profile或者vim ~/.bashrc
在结尾处加上export PATH=$PATH:your_etcd_bin_path
(5)安装flannel和docker不需要修改install_xx.sh文件,如果机器特殊可能需要修改。直接运行即可,安装kubernetes时,node节点跟的参数也是主节点的ip,别搞错了。安装完了同样是找不到kubectl命令,这时同(4)一样将kubernetes/bin加入环境变量即可。
(6)在node上,进入kubernetes/images文件夹,利用docker load -i xxx.tar命令将其所有镜像到本地。虽然我们的机器可以联网,但是人家配置文件上写的都是本地的镜像,改起来比较麻烦,就直接load本地就行了,方便。
(7) 在master上,进入addons/kube-dns,修改yaml文件中的kube-master-url 为我们master的ip地址,cluster-ip没必要改。然后kubectl create -f kube-dns.yaml。利用kubectl get pods --all-namespces查看pod是否正常运行。如何status为running,
(8) 为了验证我们的dns有解析功能,需要busybox工具,可以进入kubernetes/image文件夹,创建他给的pod,也可以自己网上查一个简单的busybox。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: default
spec:
containers:
- image: kube-registry:5000/busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always

好了,接下来就是检测了,kubectl exec busybox -- nslookup kubernetes,如果解析出来,就代表成功了。
kube-dns检测
因为我用的是亚马逊上的机器,所以dashboard没啥用就不装了。最后可以使用iptables -P FORWARD ACCEPT将底层防火墙关掉,这个其实挺有用的,自行体会~每个人装的时候都会碰到不一样的问题,可以通过kubectl status/logs等命令查看错误原因,再多回顾一下是不是自己漏了什么。祝好~

注意事项:

不要因为机器上有了docker就不装docker了,我有一次没有装包里的docker就导致了版本的不兼容,机器上跑的是18.06,而他给的是docker18.03版本的安装包,最好按照本文顺序一步一步来。所以如果出现意料之外的问题,重装可能比找bug会更容易解决问题。

附:给几个比较实用的链接:

https://blog.csdn.net/devopser/article/details/79953440

http://docs.kubernetes.org.cn/683.html

https://blog.csdn.net/hxpjava1/article/details/79270473