├── README.md ├── kubernetes ├── Dockerfile ├── install-kubernetes.sh ├── pod-nginx-alauda.yaml ├── pod-nginx.yaml ├── test-kubernetes-alauda.sh └── test-kubernetes.sh ├── rebuild-images-alauda.sh ├── rebuild-images.sh ├── single-kubernetes-docker.png ├── start-kubernetes-alauda.sh ├── start-kubernetes.sh └── stop-kubernetes.sh /README.md: -------------------------------------------------------------------------------- 1 | #基于Docker快速搭建单机版Kuberntes 2 | 3 | 4 | GitHub地址: [https://github.com/kiwenlau/single-kubernetes-docker](https://github.com/kiwenlau/single-kubernetes-docker) 5 | 6 | 博客地址:[基于Docker快速搭建单机版Kuberntes](http://kiwenlau.com/2015/11/28/151128-single-kubernetes-docker/) 7 | 8 | 9 | ##1. Kubernetes简介 10 | 11 | 2006年,Google工程师Rohit Seth发起了Cgroups内核项目。Cgroups是容器实现CPU,内存等资源隔离的基础,由此可见Google其实很早就开始涉足容器技术。而事实上,Google内部使用容器技术已经长达十年,目前谷歌所有业务包括搜索,Gmail,MapReduce等均运行在容器之中。Google内部使用的集群管理系统--Borg,堪称其容器技术的瑞士军刀。 12 | 13 | 2014年,Google发起了开源容器集群管理系统--Kubernetes,其设计之初就吸取了Borg的经验和教训,并原生支持了Docker。因此,Kubernetees与较早的集群管理系统Mesos和YARN相比,对容器尤其是Docker的支持更加原生,同时提供了更强大的机制实现资源调度,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。 14 | 15 | 与其他集群系统一致,Kubernetes也采用了Master/Slave结构。下表显示了Kubernetes的各个组件及其功能。 16 | 17 | | 角色 | 组件 | 功能 | 18 | | ------- |:-----------------: | :--------------------------------------------:| 19 | | Master | apiserver | 提供RESTful接口 | 20 | | Master | scheduler | 负责调度,将pod分配到Slave节点 | 21 | | Master | controller-manager | 负责Master的其他功能 | 22 | | Master | etde | 储存配置信息,节点信息,pod信息等 | 23 | | Slave | kubelet | 负责管理Pod,容器和容器镜像 | 24 | | Slave | proxy | 将访问Service的请求转发给对应的Pod,做一些负载均衡 | 25 | | 客户端 | kubectl | 命令行工具,向apiserver发起创建Pod等请求 | 26 | 27 | 28 | ##2. kiwenlau/kubernetes镜像简介 29 | 30 | 下图显示了我在Ubuntu主机上运行单机版Kubernetes的架构。可知,我一共运行了7个容器,分别运行Kubernetes的各个组件。事实上,Kuberenetes未来的开发目标正是将Kubernetes的各个组件运行到容器之中,这样可以方便Kubernetes的部署和升级。现在我将Kubernetes的各个组件全部运行在容器中必然存在很多问题且很多问题是未知的,因此这个项目仅做学习测试而不宜部署到生产环境中。Kubernetes各个组件容器之间的通信通过docker link实现,其中apiserver与ectd的4001端口进行通信,scheduler,controller-manager,kubelet,proxy以及kubectl与apiserver的8080端口进行通信。 31 | 32 | ![alt text](https://github.com/kiwenlau/single-kubernetes-docker/raw/master/single-kubernetes-docker.png "Image Architecture") 33 | 34 | 集群的大致运行流程是这样的: 用户通过kubectl命令向apiserver发起创建Pod的请求; scheduler将创建Pod的任务分配给kubelet;kubelet中包含了一个docker命令行工具,该工具会向Docker deamon发起创建容器的请求; Docker deamon负责下载镜像然后创建容器。 35 | 36 | 我将Docker deamon运行在Ubuntu主机上,因此Docker daemon所创建的应用容器与Kubernetes各个组件的容器均运行在Ubuntu主机上。docker socket采用volume的形式挂载到kubelet容器内,因此kubelet中的docker命令行工具可以直接与主机上的Docker daemon进行通信。 37 | 38 | 我是直接将kubernetes发布的各个组件的二进制可执行文件安装在/usr/local/bin目录下,因此,修改Dockerfile中的Kubernetes下载链接的版本号,就可以快速构建其他版本的Kubernetes镜像。另外,仅需修改网络配置,就可以很方便地在多个节点上部署Kubernetes。 39 | 40 | kiwenlau/kubernetes:1.0.7镜像版本信息: 41 | 42 | - ubuntu: 14.04 43 | - Kubernetes: 1.0.7 44 | - ectd: 2.2.1 45 | 46 | Ubuntu主机版本信息: 47 | 48 | - ubuntu: 14.04.3 LTS 49 | - kernel: 3.16.0-30-generic 50 | - docker: 1.9.1 51 | 52 | 53 | 54 | ##3. 运行步骤 55 | 56 | **1. 安装Docker** 57 | 58 | ubuntu 14.04上安装Docker: 59 | 60 | ``` 61 | curl -fLsS https://get.docker.com/ | sh 62 | ``` 63 | 64 | 其他系统请参考: [https://docs.docker.com/](https://docs.docker.com/) 65 | 66 | **2. 下载Docker镜像** 67 | 68 | 我将kiwenlau/kubernetes:1.07以及其他用到的Docker镜像都放在[灵雀云](http://www.alauda.cn/) 69 | 70 | ``` 71 | sudo docker pull index.alauda.cn/kiwenlau/kubernetes:1.0.7 72 | sudo docker pull index.alauda.cn/kiwenlau/etcd:v2.2.1 73 | sudo docker pull index.alauda.cn/kiwenlau/nginx:1.9.7 74 | sudo docker pull index.alauda.cn/kiwenlau/pause:0.8.0 75 | ``` 76 | 77 | **3. 启动Kubernetes** 78 | 79 | ```sh 80 | git clone https://github.com/kiwenlau/single-kubernetes-docker 81 | cd single-kubernetes-docker/ 82 | sudo chmod +x start-kubernetes-alauda.sh stop-kubernetes.sh 83 | sudo ./start-kubernetes-alauda.sh 84 | ``` 85 | 86 | 运行结束后进入kubectl容器。容器主机名为kubeclt。可以通过"exit"命令退出容器返回到主机,然后可以通过"sudo docker exec -it kubectl bash"命令再次进入kubectl容器。 87 | 88 | 89 | **4. 测试Kubernetes** 90 | 91 | 运行测试脚本,该脚本会启动一个nginx pod。 92 | 93 | ``` 94 | chmod +x test-kubernetes-alauda.sh 95 | ./test-kubernetes-alauda.sh 96 | ``` 97 | 98 | 输出 99 | 100 | ``` 101 | 102 | 103 | 104 | Welcome to nginx! 105 | 112 | 113 | 114 |

