如果要学Kubernetes的话,怎么能够没有自己的Kubernetes集群呢?
本文从零开始,手把手教你搭建Kubernetes集群!
系列文章:
在VMWare中部署你的K8S集群
前言
在搭建K8S之前,我觉得K8S包含的组件这么多,应该相当复杂了吧(上一次搭建基本上是在三年前了);
但实际上,经过这几年各种折腾的打磨,发现并没有自己想象的那么难!
搭建的过程和通常的CentOS集群基本上类似,只是稍微多了几个东西而已;
如果对搭建CentOS集群不熟悉,建议可以先看一下我的这篇文章:
在搭建之前先说一下我的环境:
- CPU:AMD Ryzen 7 3700X
- 内存:32GB
- 硬盘:NVMe Samsung SSD 970 500GB
- 虚拟化:VMWare Pro 15.1.0 build-13591040
- 操作系统镜像:CentOS-7-x86_64-Minimal-2009.iso
关于我们要搭建的K8S:
- Docker版本:docker-ce-19.03.9;
- K8S版本:1.20.2;
- 三个节点:master、node1、node2(固定IP);
- 容器运行时:仍然使用Docker而非Containerd;
- Pod网络:用Calico替换Flannel实现 Pod 互通,支持更大规模的集群;
- 集群构建工具:Kubeadm(这个没啥好说的吧);
关于网络配置:
- 整体机器采用NAT地址转换;
- 各台虚拟机采用固定IP地址;
- 虚拟机VMWare统一网关地址:192.168.24.2;
具体IP地址分配如下:
| 主机名称 | 硬件配置 | IP |
|---|---|---|
| master | CPU4核/内存4G | 192.168.24.180 |
| node1 | CPU4核/内存4G | 192.168.24.181 |
| node2 | CPU4核/内存4G | 192.168.24.182 |
下面,我们就来动手搭建一个K8S集群吧!
创建合适的操作系统快照
先来说一下什么是合适的操作系统快照:
由于VMWare中提供了快照功能,我们可以通过生成一个快照,并且克隆这个快照快速实现虚拟机倍增;但是,为了让我们克隆的机器可以直接加入集群,而非在克隆后还要修改克隆机大量配置,因此创建快照的内容想到关键;
我们应当在master机上进行网络配置、工具安装后再生成快照;
① 安装CentOS镜像
首先在镜像站下载CentOS-7-x86_64-Minima.iso,即最小的镜像文件;
然后在VMWare安装这个镜像,这里作为master机器;
具体镜像安装挺简单的,这里不再赘述了;
只贴一个配置:
- 1个处理器4核
- 4G内存
- 40G硬盘SCSI
- 网络:NAT
分区:
- /boot:256M
- swap:2G
- /:剩余
在安装CentOS时可以不创建用户,但是一定要创建Root密码;
我这里创建的是:
123456;
② 配置网络
在网络配置中,我们要配置虚拟机为固定的IP地址,避免使用DCHP动态分配IP(否则每次IP都不同,乱套了!);
首先,安装完成后,有极大的可能是无法联网的(所以也不能使用yum安装);
首先需要修改配置vi /etc/sysconfig/network:
1 | $ vi /etc/sysconfig/network |
还要修改vi /etc/sysconfig/network-scripts/ifcfg-ens33:
1 | $ vi /etc/sysconfig/network-scripts/ifcfg-ens33 |
上面的配置主要是为了将网络修改为静态IP;
配置中的几个重点:
- BOOTPROTO:修改为static,即静态IP;
- IPADDR:静态的IP地址;
- NETMASK:子网掩码,选择255.255.255.0即可;
- GATEWAY:网关,结尾为
.2,NAT分配的子网地址可在编辑→虚拟网络编辑器中查看; - DNS1、DNS2:DNS1可选择本机网关地址、DNS2可配置114.114.114.114等公共DNS;
- UUID:删除;
- ONBOOT:yes,开机启用网络(开启才能开机就联网);
需要注意的是:
在CentOS 6中,网络的配置文件是:
/etc/sysconfig/network-scripts/ifcfg-eth0;
随后,配置hosts:
1 | $ vi /etc/hosts |
上述配置根据你实际情况修改;
配置完成后reboot;
reboot后登录,ping百度、qq等网站,成功则说明配置成功;
1 | ping www.qq.com |
③ 系统配置
系统配置主要是关闭防火墙、关闭swap、配置yum源等;
Ⅰ.关闭防火墙iptables
命令如下:
1 | $ service iptables stop |
注:有些机器可能没有iptables,这时候会提示:
1
2
3
4
5 [root@master ~]# service iptables stop
Redirecting to /bin/systemctl stop iptables.service
Failed to stop iptables.service: Unit iptables.service not loaded.
[root@master ~]# systemctl disable iptables
Failed to execute operation: No such file or directory不用理会,这样最好~
Ⅱ.禁用selinux
命令如下:
1 | # 查看selinux |
Ⅲ.禁用防火墙firewalld
命令如下:
1 | systemctl stop firewalld |
上面三步非常关键,如果防火墙没有关闭,会有各种各样的问题,导致机器中的节点无法正常通信(别问我是怎么知道的~)
Ⅳ.SSH登录配置
1 | $ vim /etc/ssh/sshd_config |
允许Root身份登录、允许空密码登录、是否允许使用密码认证:
1 | PermitRootLogin yes #允许root登录 |
Ⅴ.关闭Swap空间
命令如下:
1 | [root@master ~]# swapoff -a |
此步同样非常关键
Ⅵ.配置桥接流量
命令如下:
1 | [root@k8s-master1 ~]# cat > /etc/sysctl.d/k8s.conf << EOF |
Ⅶ.配置yum源
在安装软件前首先要配置yum源:
1 | # 配置阿里云源 |
随后,可通过yum安装vim、htop、ntp、net-tools、wget等软件;
④ 下载并配置软件
htop、vim、net-tools、wget直接通过yum install安装即可;
Ⅰ.时间同步ntp
下面讲述时间同步ntp配置:
安装ntp:
1 | yum install ntp |
配置ntp:
1 | # 开启服务 |
Ⅱ.安装Docker
Kubernetes默认的CRI(容器运行时)为Docker,因此先安装Docker;
首先,安装必要的一些系统工具:
1 | yum install -y yum-utils device-mapper-persistent-data lvm2 |
随后,添加软件源信息:
1 | yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
替换下载源为阿里源:
1 | sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo |
查看可安装版本:
1 | yum list docker-ce --showduplicates | sort -r |
选择版本安装:
1 | yum -y install docker-ce-19.03.9 |
设置开机启动r并启动Docke:
1 | systemctl enable docker && systemctl start docker |
配置镜像下载加速:
1 | cat > /etc/docker/daemon.json << EOF |
重启生效:
1 | [root@master ~]# systemctl restart docker |
至此,Docker安装完成;
Ⅲ.安装kubeadm/kubelet和kubectl
由于kubeadm依赖中已经包括了kubectl、kubelet,所以不用单独安装kubectl;
配置镜像源:
1 | cat > /etc/yum.repos.d/kubernetes.repo <<EOF |
安装kubeadm:
1 | yum install kubeadm-1.20.2 -y |
由于版本更新频繁,这里指定版本号部署
设置开机启动:
1 | systemctl enable kubelet |
至此,所有配置配置完毕、所有软件安装完毕;
接下来我们创建镜像并克隆;
创建快照并克隆
在制作镜像快照前,如果系统是CentOS6,则还需要删除
/etc/udev/rules.d/70-persistent-net.rules文件;注:删除之后不可重启!否则下次重启还会自动创建该文件,还需要删除!
选择虚拟机→快照→拍摄快照,使用当前虚拟机的当前状态拍摄快照;
拍摄完成后,选择当前拍摄快照,点击克隆,选择现有快照,克隆类型有两种:链接克隆和完整克隆,选择一个即可;随后修改名称,完成即可;
链接克隆和完整克隆:
- 链接克隆:母镜像损坏,克隆机都会损坏,但存储占有率低;
- 完整克隆:母镜像和克隆机互不影响,但存储占有率高;
修改克隆机并测试网络互通性
通过镜像克隆两台虚拟机,取名为node1和node2;
修改各台虚拟机的配置,这里以node1为例:
1 | $ vi /etc/sysconfig/network |
node2虚拟机类似;
注:克隆后
/etc/sysconfig/network文件中的HOSTNAME字段也可能被删除了;这时只需要添加
HOSTNAME=具体节点名称即可;
最后做测试,如在master去ping其他node:
1 | [root@master ~]# ping node1 |
成功!
创建Kubernetes集群
Master节点初始化
在Master节点执行:
1 | [root@master ~]# kubeadm init \ |
说明:
--apiserver-advertise-address:集群通告地址,就是Master节点的IP地址;--image-repository:由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址;--kubernetes-version:K8s版本,与上面安装的一致;--service-cidr:集群内部虚拟网络,Pod统一访问入口;--pod-network-cidr:Pod网络,与下面部署的CNI网络组件yaml中保持一致;
注:集群内部虚拟地址和Pod网络地址可自行指定,但是必须要和下面的配置要保持一致!
也可以使用配置文件引导初始化:
1
2
3
4
5
6
7
8
9
10 $ vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.2
imageRepository: registry.aliyuncs.com/google_containers
networking:
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
$ kubeadm init --config kubeadm.conf --ignore-preflight-errors=all这里不在赘述;
等待一段时间后初始化结束,这时根据提示我们需要拷贝认证文件:
1 | # 拷贝kubectl使用的连接k8s认证文件到默认路径 |
同时还会创建鉴权token,类似于:
1
2 kubeadm join 192.168.24.180:6443 --token w2mfe2.3pwfhv6nm9yueb4d \
--discovery-token-ca-cert-hash sha256:88b9219498210b9ac2f394e32b06a21ae58af887ff6566fa53f30fc9a9dd1ef3 --v=6这个是稍后将子Node节点加入Master节点时需要的命令,需要先记下来;
此时查看Master节点的状态:
1 | [root@master ~]# kubectl get nodes |
这时master节点是NotReady的状态;
这是因为我们还没有为Kubernetes安装对应的CNI(Container Network Interface,容器网络接口)插件;
安装Calico插件
CNI是Kubernetes中的一个调用网络实现的接口标准;
Kubelet 通过这个标准的 API 来调用不同的网络插件以实现不同的网络配置方式,实现了这个接口的就是 CNI 插件,它实现了一系列的 CNI API 接口;
常用的CNI插件有很多,比如:
- Flannel;
- Calico;
- Canal;
- Weave;
- ……
这里我们选用的是Calico;
关于Calico:
Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等;
Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播;
官方文档:
首先,通过wget下载Calico配置文件:
1 | wget https://docs.projectcalico.org/manifests/calico.yaml |
随后修改配置文件中的CALICO_IPV4POOL_CIDR:
修改Pod网络(CALICO_IPV4POOL_CIDR),与前面kubeadm init指定的一样;
1 | # |
最后通过配置文件启动服务:
1 | kubectl apply -f calico.yaml |
等待一段时间后,查看pod状态:
1 | [root@master ~]# kubectl get pods -n kube-system |
可以看到,所有的服务都已经Running;
同时查看节点状态:
1 | [root@master ~]# kubectl get nodes |
此时Master节点已经变为了Ready状态!
注:在将Node节点加入Master之前必须先安装CNI(即使不是Calico);
否则有可能出现子节点无法连接Master的情况;
Node节点加入Master
在Node节点中运行之前在Master节点初始化后kubeadm init输出的kubeadm join命令:
1 | kubeadm join 192.168.24.180:6443 --token w2mfe2.3pwfhv6nm9yueb4d \ |
等待片刻,Node节点即加入至Master中;
集群创建完毕!
注:默认token有效期为24小时,当过期之后,该token就不可用了;
这时就需要重新创建token,操作如下:
1 kubeadm token create --print-join-command通过该命令可以快捷生成token;
部署WebUI(Dashboard)
接下来为Kubernetes创建后台管理面板,方便查看和管理;
Dashboard的网址:
使用时需要根据kubenetes版本选择Dashboard版本,此处为v2.1.0;
① 下载并部署
首先通过wget获取配置文件:
1 | wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml -O dashboard.yaml |
由于在默认情况下,Dashboard只能集群内部访问;因此,需要修改Service为NodePort类型,暴露到外部;
文件修改内容如下:
1 | vi dashboard.yaml |
随后,将配置文件应用:
1 | kubectl apply -f dashboard.yaml |
等待服务部署后查看:
1 | [root@master ~]# kubectl get pods -n kubernetes-dashboard |
可以看到Dashboard已经成功跑起来了!
在浏览器访问:
出现下面的界面:

