本文介绍了一次在家庭局域网中完整部署容器编排平台Kubernetes的经验,作者主要是闲的没事做,欢迎跟我一样闲的没事的技术宅学习交流。
前阵子没忍住AMD的诱惑,装了台ThreadRipper的机器用来…hmmm…学习(打游戏也是种学习好嘛!),原来的一台PC便闲置下来。作者寻思着,这当二手机器卖了也卖不了多少钱,索性把它装成一台家庭服务器再利用一阵子吧。
正巧,最近有用到容器编排解决方案Kubernetes的需要。Kubernetes需要的资源不少,在本地运行一个阉割版既没意思又耗内存,而部署在公有云上实在是用不起,如果能在一台家用机上运行整个Kubernetes集群,那倒是省下不少钱。
小科普 - Kubernetes
Kubernetes是一个用于容器集群的自动化部署、扩容以及运维的开源平台。项目始于2014年,已经迅速成长为目前容器编排方面的行业标准。
配置
因为本来的显卡被装进新机器里去了,这台机器成了无头机(headless),只得去店里买了张最最便宜的能支持hdmi的PCI-E显卡。再翻箱倒柜把能用上的闲置内存条也拿出来。最后配出一台:
做服务器是有点浪费了,小小罪恶一下,嘿嘿。另外,显卡其实只在安装主机操作系统的时候用过,后期操作都是从作者的macbook pro上ssh进行。
准备
前期已经在机器上装好了Ubuntu Server 16.04 LTS系统(这里不再重复安装过程了,有需要了解的同学可以私信)。安装完成后,主机获得了的地址,用户名为。
首先,在本地打开终端,ssh进入同处本地网络上的主机:
更新一下apt所安装的软件:
我们需要安装如下软件:
zfs
zfs是一个文件系统和逻辑卷的管理软件,我们会用它来管理主机上的数据,并将它创建的逻辑卷映射给Kubernetes所运行的容器。
juju
juju是Canonical公司开发的应用部署配置软件,它可以大大简化在安装过程中配置Kubernetes运行容器的复杂程度。
conjure-up
conjure-up是一个安装大型软件的工具(例如OpenStack, Hadoop),它会配合juju一起安装Kubernetes
lxd
lxd是一个轻量级的linux容器技术,可以说是大名鼎鼎的docker软件的前身,我们所安装的Kubernetes的各个组件都会作为lxd容器运行在主机上。日后需要删除Kubernetes安装的时候,只需要删除这些容器就好了。
安装完成后,主要软件具有版本:
配置LXD
在安装Kubernetes之前,我们需要配置一下lxd容器环境。
在这里会被问以下几个问题:
回答yes,我们需要lxd生成一个存储池
直接回车,或者也可以输入你想要的存储池名称,本文将沿用默认名default
直接回车,我们将使用zfs来管理文件和逻辑卷。如果安装程序在这里没有给出zfs的选项,请确保主机上已经装有zfs,并且可执行路径已经存在PATH上。
直接回车,我们需要zfs新建一个数据池
在这里作者回答了yes,原因是作者要把数据池放在2TB的副硬盘上。如果选择no,安装程序将在本地硬盘上创建文件。
在这里作者回答了/dev/sdb。此处答案根据实际环境而异,如果上题回答了no,则本题不会出现。
直接回车,我们只有一台物理机。
直接回车,过期的镜像将自动更新,没什么不好的,这题不是很重要。
直接回车,我们需要软件帮我们创建一个网桥,这个网桥将桥接各个容器的虚拟网口,并确保容器可以访问外网。
直接回车,或者输入你想要的网桥名称。本文将沿用默认名lxdbr0
直接回车,让软件分配。
必须回答none,conjure-up目前无法处理ipv6,如果分配了ipv6,安装将无法继续。
安装Kubernetes
至此,我们可以开始安装Kubernetes!启动conjue-up
你将会看到如下的屏幕。
选择Canonical Distribution of Kubernetes继续,这个版本是Kubernetes发布的上游版本,没有经过任何下游的经销商修改,是最原本的发行版本。
在这里选择需要的add-on,作者选择了Helm。Helm是一个简化在Kubernetes上软件发布的工具,用户不需要再管理繁多的配置文件,只需敲一行命令就可以部署一个系统。
在这里选择需要部署的环境,因为是在本地部署,所以选择localhost。
选择网桥接口和存储池,因为刚才lxd初始化过程中作者选择了default作为存储池名称、lxdbr0作为网桥名称,所以在这里选择如上。如果刚才输入了别的名称,请在这里选择。
在这里会显示所有要安装的容器,并作出一定配置。作者作出了两个改动:
- 将默认的kubernetes-worker数量从3改到了5。
- 在kubernetes-master里设置了client password,方便以后从kubernetes dashboard直接登陆。
上一步配置完成后,系统将进入bootstrap阶段。从这里开始将要花很长的时间,且(除非安装失败)不需要人工干预。可以去喝杯咖啡了。
bootstrap阶段完成后,系统开始启动各个容器的安装过程。
安装结束后,系统会显示Kubernetes集群的基本信息。作者的安装信息如下:
安装程序已经把kubeConfig配置到了本地,并在本地安装kubectl工具。所在如果没有记录下以上信息,仍然可以通过获取。
配置网络
到此位置,Kubernetes集群已经在主机本地的lxd容器中运行了,我们也可以在主机上通过kubectl来使用集群。但是我们并不能通过家中的本地网络来访问运行在Kubernetes上的程序,这是因为在集群所在的网段和家中局域网环境的网段不是同一个,服务器在接受访问时不知道如何把数据转送给上的Kubernetes master。
这个问题,我们可以通过设置iptable的路由规则来解决。首先确定已经开启:
然后设置443端口上的路由:
以上设置确保了每次被访问时,服务器总是把数据转发给,这样局域网中的所有设备都可以和Kubernetes集群通讯了。
打开浏览器,访问,我们终于可以访问dashboard了!
配置存储卷
至此我们已经可以在Kubernetes上运行无状态的应用,但对于需要对持久卷写下数据的应用,我们还需要进行最后一部配置。我们将在lxd中创造一个新的卷,将这个卷加载给每个Kubernetes worker所在的lxd容器。最后在Kubernetes中声明Storage Class,Persistent Volume和Persistent Volume Claim。
首先,新建存储卷:
其次,我们要获取每一个Kubernetes worker的lxd实例id,运行,获得下图信息:
通过ip对比,我们可以确定5个Kubernetes worker分别为:
然后,我们将刚才创建好了加载到这些容器上:
下一步,告知Kubernetes相关服务来开启本地存储卷的功能:
最后,我们可以通过Kubernetes来配置StorageClass,PersistentVolume和PersistentVolumeClaim。在这里,附上一些配置的例子:
后记
本次实践证明了在家庭实验室环境或者小型初创企业环境中,在不去购买专业服务器或者云服务的情况下,仅利用民用机来搭建Kubernetes集群是完全可行的。搭建后的集群网络和本地网络是隔离的,即便把机器搬动后分配了新的地址,集群仍能够照常运行(修改一下iptable的路由规则即可)。
当然,这样的集群只适用于实验性目的,并不能胜任生产环境的部署;存储的数据都在单块硬盘上,也没有冗余性可言。但对于爱捣鼓(比如我)或者受经济情况限制(又比如我)但需要Kubernetes集群(再比如我)的同学们来说,还是非常值得推荐的!
参考资料
https://insights.ubuntu.com/2016/11/21/conjure-up-canonical-kubernetes-under-lxd-today/
https://kubernetes.io/docs/getting-started-guides/ubuntu/local/
https://github.com/kubernetes-incubator/external-storage/tree/master/local-volume
https://github.com/juju-solutions/bundle-canonical-kubernetes/wiki/Local-Persistent-Storage-Example
https://www.debuntu.org/how-to-redirecting-network-traffic-to-a-new-ip-using-iptables/
s
领取专属 10元无门槛券
私享最新 技术干货