1、安装要求(提前确认)
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 三台机器,操作系统 CentOS7.5+(mini)
- 硬件配置:2GBRAM,2个CPU,硬盘30GB
2、安装步骤
角色 | IP |
---|---|
master |
192.168.50.128 |
node1 |
192.168.50.131 |
node2 |
192.168.50.132 |
2.1、安装前预处理操作
注意本小节这7个步骤中,在所有的节点(master和node节点)都要操作。
(1)关闭防火墙、selinux
(3)关闭swap
分区
上面的是临时关闭,当然也可以永久关闭,即在/etc/fstab
文件中将swap
挂载所在的行注释掉即可。
(4)设置主机名
master主节点设置如下
node1从节点设置如下
node2从节点设置如下
执行bash
命令以加载新设置的主机名
(5)添加hosts
解析
(6)打开ipv6
流量转发。
(7)配置yum
源
所有的节点均采用阿里云官网的base
和epel
源
(8)时区与时间同步
2.2、安装docker
(1)添加docker
软件yum
源
(2)安装docker-ce
列出所有可以安装的版本
这里我们安装最新版本的docker
,所有的节点都需要安装docker
服务
(3)启动docker
并设置开机自启动
查看版本号,检测docker是否安装成功
上面的这种查看docker client
的版本的。建议使用下面这种方法查看docker-ce
版本号,这种方法把docker的client端和server端的版本号查看的一清二楚。
(4)更换docker
的镜像仓库源
国内镜像仓库源有很多,比如阿里云,清华源,中国科技大,docker官方中国源等等。
由于加载docker仓库源
,所以需要重启docker
2.3、安装kubernetes
服务
(1)添加kubernetes
软件yum
源
方法:浏览器打开mirrors.aliyun.com
网站,找到kubernetes
,即可看到镜像仓库源
(2)安装kubeadm、kubelet
和kubectl
组件
所有的节点都需要安装这几个组件。
由于kubernetes版本变更非常快,因此这里先列出了有哪些版本,我们安装1.18.6
版本。所有节点都安装。
(3)设置开机自启动
我们先设置开机自启,但是
kubelete
服务暂时先不启动。
~]# systemctl enable kubelet
2.4、部署Kubeadm Master
节点
(1)生成预处理文件
在master
节点执行如下指令,可能出现WARNING
警告,但是不影响部署:
这个文件kubeadm-init.yaml
,是我们初始化使用的文件,里面大概修改这几项参数。
(2)提前拉取镜像
如果直接采用kubeadm init
来初始化,中间会有系统自动拉取镜像的这一步骤,这是比较慢的,我建议分开来做,所以这里就先提前拉取镜像。在master
节点操作如下指令:
如果大家看到开头的两行warning
信息(我这里没有打印),不必担心,这只是警告,不影响我们完成实验。
既然镜像已经拉取成功了,那我们就可以直接开始初始化了。
(3)初始化kubenetes
的master
节点
执行如下命令:
这个过程大概15s的时间就做完了,之所以初始化的这么快就是因为我们提前拉取了镜像。
像我上面这样的没有报错信息,并且显示最后的kubeadm join 192.168.50.128:6443 --token abcdef.0123456789abcdef
这些,说明我们的master是初始化成功的。
当然我们还需要按照最后的提示在使用kubernetes集群之前还需要再做一下收尾工作,注意是在master节点上执行的。
好了,此时的master节点就算是初始化完毕了。有个重要的点就是最后一行信息,这是node节点加入kubernetes集群的认证命令。这个密钥是系统根据sha256
算法计算出来的,必须持有这样的密钥才可以加入当前的kubernetes集群。
如果此时查看当前集群的节点,会发现只有master
节点自己。
接下来我们把node节点加入到kubernetes集群中
2.5、node
节点加入kubernetes
集群中
先把加入集群的命令明确一下,此命令是master节点初始化成功之后给出的命令。
注意,你的初始化之后与我的密钥指令肯定是不一样的,因此要用自己的命令才行,我这边是为了给大家演示才贴出来的。
(1)node1
节点加入集群
当看到This node has joined the cluster
,这一行信息表示node节点加入集群成功,
(2)node2
节点加入集群
node2
节点也是使用同样的方法来执行。所有的节点加入集群之后,此时我们可以在master节点执行如下命令查看此集群的现有节点。
可以看到集群的三个节点都已经存在,但是现在还不能用,也就是说集群节点是不可用的,原因在于上面的第2个字段,我们看到三个节点都是NotReady
状态,这是因为我们还没有安装网络插件,这里我们选择使用flannel插件。
2.6、安装Flannel
网络插件
Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreOS 主机拥有一个完整的子网。这次的分享内容将从Flannel的介绍、工作原理及安装和配置三方面来介绍这个工具的使用方法。
Flannel通过给每台宿主机分配一个子网的方式为容器提供虚拟网络,它基于Linux TUN/TAP
,使用UDP封装IP包来创建overlay网络,并借助etcd维护网络的分配情况
(1)默认方法
默认大家从网上的教程都会使用这个命令来初始化。
事实上很多用户都不能成功,因为国内网络受限,所以可以这样子来做。
(2)更换flannel
镜像源
修改本地的hosts
文件添加如下内容以便解析才能下载该文件
然后下载flannel文件
编辑镜像源,默认的镜像地址我们修改一下。把yaml文件中所有的quay.io 修改为quay-mirror.qiniu.com
此时保存保存退出。在master节点执行此命令。
这样子就可以成功拉取flannel镜像了。当然你也可以使用我提供给大家的kube-flannel.yml
文件。
- 查看
kube-flannel
的pod是否运行正常
(3)无法拉取镜像解决方法
像上面查看kube-flannel
的pod时发现不是Running
,这就表示该pod有问题,我们需要进一步分析。
执行kubectl describe pod xxxx
如果有以下报错:
或者是
上面的这些都表示是网络问题不能拉取镜像,我这里给大家提前准备了flannel的镜像。导入一下就可以了。
2.7、验证节点是否可用
稍等片刻,执行如下指令查看节点是否可用
目前节点状态是Ready
,表示集群节点现在是可用的。
3、测试kubernetes
集群
3.1、kubernetes
集群测试
(1)创建一个nginx
的pod
现在我们在kubernetes集群中创建一个nginx的pod,验证是否能正常运行。
在master节点执行一下步骤:
现在我们查看pod和service
打印的结果中,前半部分是pod相关信息,后半部分是service相关信息。我们看service/nginx
这一行可以看出service暴漏给集群的端口是32627
。记住这个端口。
然后从pod的详细信息可以看出此时pod在node1节点之上。node1节点的IP地址是192.168.50.129
(2)访问nginx
验证集群
那现在我们访问一下。打开浏览器(建议火狐浏览器),访问地址就是:http://192.168.50.129:32627
3.2、安装dashboard
(1)创建dashboard
先把dashboard的配置文件下载下来。由于我们之前已经添加了hosts
解析,因此可以下载。
默认Dashboard只能集群内部访问,修改Service
为NodePort
类型,暴露到外部:
大概在此文件的32-44
行之间,修改为如下:
- 运行此
yaml
文件
- 查看
dashboard
运行是否正常
从上面可以看出,kubernetes-dashboard-594b99b6f4-72zxw
运行所在的节点是node2
上面,并且暴漏出来的端口是30001
,所以访问地址是: https://192.168.50.130:30001
- 浏览器访问
访问的时候会让输入token
,从此处可以查看到token的值。
把上面的token
值输入进去即可进去dashboard界面。
不过现在我们虽然可以登陆上去,但是我们权限不够还查看不了集群信息,因为我们还没有绑定集群角色,同学们可以先按照上面的尝试一下,再来做下面的步骤
(2)cluster-admin
管理员角色绑定
再使用输出的token登陆dashboard即可。
4、集群报错总结
(1)拉取镜像报错没有找到
选择拉取的kubernetes镜像版本过高,因此需要降低一些,修改kubeadm-init.yaml
中的kubernetesVersion
即可。
(2)docker
存储驱动报错
在安装kubernetes
的过程中,经常会遇见如下错误
原因是docker
的Cgroup Driver
和kubelet
的Cgroup Driver
不一致。
1、修改docker的Cgroup Driver
修改/etc/docker/daemon.json
文件
重启docker即可
(3)node
节点报localhost:8080
拒绝错误
node
节点执行kubectl get pod
报错如下:
出现这个问题的原因是kubectl命令需要使用kubernetes-admin
密钥来运行
解决方法:
在master
节点上将/etc/kubernetes/admin.conf
文件远程复制到node节点的/etc/kubernetes
目录下,然后在node
节点配置一下环境变量
node
节点再次执行kubectl get pod
:
(4)node
节点加入集群身份验证报错
密钥复制的不对,重新把master初始化之后的加入集群指令复制一下,
(5)初始化master节点时,swap未关闭
关闭swap分区即可。
(6)执行kubectl get cs
显示组件处于非健康状态
修改scheduler
和controller-manager
两个组件的配置文件,分别将--port=0
去掉。配置文件的路径是/etc/kubernetes/manifests/
,下面有kube-controller-manager.yaml
和kube-scheduler.yaml
两个配置文件。
修改好之后保存一下即可,不需要手动重启服务。等个半分钟集群自动就恢复正常,再次执行kubectl get cs
命令就可以看到组件是正常的了。
(7)dashboard报错:Get [https://10.96.0.1:443/version](https://10.96.0.1/version): dial tcp 10.96.0.1:443: i/o timeout
出现这个问题实际上还是集群网络存在问题,但是如果你查看节点或者flannel的pod等等是正常的,所以还是排查不出来问题的。最快的解决方法让dashboard调度到master节点上就可以了。
修改dashboard的配置文件,将下面几行注释掉(大约在232-234行)
也就是将上面的最后三行注释掉。
接着是再增加选中的节点
大约在第190行,增加一行信息nodeName: master
保存好之后重新执行kubectl apply
命令申请加入集群即可。
如果想自己继续研究的话,多看看是不是flannel的网段定义的问题。
5、参考
个人参考的一些博客,在此记录一下:https://www.cnblogs.com/FengGeBlog/p/10810632.html
本文链接:http://www.yunweipai.com/38516.html