Welcome to nginx!

115 |

If you see this page, the nginx web server is successfully installed and 116 | working. Further configuration is required.

117 | 118 |

For online documentation and support please refer to 119 | nginx.org.
120 | Commercial support is available at 121 | nginx.com.

122 | 123 |

Thank you for using nginx.

124 | 125 | 126 | ``` 127 | 128 | **5.关闭Kubernetes集群** 129 | 130 | 删除所有pod 131 | 132 | ``` 133 | kubectl delete pods --all 134 | ``` 135 | 136 | 退出kubectl容器 137 | 138 | ``` 139 | exit 140 | ``` 141 | 142 | 删除Kubernetes所有组件的容器 143 | 144 | ``` 145 | sudo ./stop-kubernetes.sh 146 | ``` 147 | 148 | 149 | ##4. 参考 150 | 1. [meteorhacks/hyperkube](https://github.com/meteorhacks/hyperkube) 151 | 2. [meteorhacks/kube-init](https://github.com/meteorhacks/kube-init) 152 | 3. [Kubernetes: The Future of Cloud Hosting](https://meteorhacks.com/learn-kubernetes-the-future-of-the-cloud) 153 | 4. [Kubernetes 架构浅析](http://weibo.com/p/1001603912843031387951?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io) 154 | 5. [An Introduction to Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes) 155 | 156 | 157 | 158 | 159 | #Quickly run Kubernets on single host based on Docker 160 | 161 | ##1. Steps to run 162 | 163 | **1. Install Docker** 164 | 165 | Install Docker on ubuntu 14.04: 166 | 167 | ``` 168 | curl -fLsS https://get.docker.com/ | sh 169 | ``` 170 | 171 | For other OS: [https://docs.docker.com/](https://docs.docker.com/) 172 | 173 | **2. pull Docker images** 174 | 175 | I put all images in my Docker Hub repository 176 | 177 | ``` 178 | sudo docker pull kiwenlau/kubernetes:1.0.7 179 | sudo docker pull kiwenlau/etcd:v2.2.1 180 | sudo docker pull kiwenlau/nginx:1.9.7 181 | sudo docker pull kiwenlau/pause:0.8.0 182 | ``` 183 | 184 | **3. Start Kubernetes** 185 | 186 | ```sh 187 | git clone https://github.com/kiwenlau/single-kubernetes-docker 188 | cd single-kubernetes-docker/ 189 | sudo chmod +x start-kubernetes.sh stop-kubernetes.sh 190 | sudo ./start-kubernetes.sh 191 | ``` 192 | 193 | You will enter kubectl container after these commands. 194 | 195 | 196 | **4. Test Kubernetes** 197 | 198 | Run test script, this will start a nginx pod 199 | 200 | ``` 201 | chmod +x test-kubernetes.sh 202 | ./test-kubernetes.sh 203 | ``` 204 | 205 | Output: 206 | 207 | ``` 208 | 209 | 210 | 211 | Welcome to nginx! 212 | 219 | 220 | 221 |

