Kubernetes和Mesos集成实战部署

Kubernetes是一个跨多个计算节点的管理容器化应用的系统,它提供了一系列基本的功能,如应用的自动化部署,维护和扩展等。Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核。把Kubernetes运行在Mesos集群之上,可以和其他的框架共享集群资源,提高集群资源的利用率。本文是“Kubernetes和Mesos集成指南”系列文章第一篇:实战部署。

现在Kubernetes官方提供的部署基于Mesos的Kubernetes集群的文档相对简单,对于不熟悉Mesos的Kubernetes开发者或者用户来说,按照那个文档提供的说明进行部署,可能会比较困难,并且会遇到一些坑。文本是基于作者长期贡献Mesos和Kubernetes社区的开发经验, 分享给大家实战部署基于Mesos的Kubernetes集群。同时部署Kubernetes附加的一些服务,比如DNS和Dashboard等。

搭建基于Mesos的Kubernetes集群

部署架构

本文笔者将利用三台虚拟机来演示如何部署基于Mesos的Kubernetes集群,各个节点上的集群服务组件如下图所示:

图片描述

另外为了让大家可以尽快体验kubernetes和Mesos最新的特性,以及同时对kubernetes用户和开发者同时具有借鉴意义,我选择最新的社区代码来编译安装基于Mesos的kubernetes集群,如果读者想使用一个稳定的release版本,你可以下载对应的tar包,然后按照相同的步骤进行。

另外因为集群会有多个节点,开发者可能会修改部分源代码,为了在修改了源码之后,使修改可以快速便捷的在所有的机器上生效,我们将在wyq01.ibm.com这个机器上架设NFS服务,把它作为编译的机器,用来编译Mesos和kubernetes源代码。然后将编译的安装包目录 mount到其他的计算节点上。这样在修改了Mesos或者kubernetes的代码之后,只需要在wyq01.ibm.com进行编译然后只需要在另外两台计算节点上重启相应的服务就可以生效。

安装步骤

1.准备环境

准备三台Ubuntu 14.40的环境(物理机和虚拟机都可以),配置DNS或者/etc/hosts文件来保证相互通过机器名可以访问,并且关闭防火墙。

2.在每一个节点上安装Docker

最新版本的kubernetes支持多种容器的运行时,比如Docker,Rocket,CNI等,本文以最主流的Docker最为例子来演示。分别登陆这三台机器,执行以下命令安装Docker:

Client:

Server:

在本演示环境中,笔者安装的是当时最新的docker版本,建议使用最新版本,如果你的机器上已经安装Docker,请检查kubernetes官方文档,查看你安装的Docker是不是符合要求。

另外由于你所在环境的限制,可能需要对Docker配置网络代理才可以在docker hub或者其他仓库中下载镜像:

编辑/etc/default/docker文件,在此文件中添加http_proxy的配置, 如下所示:

3.在master节点上编译 Mesos源代码

Mesos官方目前没有提供Mesos的安装包,需要自己下载源码包进行build。本文以Mesos最新的代码为例进行编译安装, 登陆master节点wyq01.ibm.com执行以下步骤进行编译:

首先需要安装运行 Mesos 必须的第三方软件包:

下载源码包进行编译安装:

编译安装完成之后,就可以在如下目录看到编译之后的二进制包和相关的管理脚本:

我们将用mesos-daemon.sh脚本来启动Mesos服务,之前需要对配置:

编辑/opt/mesosinstall/usr/local/sbin/mesos-daemon.sh文件:

  • 修改prefix变量的值为:/opt/mesosinstall/usr/local
  • 在prefix的下一行添加行:

4.在master节点上编译Kubernetes源代码

登陆master节点wyq01.ibm.com执行以下步骤进行编译:

安装Golang:

由于我们需要在wyq01.ibm.com上编译kubernetes,它是由GO语言编写,所以需要在wyq01.ibm.com上安装Golang来支持kubernetes的编译。

注: 对不同的kubernetes版本,它对golang的版本都有所要求,建议安装前查看官方文档。 本文笔者使用最新的版本:

编辑/etc/profile,添加环境变量:
export PATH=$PATH:/usr/local/go/bin

安装验证:

下载Kubernetes源码,进行编译:

这个编译可能需要几分钟时间,根据你的机器性能而定。编译完成之后,可以在如下目录中看到软件包:

注: 在编译的时候,如果你按照官方的步骤进行编译可能会遇到如下的错误:

