基于Docker搭建单机版Kuberntes

摘要: 本文介绍了基于Docker搭建单机版Kuberntes的方法,Kubernetes的所有组件均运行于单个容器中。

GitHub地址:

一. Kubernetes简介

2006年,Google工程师Rohit Seth发起了Cgroups内核项目。Cgroups是容器实现CPU,内存等资源隔离的基础,由此可见Google其实很早就开始涉足容器技术。而事实上,Google内部使用容器技术已经长达十年,目前谷歌所有业务包括搜索,Gmail,MapReduce等均运行在容器之中。Google内部使用的集群管理系统–Borg,堪称其容器技术的瑞士军刀。

2014年,Google发起了开源容器集群管理系统–Kubernetes,其设计之初就吸取了Borg的经验和教训,并原生支持了Docker。因此,Kubernetees与较早的集群管理系统Mesos和YARN相比,对容器技术尤其是Docker的支持更加原生,同时提供了更强大的机制实现资源调度,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。

与其他集群系统一致,Kubernetes也采用了Master/Slave结构。下表显示了Kubernetes的各个组件及其功能。

角色组件功能
Masterapiserver提供RESTful接口
Masterscheduler负责调度,将pod分配到Slave节点
Mastercontroller-manager负责Master的其他功能
Masteretde储存配置信息,节点信息,pod信息等
Slavekubelet负责管理Pod、容器和容器镜像
Slaveproxy将访问Service的请求转发给对应的Pod,做一些负载均衡
客户端kubectl命令行工具,向apiserver发起创建Pod等请求

二. kiwenlau/kubernetes镜像简介

下图显示了我在Ubuntu主机上运行单机版Kubernetes的架构。可知,我一共运行了7个容器,分别运行Kubernetes的各个组件。事实上,Kuberenetes未来的开发目标正是将Kubernetes的各个组件运行到容器之中,这样可以方便Kubernetes的部署和升级。现在我将Kubernetes的各个组件全部运行在容器中必然存在很多问题且很多问题是未知的,因此这个项目仅做学习测试而不宜部署到生产环境中。Kubernetes各个组件容器之间的通信通过docker link实现,其中apiserver与ectd的4001端口进行通信,scheduler,controller-manager,kubelet,proxy以及kubectl与apiserver的8080端口进行通信。

集群的大致运行流程是这样的: 用户通过kubectl命令向apiserver发起创建Pod的请求; scheduler将创建Pod的任务分配给kubelet;kubelet中包含了一个docker命令行工具,该工具会向Docker deamon发起创建容器的请求; Docker deamon负责下载镜像然后创建容器。

我将Docker deamon运行在Ubuntu主机上,因此Docker daemon所创建的应用容器与Kubernetes各个组件的容器均运行在Ubuntu主机上。docker socket采用volume的形式挂载到kubelet容器内,因此kubelet中的docker命令行工具可以直接与主机上的Docker daemon进行通信。

我是直接将kubernetes发布的各个组件的二进制可执行文件安装在/usr/local/bin目录下,因此,修改Dockerfile中的Kubernetes下载链接的版本号,就可以快速构建其他版本的Kubernetes镜像。另外,仅需修改网络配置,就可以很方便地在多个节点上部署Kubernetes。

kiwenlau/kubernetes:1.0.7镜像版本信息:

  • ubuntu: 14.04
  • Kubernetes: 1.0.7
  • ectd: 2.2.1

Ubuntu主机版本信息:

  • ubuntu: 14.04.3 LTS
  • kernel: 3.16.0-30-generic
  • docker: 1.9.1

三. 运行步骤

1. 安装Docker

ubuntu 14.04上安装Docker:

curl -fLsS https://get.docker.com/ | sh

其他系统请参考: https://docs.docker.com/

2. 下载Docker镜像

我将kiwenlau/kubernetes:1.07以及其他用到的Docker镜像都放在灵雀云

sudo docker pull index.alauda.cn/kiwenlau/kubernetes:1.0.7
sudo docker pull index.alauda.cn/kiwenlau/etcd:v2.2.1
sudo docker pull index.alauda.cn/kiwenlau/nginx:1.9.7
sudo docker pull index.alauda.cn/kiwenlau/pause:0.8.0

3. 启动Kubernetes

git clone https://github.com/kiwenlau/single-kubernetes-docker
cd single-kubernetes-docker/
sudo chmod +x start-kubernetes-alauda.sh stop-kubernetes.sh
sudo ./start-kubernetes-alauda.sh

运行结束后进入kubectl容器。容器主机名为kubeclt。可以通过”exit”命令退出容器返回到主机,然后可以通过”sudo docker exec -it kubectl bash”命令再次进入kubectl容器。

4. 测试Kubernetes

运行测试脚本,该脚本会启动一个nginx pod。

chmod +x test-kubernetes-alauda.sh
./test-kubernetes-alauda.sh

输出

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

四. 参考

  1. meteorhacks/hyperkube
  2. meteorhacks/kube-init
  3. Kubernetes: The Future of Cloud Hosting
  4. Kubernetes 架构浅析
  5. An Introduction to Kubernetes

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了30亿+错误事件,付费客户有阳光保险、达令家、核桃编程、荔枝FM、微脉等众多品牌企业。欢迎大家免费试用




您的用户遇到BUG了吗?

体验Demo 免费使用