自己是个小白,因为实验原因需要搭设一个简单的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下面说一下我的安装步骤,大致和这个社区帖相同(因为自己是个小萌新,会补上一点对萌新不友好的小疏漏):
1. 准备工具
从百度云上下载压缩包(整体来说这个压缩包包含了搭建kubernetes集群的所有必须文件)之后,如果是搭建本地集群直接u盘拷就行了,如果是云端机器的话需要用到xshell+xftp整合版,软件装好可能会缺相应的dll和vc的两个库,https://www.portablesoft.org/xshell-xftp-integrated/。装好之后,通过ssh连接机器,利用xftp可以直接将本地文件夹复制到云端机器上。集群内的所有的机器都需要复制。
2. 安装
也许很多博客上的第一步就是修改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 在结尾处加上export PATH=$PATH:/home/centos/k8s_v1.10.0_install/etcd/bin 保存退出后source /etc/profile有效,这下就没问题了。
(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,可以建立一个test.yaml如下:
(8)kubectl create -f test.yaml之后,kubectl get services查看mysql有自己的cluster_ip。为了验证我们的dns有解析功能,需要busybox工具,可以进入kubernetes/image文件夹,创建他给的pod,也可以自己网上查一个简单的busybox。
好了,接下来就是检测了,kubectl exec busybox -- nslookup mysql,如果解析出来,就代表成功了。
因为我用的是亚马逊上的机器,所以dashboard没啥用就不装了。最后可以使用iptables -P FORWARD ACCEPT 将底层防火墙关掉,这个其实挺有用的,自行体会~每个人装的时候都会碰到不一样的问题,可以通过kubectl status/logs等命令查看错误原因,再多回顾一下是不是自己漏了什么。祝好~
附:给几个比较实用的链接:
https://blog.csdn.net/devopser/article/details/79953440
http://docs.kubernetes.org.cn/683.html
https://blog.csdn.net/hxpjava1/article/details/79270473