现在社区中有一个issue在跟踪这个问题,参见https://github.com/kubernetes/kubernetes/issues/28890
获取详细的解决方案。

5.在master节点上安装NFS

为了节省安装时间,我们不需要在三台机器上分别编译 Mesos,可以直接将build的安装目录拷贝到其他两台机器上即可。但是特别是对于一个Mesos贡献者来说,我们需要定期的和社区最新的代码进行同步和重新build,所以为了避免每次重复的拷贝,我们采用共享文件的方式。

登陆wyq01.ibm.com执行如下命令安装配置NFS:

6.在两台计算节点配置Mesos运行的环境和NFS

登陆wyq02.ibm.com和wyq03.ibm.com,执行如下命令:

在两台计算节点上安装运行Mesos需要的安装包:

Mount Mesos安装目录:

7.启动Mesos集群

登陆wyq01.ibm.com启动Mesos master:

登陆wyq02.ibm.com和wyq03.ibm.com启动Mesos agent:

注意:在kubernetes集成Mesos的环境中,在启动task的时候,Mesos fetcher会首先从Master节点下载kubernetes对应的exectuor km的二进制包,因为这个包相对比较大,当你的网络质量比较差的时候可能会导致下载或者executor接入超时,所以请务必调整如下两个参数:

–registry_fetch_timeout:下载的超时时间,默认为1分钟,建议修改。
–executor_registration_timeout:Mesos executor注册到Mesos Agent的时间,默认为1分钟,建议修改。

验证Mesos集群是否安装成功:打开Mesos portal:

http://wyq01.ibm.com:5050 查看Agents节点的信息。

以上的步骤只是部署了一个非高可用的Mesos集群,如果你想部署一个高可用的Mesos集群,请继续参考如下步骤,如果不需要,请直接到下章节。

因为Mesos高可用集群依赖一个zookeeper集群,所以首先需要安装一个zookeeper集群,本文笔者将以一个节点的zookeeper集群为例,如果你想安装一个多个节点的高可用的zookeeper集群,请参见笔者的纪录:

https://github.com/gradywang/Dockerfiles/tree/master/zookeeper/official

执行如下命令在事先准备好的机器上,部署zookeeper服务,比如也可以是集群的一个机器wyq01.ibm.com:

然后在事先准备好的多个运行Mesos master的机器上,执行以下命令在这些机器上启动Mesos master:

运行以下命令,启动所有的Mesos Agent:

8.在Master节点上启动和配置kubernetes服务

登陆wyq01.ibm.com节点,配置kubernetes管理服务:

  • 设置环境变量:

注意:如果你的kubernetes将运行在一个高可用的Mesos集群上,那么请修改MESOS_MASTER的环境变量,如下:

  • 启动etcd服务:

  • 安装flannel:

在ETCD中配置flannel网络:

  • 配置Docker:

配置DOCKER_OPTS:

  • 启动kubernetes服务:

启动Apiserver:

启动controller manager:

启动scheduler:

查看进程是否启动成功,如果失败,请检查对应的日志:

配置kubectl ~/.kube/config,验证集群是否安装成功

9.在Compute节点上配置kubernetes相关服务

登陆wyq02.ibm.com和wyq03.ibm.com节点,配置kubernetes相关服务:

  • 设置环境变量:

  • 安装flannel:

在Compute几点上安装flannel,可以让kubernetes集群中的不同计算节点上的服务或者POD相互连通:

  • 配置Docker:

配置DOCKER_OPTS:

10.安装部署Kubernetes重要的附加服务

默认情况下,kubernetes不带DNS和Dashboard服务,我们需要在安装完Kubernetes之后另外进行部署。Kubernetes的DNS和Dashboard是以POD的方式运行的,这样的化它们就可以被kubernetes进行管理。

登陆wyq01.ibm.com 节点,安装部署Kubernetes DNS和Dashboard:

安装部署DNS:

创建kubernetes DNS的RC:

编辑/tmp/skydns-rc.yaml文件,为kubernetes DNS容器指定kubernetes master的URL,例如:

创建kubernetes DNS的Service:

安装部署Dashboard:

编辑/tmp/dashboard-controller.yaml文件,为Dashboard容器指定Kubernetes Apiserver的地址,例如:

创建Dashboard的RC:

创建Dashboard的Service:

获取Dashboard的URL进行验证:

访问Kubernetes的Dashboard:http://9.111.255.10:8888/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard 如果页面访问成功,则安装成功。

1 thought on “Kubernetes和Mesos集成实战部署

发表评论

电子邮件地址不会被公开。