近几年Google的Kubernetes(简称k8s)已经成为分布式容器编排和管理领域事实上的标准,在基于容器的微服务架构下的分布式应用开发、部署和运维管理等领域,会有越来越多的用户部署和使用k8s平台。对于初学着来说,部署一个多机k8s集群一来缺少环境、另外也相对比较复杂。为了满足用户尝试和使用的便利性需要,可以使用两种方法在一个单机环境下(物理机或者虚拟机)部署一个k8s环境:
- Minikube: 这种方式是Google推荐的本地(单机)部署方法,它在一个虚拟机(或物理机)上部署一个单节点k8s集群,用于开发或测试。
- kubeadm-dind: 这种方式是在一个虚拟机(或物理机)上部署一个多节点k8s集群(Minikube是单节点),它要求在虚拟机上有一个docker daemon运行。kubeadm-dind使用docker-in-docker(简称DinD)技术在虚拟机上首先以容器的方式启动k8s的多个节点(master节点和多个woker node节点),然后在节点内部再启动若干容器运行k8s相应的组件以完成部署一个k8s集群。
本文将向大家介绍kubeadm-dind方式的k8s部署的方法。使用这种方法部署成功后,大家就可以在自己的单机环境下学习和使用k8s了。后面,我会在另一篇文章中介绍TiDB部署到k8s的方法,需要大家先按照本文的描述部署好一个kubeadm-dind方式下的k8s集群。
环境要求说明:
- 机器资源:一个VM,2 vCPU 、4GB 内存
- 操作系统:CentOS 7.3或更高
- Docker:17.03或更高
- Kubectl:1.10.5或更高
- 网络:国内由于对很多google的站点进行了屏蔽,很多容器镜像无法直接下载,所以要采用变通的方法,具体描述见本文后面的描述。如果读者有条件的化,可以购买阿里云或者UCloud海外云主机,也可以解决这一问题。
下面是具体的部署方法和一些注意事项:
1. 安装Docker
这里介绍在CentoOS 7.4上安装Docker 17.03社区版本的方法:
(1) 这里建议国内读者使用阿里云镜像安装
#先安装docker-ce-selinux,否则会报错。
https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm
#安装指定版本
yum install https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/Packages/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm
systemctl enable docker.service
systemctl start docker.service
(2) 设置docker镜像
进入/etc/docker目录,再输入ls查看里面的文件,没有daemon.json文件,那么就自己创建这个文件。
vi daemon.json打开文件,输入下面的josn代码,按Esc退出编辑,最后输入:wq保存并退出。
{
"registry-mirrors":["https://hub-mirror.c.163.com"]
}
(3) 重启docker daemon
systemctl stop docker.service
systemctl daemon-reload
systemctl start docker.service
2. 安装kubectl
在/etc/yum.repos.d目录中编辑kubernets.repo文件,内容如下:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 #使用阿里 云k8s yum源
enabled=1
gpgcheck=0
执行如下命令,安装kubectl:
yum install kubectl-1.10.5
3. 使用kubeadm-dind部署多节点k8s集群
在一个单机或一个虚拟机上,可以使用kubeadm-dind部署一个多节点k8s集群,用于开发和测试。下面是具体的方法: (1)下载kubeadm-dind安装脚本
wget https://cdn.rawgit.com/kubernetes-sigs/kubeadm-dind-cluster/master/fixed/dind-cluster-v1.10.sh
(2) 设置脚本执行权限
chmod +x dind-cluster-v1.10.sh
(3) 设置环境变量
export NUM_NODES=2 #除master外的工作节点个数
export CNI_PLUGIN=flannel
export DASHBOARD_URL="kubernetes-dashboard.yaml"
注意:在使用dind-cluster-v1.10.sh 拉起k8s集群时,需要修改kubernetes-dashboard.yaml的定义(原脚本是从远程下载的):
a.先执行如下命令下载yaml文件
wget https://rawgit.com/kubernetes/dashboard/bfab10151f012d1acc5dfb1979f3172e2400aa3c/src/deploy/kubernetes-dashboard.yaml
b.修改kubernetes-dashboard.yaml,把imagePullPolicy: Always修改为imagePullPolicy: IfNotPresent,并修改环境变量 (上面的第3个变量) 。
(4) 执行脚本部署集群
./dind-cluster-v1.10.sh up
注意:在执行dind-cluster-v1.10.sh时,会在kube-master节点和kube-node-n节点上下载k8s相应的某些镜像。如果是国内用户,由于网络屏蔽的原因,这时就需要在dind-cluster脚本执行到某个特定时候执行下面的脚本下载镜像(如果是国外的主机,则不需要执行)。下图是在宿主机上的脚本目录情况:
在宿主机上执行上图中的dind-cluster-v1.10.sh时,当部署进展到提示 " [init] This often takes around a minute; or longer if the control plane images have to be pulled." 时,需要执行do_getm.sh脚本,让master节点下载需要的k8s镜像。
当部署进展到提示如下是,需要执行do_getn.sh,依次在每个work node节点上下载需要的k8s镜像。
* Waiting for kube-proxy and the nodes
.................................................
下面是为了解决google被屏蔽不能直接下载镜像问题所用到的脚本:
--geti.sh (被do_getm.sh脚本调用,在master节点上下载k8s相关镜像,解决google被屏蔽问题)
#!/bin/bash
docker pull quay.io/coreos/flannel:v0.10.0-amd64
images=(etcd-amd64:3.1.12 pause-amd64:3.1 k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8 k8s-dns-dnsmasq-nanny-amd64:1.14.8 kubernetes-dashboard-amd64:v1.6.0)
for imageName in ${images[@]} ; do
docker pull keveon/$imageName
docker tag keveon/$imageName k8s.gcr.io/$imageName
docker rmi keveon/$imageName
done
docker tag k8s.gcr.io/kubernetes-dashboard-amd64:v1.6.0 gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.0
docker rmi k8s.gcr.io/kubernetes-dashboard-amd64:v1.6.0
-- do_getm.sh (在宿主机节点上执行)
#!/bin/bash
master_id=$(docker ps | grep -i master | awk '{print $1}')
docker cp /root/geti.sh ${master_id}:/root
docker exec ${master_id} /root/geti.sh
-- geti_w.sh (被do_getn.sh脚本调用,在worker节点上下载k8s相关镜像,解决google被屏蔽问题)
#!/bin/bash
docker pull quay.io/coreos/flannel:v0.10.0-amd64
images=(pause-amd64:3.1 k8s-dns-sidecar-amd64:1.14.8 k8s-dns-kube-dns-amd64:1.14.8 k8s-dns-dnsmasq-nanny-amd64:1.14.8 kubernetes-dashboard-amd64:v1.6.0)
for imageName in ${images[@]} ; do
docker pull keveon/$imageName
docker tag keveon/$imageName k8s.gcr.io/$imageName
docker rmi keveon/$imageName
done
docker tag k8s.gcr.io/kubernetes-dashboard-amd64:v1.6.0 gcr.io/google_containers/kubernetes-dashboard-amd64:v1.6.0
docker rmi k8s.gcr.io/kubernetes-dashboard-amd64:v1.6.0
--do_getn.sh (在宿主机节点上执行)
#!/bin/bash
for node_id in $(docker ps | grep -v master | grep -vi container | awk '{print $1}') ; do
echo $node_id
docker cp /root/geti_w.sh ${node_id}:/root/geti.sh
docker exec ${node_id} /root/geti.sh
done
4. 检查k8s部署情况
在宿主机上执行成功执行完dind-cluster-v1.10.sh脚本之后,可以运行kubectl get nodes查看执行情况。下图是本人机器的示例输出:
执行 kubectl get pod -n kube-system -o wide,可以看到pod的运行情况