在单机上使用Kubeadm-dind 部署多节点k8s集群

     近几年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的运行情况

猜你喜欢

转载自blog.csdn.net/u011782423/article/details/82346717