说明Dashboard部署成功;
在使用时需要添加用户及其权限以生成Token来登录;
② 创建用户角色
下面在Master节点创建service account并绑定默认cluster-admin管理员集群角色;
创建用户:
1 | [root@master ~]# kubectl create serviceaccount dashboard-admin -n kube-system |
用户授权:
1 | [root@master ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin |
获取用户Token:
1 | [root@master ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}') |
上述Token部分即为登录使用的Token;
可将其保存在一个文件中,方便登录时使用
使用获取到的Token登录Dashboard;
登录后的界面和下面的类似(但是你应该是没有Nginx服务的);

测试Kubernetes集群
既然服务已经部署完毕了,那么我们就来部署一个包含Nginx的Pod来测试一下吧!
创建一个部署的Deployment:
1 | [root@master ~]# kubectl create deployment nginx --image=nginx |
将Nginx服务暴露:
1 | [root@master ~]# kubectl expose deployment nginx --port=80 --type=NodePort |
查看Pod和服务状态:
1 | [root@master ~]# kubectl get pod,svc |
在Master中访问Nginx:
1 | [root@master ~]# curl 10.98.182.12 |
成功!
同时,我们也可以在面板上看到Nginx的服务:

至此,我们的K8S已经安装成功了,接下来就愉快的玩耍吧!
附录
系列文章:
文章参考:
扩展阅读: