1 前言

近几年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集群。

2 环境要求说明

  • 机器资源:一个VM,2 vCPU 、4GB 内存
  • 操作系统:CentOS 7.3或更高
  • Docker:17.03或更高
  • Kubectl:1.10.5或更高
  • 网络:国内由于对很多google的站点进行了屏蔽,很多容器镜像无法直接下载,所以要采用变通的方法,具体描述见本文后面的描述。如果读者有条件的化,可以购买阿里云或者UCloud海外云主机,也可以解决这一问题。
    笔者环境:i7-2600(8核),8G,3.10.0-327.el7.x86_64

3 部署步骤

3.1 卸载旧版本Docker

旧版本的Docker命名为docker或docker-engine,如果有安装旧版本,先卸载旧版本

sudo yum remove -y docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

3.2 安装Docker

这里介绍在CentoOS 7.4上安装Docker 17.03社区版本的方法:

3.2.1 安装docker-ce-selinux

先安装docker-ce-selinux,否则会报错。

yum install 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

3.2.2 安装指定版本Docker

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

3.2.3 设置docker镜像

进入/etc/docker目录,再输入ls查看里面的文件,没有daemon.json文件,那么就自己创建这个文件。
vi daemon.json打开文件,输入下面的josn代码,按Esc退出编辑,最后输入:wq保存并退出。

{
"registry-mirrors":["https://hub-mirror.c.163.com"]
}

3.2.4 重启docker daemon

systemctl stop docker.service 
systemctl daemon-reload
systemctl start docker.service

3.3 安装kubectl

3.3.1 编辑kubernets.repo

在/etc/yum.repos.d目录中编辑kubernets.repo文件,内容如下:

[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0

3.3.2 安装kubectl

执行如下命令,安装kubectl

yum install kubectl-1.10.5

3.4 使用kubeadm-dind部署单节点k8s集群

在一个单机或一个虚拟机上,可以使用kubeadm-dind部署一个单节点k8s集群,用于开发和测试。下面是具体的方法:

3.4.1 下载kubeadm-dind安装脚本

wget https://cdn.rawgit.com/kubernetes-sigs/kubeadm-dind-cluster/master/fixed/dind-cluster-v1.10.sh

下载不了的童鞋,后面我会把连接提供给大家!

3.4.2 设置脚本执行权限

chmod +x dind-cluster-v1.10.sh

3.4.3 设置环境变量

export NUM_NODES=0  #除master外的工作节点个数,由于我们是单节点,只保留master即可
export CNI_PLUGIN=flannel
export DASHBOARD_URL="kubernetes-dashboard.yaml"

3.4.4 修改dashboard部署文件

在使用dind-cluster-v1.10.sh拉起k8s集群时,需要修改kubernetes-dashboard.yaml的定义

  • 先下载kubernetes-dashboard.yaml
wget https://rawgit.com/kubernetes/dashboard/bfab10151f012d1acc5dfb1979f3172e2400aa3c/src/deploy/kubernetes-dashboard.yaml

下载不了的童鞋,后面我会把连接提供给大家

  • 修改kubernetes-dashboard.yaml
    把imagePullPolicy: Always修改为imagePullPolicy: IfNotPresent
imagePullPolicy: IfNotPresent

3.4.5 执行脚本部署集群

./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镜像。

脚本代码如下:

  • geti.sh文件(被do_getm.sh脚本调用,在master节点上下载k8s相关镜像,解决google被屏蔽问题)
#!/bin/bash
db_ver=v1.6.0                                                                                                                                                                                                     
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:$db_ver)
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:$db_ver gcr.io/google_containers/kubernetes-dashboard-amd64:$db_ver
docker rmi k8s.gcr.io/kubernetes-dashboard-amd64:$db_ver
  • do_getm.sh文件(在宿主机节点上执行)
#!/bin/bash
master_id=$(docker ps | grep -i master | awk '{print $1}')
docker cp geti.sh ${master_id}:/root                                                                                                                                                                              
docker exec ${master_id} /root/geti.sh

4.问题总结

4.1 docker仓库

这里用的是keveon的docker仓库, 可以解决国内用户不能正确下载镜像的问题。

4.2 关于dashboard版本

实测:
1.6.0 英文界面
1.6.3 中文界面
1.8.3 中文界面
>>可以通过修改kubernetes-dashboard.yaml,geti.sh中的版本号实现对dashboard版本的修改!

4.3 解决dashboard服务起来后,访问不了的问题

此例中使用的是Nodeport方式。
现象:

  1. 通过命令kubectl get pod -n kube-system 可以发现dashboard已经处于running状态
  2. 进入master节点里面,发现可以访问10.244.0.5:9090。
  3. 宿主机ping不通10.244.0.5
  4. 查看路由发现没有10.244.0.0/24的路由

解决:

  1. 添加一条到node里面的路由
route add -net 10.244.0.0 netmask 255.255.255.0 gw 10.192.0.2 
  1. 添加dnat
    iptables -t nat -A PREROUTING -d 172.18.100.228 -p tcp -m tcp --dport 30001 -j DNAT --to-destination 10.244.0.5:9090

4.4 安装失败,如何重新安装?

执行下面命令:

./dind-cluster-v1.10.sh down #关闭所有节点
./dind-cluster-v1.10.sh clean #清理

5.参考

  1. 在单机上使用Kubeadm-dind 部署多节点k8s集群
  2. kubernetes中port、target port、node port的对比分析,以及kube-proxy代理

6.其他比较不错的资料(待验证)

  1. 深入玩转K8S之使用kubeadm安装Kubernetes v1.10以及常见问题解答
  2. 使用 kubeadmin 离线部署 kubernetes1.9
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