原文地址:http://dockone.io/article/859
基于Docker快速搭建单机版Kuberntes
【编者的话】Google使用容器技术已经长达十年,其在内部采用Borg作为容器集群管理系统。而Kubernetes是Borg的开源版本,它是容器生态系统中非常重要的一环。这篇博客简单介绍了Kuberbetes,并且提供了基于Docker在单机上搭建Kubernetes集群的步骤,可以方便开发者进行学习和测试。
2014年,Google发起了开源容器集群管理系统--Kubernetes,其设计之初就吸取了Borg的经验和教训,并原生支持了Docker。因此,Kubernetees与较早的集群管理系统Mesos和YARN相比,对容器尤其是Docker的支持更加原生,同时提供了更强大的机制实现资源调度,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。
与其他集群系统一致,Kubernetes也采用了Master/Slave结构。下表显示了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主机版本信息:
ubuntu 14.04上安装Docker:
其他系统请参考: https://docs.docker.com/
2. 下载Docker镜像
我将kiwenlau/kubernetes:1.07以及其他用到的Docker镜像都放在 灵雀云
3. 启动Kubernetes
运行结束后进入kubectl容器。容器主机名为kubeclt。可以通过"exit"命令退出容器返回到主机,然后可以通过"sudo docker exec -it kubectl bash"命令再次进入kubectl容器。
4. 测试Kubernetes
运行测试脚本,该脚本会启动一个nginx pod。
输出
5.关闭Kubernetes集群
删除所有pod
退出kubectl容器
删除Kubernetes所有组件的容器
==================================
作者介绍
刘凯(KiwenLau):毕业于中国科学技术大学,目前在日本国立信息学研究所攻读云计算方向的博士学位,近期专注于Docker技术的研究。个人站点: GitHub, 博客
1. 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的各个组件及其功能。
2. 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
3. 运行步骤
1. 安装Dockerubuntu 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.7sudo 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-dockercd 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
输出
5.关闭Kubernetes集群
删除所有pod
kubectl delete pods --all
退出kubectl容器
exit
删除Kubernetes所有组件的容器
sudo ./stop-kubernetes.sh
4. 参考
- meteorhacks/hyperkube
- meteorhacks/kube-init
- Kubernetes: The Future of Cloud Hosting
- Kubernetes 架构浅析
- An Introduction to Kubernetes
==================================
作者介绍
刘凯(KiwenLau):毕业于中国科学技术大学,目前在日本国立信息学研究所攻读云计算方向的博士学位,近期专注于Docker技术的研究。个人站点: GitHub, 博客