Welcome to nginx!

222 |

If you see this page, the nginx web server is successfully installed and 223 | working. Further configuration is required.

224 | 225 |

For online documentation and support please refer to 226 | nginx.org.
227 | Commercial support is available at 228 | nginx.com.

229 | 230 |

Thank you for using nginx.

231 | 232 | 233 | ``` 234 | 235 | **5.Stop Kubernetes** 236 | 237 | Delete all pods 238 | 239 | ``` 240 | kubectl delete pods --all 241 | ``` 242 | 243 | Exit kubectl container 244 | 245 | ``` 246 | exit 247 | ``` 248 | 249 | Stop Kubernetes 250 | 251 | ``` 252 | sudo ./stop-kubernetes.sh 253 | ``` 254 | 255 | ##5. References 256 | 1. [meteorhacks/hyperkube](https://github.com/meteorhacks/hyperkube) 257 | 2. [meteorhacks/kube-init](https://github.com/meteorhacks/kube-init) 258 | 3. [Kubernetes: The Future of Cloud Hosting](https://meteorhacks.com/learn-kubernetes-the-future-of-the-cloud) 259 | 4. [An Introduction to Kubernetes](https://www.digitalocean.com/community/tutorials/an-introduction-to-kubernetes) 260 | -------------------------------------------------------------------------------- /kubernetes/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:14.04 2 | 3 | MAINTAINER kiwenlau 4 | 5 | WORKDIR /root 6 | 7 | # Install Kubernetes by putting "hyperkube" and "kubctl" binaries in "/usr/local/bin/" 8 | ADD install-kubernetes.sh /tmp/install-kubernetes.sh 9 | RUN sh /tmp/install-kubernetes.sh 10 | 11 | ADD pod-nginx.yaml /root/pod-nginx.yaml 12 | ADD test-kubernetes.sh /root/test-kubernetes.sh 13 | 14 | ADD pod-nginx-alauda.yaml /root/pod-nginx-alauda.yaml 15 | ADD test-kubernetes-alauda.sh /root/test-kubernetes-alauda.sh 16 | -------------------------------------------------------------------------------- /kubernetes/install-kubernetes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | apt-get update 4 | 5 | apt-get install -y ca-certificates wget iptables vim 6 | 7 | update-ca-certificates 8 | 9 | cd /tmp 10 | 11 | # Download the release file of Kubernetes 1.0.7 12 | wget https://github.com/kubernetes/kubernetes/releases/download/v1.0.7/kubernetes.tar.gz 13 | 14 | tar -xzvf kubernetes.tar.gz 15 | 16 | tar -xzvf kubernetes/server/kubernetes-server-linux-amd64.tar.gz 17 | 18 | # Install the executable binary of kubernetes 19 | cp kubernetes/server/bin/hyperkube /usr/local/bin/ 20 | cp kubernetes/server/bin/kube-apiserver /usr/local/bin/ 21 | cp kubernetes/server/bin/kube-controller-manager /usr/local/bin/ 22 | cp kubernetes/server/bin/kube-scheduler /usr/local/bin/ 23 | cp kubernetes/server/bin/kube-proxy /usr/local/bin/ 24 | cp kubernetes/server/bin/kubelet /usr/local/bin/ 25 | 26 | # Install the executable binary of kubelet 27 | cp kubernetes/platforms/linux/amd64/kubectl /usr/local/bin/ 28 | 29 | ## Delete useless files and packages 30 | rm -rf /tmp/* 31 | apt-get remove -y ca-certificates 32 | apt-get clean -y 33 | apt-get autoremove -y -------------------------------------------------------------------------------- /kubernetes/pod-nginx-alauda.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: nginx 5 | spec: 6 | containers: 7 | - name: nginx 8 | image: index.alauda.cn/kiwenlau/nginx:1.9.7 9 | ports: 10 | - containerPort: 80 11 | -------------------------------------------------------------------------------- /kubernetes/pod-nginx.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Pod 3 | metadata: 4 | name: nginx 5 | spec: 6 | containers: 7 | - name: nginx 8 | image: kiwenlau/nginx:1.9.7 9 | ports: 10 | - containerPort: 80 11 | -------------------------------------------------------------------------------- /kubernetes/test-kubernetes-alauda.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo -e "\nkubectl create -f pod-nginx-alauda.yaml" 4 | kubectl create -f pod-nginx-alauda.yaml 5 | 6 | echo -e "\nkubectl get pods/nginx\n" 7 | 8 | while [[ true ]]; do 9 | kubectl get pods/nginx 10 | nginxPod=`kubectl get pods/nginx | grep Running | grep 1/1` 11 | if [[ $nginxPod ]]; then 12 | break 13 | fi 14 | sleep 2 15 | done 16 | 17 | echo "" 18 | 19 | nginxIP=`kubectl describe pods/nginx | grep IP` 20 | IP=${nginxIP:7} 21 | echo -e "The IP address of Nginx Pod is: $IP\n" 22 | echo -e "wget -qO- $IP\n" 23 | wget -qO- $IP 24 | echo "" 25 | -------------------------------------------------------------------------------- /kubernetes/test-kubernetes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | echo -e "\nkubectl create -f pod-nginx.yaml" 4 | kubectl create -f pod-nginx.yaml 5 | 6 | echo -e "\nkubectl get pods/nginx\n" 7 | 8 | while [[ true ]]; do 9 | kubectl get pods/nginx 10 | nginxPod=`kubectl get pods/nginx | grep Running | grep 1/1` 11 | if [[ $nginxPod ]]; then 12 | break 13 | fi 14 | sleep 2 15 | done 16 | 17 | echo "" 18 | 19 | nginxIP=`kubectl describe pods/nginx | grep IP` 20 | IP=${nginxIP:7} 21 | echo -e "The IP address of Nginx Pod is: $IP\n" 22 | echo -e "wget -qO- $IP\n" 23 | wget -qO- $IP 24 | echo "" 25 | -------------------------------------------------------------------------------- /rebuild-images-alauda.sh: -------------------------------------------------------------------------------- 1 | cd kubernetes/ 2 | 3 | sudo docker build -t index.alauda.cn/kiwenlau/kubernetes:1.0.7 . 4 | 5 | cd .. -------------------------------------------------------------------------------- /rebuild-images.sh: -------------------------------------------------------------------------------- 1 | cd kubernetes/ 2 | 3 | sudo docker build -t kiwenlau/kubernetes:1.0.7 . 4 | 5 | cd .. 6 | -------------------------------------------------------------------------------- /single-kubernetes-docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kiwenlau/single-kubernetes-docker/07724750b03368dc0c697ec91ed35baeb593fc1c/single-kubernetes-docker.png -------------------------------------------------------------------------------- /start-kubernetes-alauda.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Run ectd container 4 | echo "Starting ectd container..." 5 | sudo docker run -d --name="etcd" index.alauda.cn/kiwenlau/etcd:v2.2.1 \ 6 | --addr=127.0.0.1:4001 \ 7 | --bind-addr=0.0.0.0:4001 \ 8 | --data-dir=/var/etcd/data 9 | 10 | # Run apiserver container 11 | echo "Starting apiserver container..." 12 | sudo docker run -d --link etcd:etcd --name="apiserver" index.alauda.cn/kiwenlau/kubernetes:1.0.7 kube-apiserver \ 13 | --service-cluster-ip-range=10.0.0.1/24 \ 14 | --insecure-bind-address=0.0.0.0 \ 15 | --etcd_servers=http://etcd:4001 16 | 17 | sleep 10 18 | 19 | # Run controller-manager container 20 | echo "Starting controller-manager container..." 21 | sudo docker run -d --link apiserver:apiserver --name="controller-manager" index.alauda.cn/kiwenlau/kubernetes:1.0.7 kube-controller-manager --master=http://apiserver:8080 22 | 23 | # Run scheduler container 24 | echo "Starting scheduler container..." 25 | sudo docker run -d --link apiserver:apiserver --name="scheduler" index.alauda.cn/kiwenlau/kubernetes:1.0.7 kube-scheduler --master=http://apiserver:8080 26 | 27 | # Run kubelet container 28 | echo "Starting kubelet container..." 29 | sudo docker run -d --link apiserver:apiserver --pid=host -v /var/run/docker.sock:/var/run/docker.sock --name="kubelet" index.alauda.cn/kiwenlau/kubernetes:1.0.7 kubelet \ 30 | --api_servers=http://apiserver:8080 \ 31 | --address=0.0.0.0 \ 32 | --hostname_override=127.0.0.1 \ 33 | --cluster_dns=10.0.0.10 \ 34 | --cluster_domain="kubernetes.local" \ 35 | --pod-infra-container-image="index.alauda.cn/kiwenlau/pause:0.8.0" 36 | 37 | # Run proxy container 38 | echo "Starting proxy container..." 39 | sudo docker run -d --link apiserver:apiserver --privileged --name="proxy" index.alauda.cn/kiwenlau/kubernetes:1.0.7 kube-proxy --master=http://apiserver:8080 40 | 41 | #Run kubectl container 42 | echo "Starting kubectl container..." 43 | sudo docker run -id --link apiserver:apiserver -e "KUBERNETES_MASTER=http://apiserver:8080" --name="kubectl" --hostname="kubectl" index.alauda.cn/kiwenlau/kubernetes:1.0.7 bash 44 | 45 | #Get into the kubectl container 46 | sudo docker exec -it kubectl bash 47 | 48 | -------------------------------------------------------------------------------- /start-kubernetes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Run ectd container 4 | echo "Starting ectd container..." 5 | sudo docker run -d --name="etcd" kiwenlau/etcd:v2.2.1 \ 6 | --addr=127.0.0.1:4001 \ 7 | --bind-addr=0.0.0.0:4001 \ 8 | --data-dir=/var/etcd/data 9 | 10 | # Run apiserver container 11 | echo "Starting apiserver container..." 12 | sudo docker run -d --link etcd:etcd --name="apiserver" kiwenlau/kubernetes:1.0.7 kube-apiserver \ 13 | --service-cluster-ip-range=10.0.0.1/24 \ 14 | --insecure-bind-address=0.0.0.0 \ 15 | --etcd_servers=http://etcd:4001 16 | 17 | sleep 10 18 | 19 | # Run controller-manager container 20 | echo "Starting controller-manager container..." 21 | sudo docker run -d --link apiserver:apiserver --name="controller-manager" kiwenlau/kubernetes:1.0.7 kube-controller-manager --master=http://apiserver:8080 22 | 23 | # Run scheduler container 24 | echo "Starting scheduler container..." 25 | sudo docker run -d --link apiserver:apiserver --name="scheduler" kiwenlau/kubernetes:1.0.7 kube-scheduler --master=http://apiserver:8080 26 | 27 | # Run kubelet container 28 | echo "Starting kubelet container..." 29 | sudo docker run -d --link apiserver:apiserver --pid=host -v /var/run/docker.sock:/var/run/docker.sock --name="kubelet" kiwenlau/kubernetes:1.0.7 kubelet \ 30 | --api_servers=http://apiserver:8080 \ 31 | --address=0.0.0.0 \ 32 | --hostname_override=127.0.0.1 \ 33 | --cluster_dns=10.0.0.10 \ 34 | --cluster_domain="kubernetes.local" \ 35 | --pod-infra-container-image="kiwenlau/pause:0.8.0" 36 | 37 | # Run proxy container 38 | echo "Starting proxy container..." 39 | sudo docker run -d --link apiserver:apiserver --privileged --name="proxy" kiwenlau/kubernetes:1.0.7 kube-proxy --master=http://apiserver:8080 40 | 41 | #Run kubectl container 42 | echo "Starting kubectl container..." 43 | sudo docker run -id --link apiserver:apiserver -e "KUBERNETES_MASTER=http://apiserver:8080" --name="kubectl" --hostname="kubectl" kiwenlau/kubernetes:1.0.7 bash 44 | 45 | #Get into the kubectl container 46 | sudo docker exec -it kubectl bash 47 | 48 | -------------------------------------------------------------------------------- /stop-kubernetes.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # delete all containers of Kubernetes cluster 4 | sudo docker rm -f kubectl 5 | sudo docker rm -f proxy 6 | sudo docker rm -f kubelet 7 | sudo docker rm -f scheduler 8 | sudo docker rm -f controller-manager 9 | sudo docker rm -f apiserver 10 | sudo docker rm -f etcd 11 | --------------------------------------------------------------------------------