3 kubeadm 加 vip 安装一个简单的k8s集群并实现集群的高可用3.1 部署版本:3.2 部署工具的选择3.2.1 kubeadm:3.2.2 kubeadm 概述3.3 安装注意事项:3.4 部署过程分为以下几个大部分:3.5 部署架构及 kubernetes 1.17 版本的部署过程3.6 具体步骤3.6.1 K8s集群各个主节点设置3.6.2 配置各个节点主机网卡信息3.6.3 设置系统主机名以及 Host 文件的相互解析3.6.4 设置hosts文件,实现主机名解析3.6.5 禁用 swap 分区3.6.6 调整内核参数,对于 K8S3.6.7 调整系统时区3.6.8 在所有节点上安装docker3.6.8.1 在 master 安装依赖包,解决依赖关系3.6.8.1 安装 GPG 证书3.6.8.2 写入 docker ce 软件源信息3.6.8.3 更新并安装 Docker-CE 3.6.8.3.1 更新ubuntu的源信息3.6.8.3.2 查看安装的 Docker 版本3.6.8.3.3 在所有节点上安装 docker 5:19.03.9~3-0~ubuntu-bionic 版本3.6.8.3.4 启动docker并设置为开机启动3.6.8.3.5 配置所有节点得 daemon文件,和他的 docker 镜像加速3.6.9 在所有节点上安装KubeadmKubernetes 镜像简介配置方法Debian / UbuntuCentOS / RHEL / Fedora3.6.9.1 更新apt 源3.6.9.2 添加gpg的证书3.6.9.3 添加阿里源 K8S 镜像地址3.6.9.4 安装指定版本为1.17.1的kubeadm和kubelet及 kubectl3.6.10 在两个master节点安装keepalived实现K8S集群的高可用3.6.10.1 安装 keepalived3.6.10.2 配置 master节点的 vip 文件3.6.10.3 编辑/etc/keepalived/keepalived.conf 文件将我们的VIP添加进去3.6.10.4 验证VIP是否能够实现飘逸高可用3.6.11 在所有 K8S 集群主机中下载 K8S 安装的需要镜像3.6.11.1 通过安装K8S 集群所需镜像3.6.12 master – 1 节点上初始化:3.6.12.1 基于命令初始化高可用 master 方式:3.6.12.2 初始化完了之后启用集群3.6.12.2.1 K8S初始化之后的提示执行这三条命令3.6.12.3 下载 kube-flannel.yml 文件并编辑该文件解决pod的Pending状态3.6.12.3.1 下载kube-flannel.yml文件3.6.12.3.2 解决 flannel 组件 init 状态问题3.6.13 在 K8S 集群中加入 Master2 节点3.6.13.1 在 K8S master -1 节点上生成证书用于添加新的控制节点3.6.13.2、 在 master -2 节点上操作,使用新 key 加入到 K8S集群中3.6.13.3 在master2节点上执行K8S初始化之后的提示执行这三条命令3.6.13.4 解决 flannel 组件 init 状态问题3.6.14 验证 master-2 能否实现高可用3.6.15 添加两个node节点:3.6.15.1 启动kubelet服务,并设置为开机启动3.6.15.2 使用token将两个node节点加入到K8S集群中3.6.15.3 解决 flannel 组件 init 状态问题3.6.15.4 验证 node 节点是否加入到 K8S 集群中3.6.16 测试在k8s集群中运行nginx3.6.16.1 通过浏览器访问验证 nginx3.7 选择K8S的优点
3 kubeadm 加 vip 安装一个简单的k8s集群并实现集群的高可用
3.1 部署版本:
k8s1.17.1 版本
服务器版本:ubuntu 18.04 server
3.2 部署工具的选择
使用批量部署工具如(ansible/ saltstack)安装(使用较多)、手动二进制、kubeadm(使用较多)官方提供的一个安装部署工具,会将管理端都以容器的方式去运行、apt-get/yum 等方式安装,以守护进程的方式启动在宿主机上,类似于是 Nginx 一样使用service 脚本启动。K8s一年会更新4个大版本,更新较快。
3.2.1 kubeadm:
使用 k8s 官方提供的部署工具 kubeadm 自动安装,需要在 master 和 node 节点上安装docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以pod 的方式运行。
kubeadm 介绍:
https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/
3.2.2 kubeadm 概述
Kubeadm 是一个工具,它提供了 kubeadm init (初始化master)以及 kubeadm join 这两个命令作为快速创建 kubernetes 集群的最佳实践。
kubeadm 通过执行必要的操作来启动和运行一个最小可用的集群。它被故意设计为只关心启动集群,而不是之前的节点准备工作。同样的,诸如安装各种各样值得拥有的插件,例如 Kubernetes Dashboard、监控解决方案以及特定云提供商的插件,这些都不在它负责的范围。相反,我们期望由一个基于 kubeadm 从更高层设计的更加合适的工具来做这些事情;并且,理想情况下,使用 kubeadm 作为所有部署的基础将会使得创建一个符合期望的集群变得容易。
-
(该命令使用较多)启动一个 Kubernetes 主节点,master
-
(该命令使用较多)启动一个 Kubernetes 工作节点并且将其加入到集群node节点
-
(该命令使用较多)更新一个 Kubernetes 集群到新版本(用于K8S的版本升级)
-
如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要对集群做一些配置以便使用 kubeadm upgrade 命令
-
管理 kubeadm join 使用的令牌,这个令牌是一个临时的字符串,有效期默认为24小时,超出有效期之后,要是哦那个kubeadm token这个命令重新获取,所以我们创建了一个K8S集群以后,后期想将一个新的node节点加进去的话会再次使用kubeadm token命令让他生成一个零时的认证,然后再加到集群中
-
还原 kubeadm init 或者 kubeadm join 对主机所做的任何更改,其实就是整个环境进行初始化,
-
打印 kubeadm 版本
-
预览一组可用的新功能以便从社区搜集反馈
3.3 安装注意事项:
注意:禁用swap,selinux,iptables
3.4 部署过程分为以下几个大部分:
-
进行初始化:kubeadm init,这个init主要是初始化master将master上的服务都要装上
-
配置认证:基于配置文件来做,在master上能够由权限通过K8S进行某些操作
-
添加node节点
3.5 部署架构及 kubernetes 1.17 版本的部署过程
-
需要使用 5 台服务器
-
Master1:172.16.18.101
-
Master2:172.16.18.102
-
vip地址:172.16.18.188
-
Node1:172.16.18.103
-
Node2:172.16.18.104
-
harbor:172.16.18.105
-
service 的地址为:172.31.0.0/16
-
pod 的 ip 为10.10.0.0/16
这个结构就是我们有两个管理端(两个master)来实现master的高可用,当其中一个master宕机了之后,我们的k8s集群还能使用。我们让这两个master中间通过VIP来实现高可用。我们访问K8S都是直接访问VIP的地址,这个VIP地址我们通过keepalived让他在master1和master2上来做高可用,默认情况下让他跑在master1上,如果master1宕机了让他飘到master2上。这个VIP在那个master上就由那个master来提供K8S的服务,这是一种高可用的方式。在往下就是node节点了。这些node节点就是正真运行容器的地方,当我们要创建容器的时候就是先访问到VIP地址172.16.18.188,基于这个vip地址来下发指令,让他创建各个容器,这些所有的node节点都是被这个vip地址172.16.18.188所管理的。
3.6 具体步骤
部署版本为当前次新版本,因为后面需要使用 kubeadm 做 kubernetes 版本升级演示。
1、在master 节点上先安装 kubelet,docker,kubeadm
2、master 节点运行 kubeadm init 初始化命令
3、验证 master 节点状态
4、在各个 node 节点安装 kubeadm:为了在node节点上执行 命令将node节点指定到某个master上、kubectl、docker 环境
5、在 node 节点使用 kubeadm 命令将自己加入 k8s master(需要使用 master 生成token 认证有效期为24小时)
6、到master节点上验证 node 节点状态是否加入该集群
7、启动nginx容器测试访问页面。
3.6.1 K8s集群各个主节点设置
K8S-master主节点设置
主节点我们给到得内存至少是4个G以上因为毕竟是工作节点。处理器设置为4个,然后网络设置为桥接(所有K8S集群得主机我们都设置为桥接模式)
master-1节点
master-2 节点
K8S-node 节点配置
node-1节点配置
node-2 节点配置
harbor 节点配置
3.6.2 配置各个节点主机网卡信息
对应上面我分配得地址自行配置
#配置网卡
[14:36:56 root@U-1 ~]#vim /etc/netplan/50-cloud-init.yaml
addresses:
- 172.16.18.101/16 #因为是使用桥接所以和桥接主机网段一样都是使用 172.16
gateway4: 172.16.0.1 #配置我们得网关
#重启网卡
[14:45:54 root@U-1 ~]#netplan apply
每个节点都按照上面得配置,然后我这就不重复步骤了。
3.6.3 设置系统主机名以及 Host 文件的相互解析
master-1节点设置
#修改主机名
[14:50:47 root@U-1 ~]#hostnamectl set-hostname k8s-master-1
#退出当前终端使其生效
[14:51:01 root@U-1 ~]#exit
master-2节点设置
[14:41:02 root@U-1 ~]#hostnamectl set-hostname k8s-master-2
[14:52:27 root@U-1 ~]#exit
node-1节点设置
[14:42:00 root@U-1 ~]#hostnamectl set-hostname k8s-node-1
[14:53:03 root@U-1 ~]#exit
node-2节点设置
[14:44:06 root@U-1 ~]#hostnamectl set-hostname k8s-node-2
[14:53:37 root@U-1 ~]#exit
3.6.4 设置hosts文件,实现主机名解析
1、在 master-1节点上配置
[15:13:31 root@k8s-master-1 ~]#vim /etc/hosts
#加上我们这个K8S的IP 和主机名
172.16.18.101 k8s-master-1
172.16.18.102 k8s-master-2
172.16.18.103 k8s-node-1
172.16.18.104 k8s-node-2
2、通过 scp 拷贝之后端该集群不同节点主机上。
#拷贝至 master-2 节点上
[15:16:02 root@k8s-master-1 ~]#scp /etc/hosts root@172.16.18.102:/etc/hosts
#拷贝至 node-1 节点上
[15:16:02 root@k8s-master-1 ~]#scp /etc/hosts root@172.16.18.103:/etc/hosts
#拷贝至 node-2 节点上
[15:16:02 root@k8s-master-1 ~]#scp /etc/hosts root@172.16.18.104:/etc/hosts
3.6.5 禁用 swap 分区
关闭swap分区,并且永久关闭虚拟内存,原因是我们的kubeadm在安装K8S的时候init初始化会去检测swap分区到底有么有关闭,因为如果开启了虚拟内存的话容器pod就有可能会放到虚拟内存里面去运行,会大大的降低他的工作效率、所以就会要求强制关闭、在生产当中建议把swap关闭,防止容器运行在虚拟内存的情况。
1、master -1 节点操作
[15:47:27 root@k8s-master-1 ~]#swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2、master -2 节点操作
[15:32:18 root@k8s-master-2 ~]#swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
3、node-1 节点操作
[15:32:20 root@k8s-node-1 ~]#swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
4、node-2 节点操作
[15:32:20 root@k8s-node-1 ~]#swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
3.6.6 调整内核参数,对于 K8S
1、调整内核优化参数。
<
pre class=”md-fences mock-cm md-end-block” lang=”bash” spellcheck=”false”>[15:51:38 root@k8s-master-1 ~]#cat > kubernetes.conf <
2、然后我们将这个优化的文件拷贝到/etc/sysctl.d/kubernetes.conf下让虚拟机开机的时候能够自动调用
[15:57:57 root@k8s-master-1 ~]#cp kubernetes.conf /etc/sysctl.d/kubernetes.conf
3、通过 scp 分发给K8S集群得各个主机。
#拷贝至 master-2 主机
[15:59:34 root@k8s-master-1 ~]#scp kubernetes.conf root@172.16.18.102:/etc/sysctl.d/kubernetes.conf
#拷贝至 node-1 主机
[16:00:25 root@k8s-master-1 ~]#scp kubernetes.conf root@172.16.18.103:/etc/sysctl.d/kubernetes.conf
#拷贝至 node-2 主机
[16:00:31 root@k8s-master-1 ~]#scp kubernetes.conf root@172.16.18.104:/etc/sysctl.d/kubernetes.conf
4、手动刷新kubernetes.conf文件让他立马生效
#master -1 节点刷新
[16:00:39 root@k8s-master-1 ~]#sysctl -p /etc/sysctl.d/kubernetes.conf
#master -2 节点刷新
[15:48:54 root@k8s-master-2 ~]#sysctl -p /etc/sysctl.d/kubernetes.conf
#node -1 节点刷新
[15:48:56 root@k8s-node-1 ~]#sysctl -p /etc/sysctl.d/kubernetes.conf
#node -2 节点刷新
[15:48:59 root@k8s-node-2 ~]#sysctl -p /etc/sysctl.d/kubernetes.conf
3.6.7 调整系统时区
# 设置系统时区为 中国/上海
timedatectl set-timezone Asia/Shanghai
# 将当前的 UTC 时间写入硬件时钟
timedatectl set-local-rtc 0
# 重启依赖于系统时间的服务
systemctl restart rsyslog
1、master -1 节点操作
[16:01:43 root@k8s-master-1 ~]#timedatectl set-timezone Asia/Shanghai
[16:03:49 root@k8s-master-1 ~]#timedatectl set-local-rtc 0
[16:04:00 root@k8s-master-1 ~]#systemctl restart rsyslog
2、master -2 节点操作
[16:02:47 root@k8s-master-2 ~]#timedatectl set-timezone Asia/Shanghai
[16:03:51 root@k8s-master-2 ~]#timedatectl set-local-rtc 0
[16:04:02 root@k8s-master-2 ~]#systemctl restart rsyslog
3、node -1 节点操作
[16:02:48 root@k8s-node-1 ~]#timedatectl set-timezone Asia/Shanghai
[16:03:53 root@k8s-node-1 ~]#timedatectl set-local-rtc 0
[16:04:04 root@k8s-node-1 ~]#systemctl restart rsyslog
4、node-2 节点操作
[16:02:49 root@k8s-node-2 ~]#timedatectl set-timezone Asia/Shanghai
[16:03:55 root@k8s-node-2 ~]#timedatectl set-local-rtc 0
[16:04:06 root@k8s-node-2 ~]#systemctl restart rsyslog
3.6.8 在所有节点上安装docker
3.6.8.1 在 master 安装依赖包,解决依赖关系
1、在master -1 节点上安装
[15:19:10 root@k8s-master-1 ~]#sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
2、在 master -2 节点上安装
[14:52:29 root@k8s-master-2 ~]#sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
3、在 node-1 节点上安装
[14:52:29 root@k8s-node-1 ~]#sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
4、在 node-2 节点上安装
[14:52:29 root@k8s-node-2 ~]#sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
3.6.8.1 安装 GPG 证书
1、master -1 节点操作
[15:20:15 root@k8s-master-1 ~]#curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
OK #提示成功
2、master -2 节点操作
[15:20:57 root@k8s-master-2 ~]#curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
OK #提示成功
3、node -1 节点操作
[16:16:27 root@k8s-node-1 ~]#curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
OK
4、node -2 节点操作
[16:13:55 root@k8s-node-2 ~]#curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
OK
3.6.8.2 写入 docker ce 软件源信息
1、master -1 节点操作
[15:25:08 root@k8s-master-1 ~]#sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
2、master -2 节点操作
[15:25:18 root@k8s-master-2 ~]#sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
3、node -1 节点操作
[16:16:59 root@k8s-node-1 ~]#sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
4、node -2 节点操作
[16:16:59 root@k8s-node-2 ~]#sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
3.6.8.3 更新并安装 Docker-CE
3.6.8.3.1 更新ubuntu的源信息
1、在master -1 节点上更新
[17:18:15 root@k8s-master-1 ~]#apt-get -y update
2、在master -2节点上更新
[16:08:42 root@k8s-master-2 ~]#apt-get -y update
3、在node -1 节点上更新
[17:13:09 root@k8s-node-1 ~]#apt-get -y update
4、在node -1 节点上更新
[17:13:11 root@k8s-node-2 ~]#apt-get -y update
3.6.8.3.2 查看安装的 Docker 版本
[17:18:34 root@k8s-master-1 ~]#apt-cache madison docker-ce
3.6.8.3.3 在所有节点上安装 docker 5:19.03.9~3-0~ubuntu-bionic 版本
1、master -1 节点上安装
[17:52:46 root@k8s-master-1 ~]#apt-get -y install docker-ce=5:19.03.9~3-0~ubuntu-bionic docker-ce-cli=5:19.03.9~3-0~ubuntu-bionic
2、master -2 节点上安装
[17:20:00 root@k8s-master-2 ~]#apt-get -y install docker-ce=5:19.03.9~3-0~ubuntu-bionic docker-ce-cli=5:19.03.9~3-0~ubuntu-bionic
3、node-1 节点上安装
[17:57:34 root@k8s-node-1 ~]#apt-get -y install docker-ce=5:19.03.9~3-0~ubuntu-bionic docker-ce-cli=5:19.03.9~3-0~ubuntu-bionic
4、node -2 节点上安装
[17:57:34 root@k8s-node-2 ~]#apt-get -y install docker-ce=5:19.03.9~3-0~ubuntu-bionic docker-ce-cli=5:19.03.9~3-0~ubuntu-bionic
3.6.8.3.4 启动docker并设置为开机启动
1、master -1 节点上操作
[17:56:32 root@k8s-master-1 ~]#systemctl start docker && systemctl enable docker
2、master -2 节点上操作
[17:56:32 root@k8s-master-2 ~]#systemctl start docker && systemctl enable docker
3、node -1 节点上操作
[18:00:06 root@k8s-node-1 ~]#systemctl start docker && systemctl enable docker
4、 node-2 节点上操作
[18:00:06 root@k8s-node-2 ~]#systemctl start docker && systemctl enable docker
3.6.8.3.5 配置所有节点得 daemon文件,和他的 docker 镜像加速
所有节点主机上的 /etc/目录下创建一个docker的文件,并配置docker 加速文件
1、master -1 节点上操作
#创建docker 文件
[18:01:18 root@k8s-master-1 ~]#sudo mkdir -p /etc/docker
#添加 docker 镜像加速地址
[18:02:41 root@k8s-master-1 ~]#cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://hpqoo1ip.mirror.aliyuncs.com"]
}
EOF
#重新加载系统配置
[18:09:22 root@k8s-master-1 ~]#sudo systemctl daemon-reload
#重启docker服务
[18:09:35 root@k8s-master-1 ~]#sudo systemctl restart docker
2、master-2 节点操作
#创建docker 文件
[18:01:18 root@k8s-master-2 ~]#sudo mkdir -p /etc/docker
#添加 docker 镜像加速地址
[18:02:41 root@k8s-master-2 ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://hpqoo1ip.mirror.aliyuncs.com"]
}
#重新加载系统配置
[18:09:22 root@k8s-master-2 ~]#sudo systemctl daemon-reload
#重启docker服务
[18:09:35 root@k8s-master-2 ~]#sudo systemctl restart docker
3、node-1 节点操作
#创建docker 文件
[18:01:18 root@k8s-node-1 ~]#sudo mkdir -p /etc/docker
#添加 docker 镜像加速地址
[18:02:41 root@k8s-node-1 ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://hpqoo1ip.mirror.aliyuncs.com"]
}
#重新加载系统配置
[18:09:22 root@k8s-node-1 ~]#sudo systemctl daemon-reload
#重启docker服务
[18:09:35 root@k8s-node-1 ~]#sudo systemctl restart docker
4、node-2 节点操作
#创建docker 文件
[18:01:18 root@k8s-node-2 ~]#sudo mkdir -p /etc/docker
#添加 docker 镜像加速地址
[18:02:41 root@k8s-node-2 ~]#vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://hpqoo1ip.mirror.aliyuncs.com"]
}
#重新加载系统配置
[18:09:22 root@k8s-node-2 ~]#sudo systemctl daemon-reload
#重启docker服务
[18:09:35 root@k8s-node-2 ~]#sudo systemctl restart docker
3.6.9 在所有节点上安装Kubeadm
docker安装好了之后我们就可以安装我们的 kubeadm ,在安装的时候他会导入阿里云的yum 仓库
https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.53322f70ezisiM
我们是ubuntu的系统所以使用ubuntu的配置方法
Kubernetes 镜像
简介
Kubernetes 是一个开源系统,用于容器化应用的自动部署、扩缩和管理。它将构成应用的容器按逻辑单位进行分组以便于管理和发现。
下载地址:https://mirrors.aliyun.com/kubernetes/
配置方法
Debian / Ubuntu
apt-get update && apt-get install -y apt-transport-https curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat > /etc/apt/sources.list.d/kubernetes.list << EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectl
CentOS / RHEL / Fedora
cat </etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF setenforce 0 yum install -y kubelet kubeadm kubectl systemctl enable kubelet && systemctl start kubelet
ps: 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用 yum install -y --nogpgcheck kubelet kubeadm kubectl
安装
3.6.9.1 更新apt 源
1、master -1 操作
[18:19:44 root@k8s-master-1 ~]#apt-get update && apt-get install -y apt-transport-https
2、master -2 操作
[18:19:44 root@k8s-master-2~]#apt-get update && apt-get install -y apt-transport-https
3、node-1 操作
[18:11:36 root@k8s-node-1 ~]#apt-get update && apt-get install -y apt-transport-https
4、node-2 操作
[18:11:36 root@k8s-node-2 ~]#apt-get update && apt-get install -y apt-transport-https
3.6.9.2 添加gpg的证书
1、 master-1 操作
[18:19:51 root@k8s-master-1 ~]#curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
2、master-2 操作
[18:19:51 root@k8s-master-2 ~]#curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
3、node-1 操作
[18:21:00 root@k8s-node-1 ~]#curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
4、node-2 操作
[18:21:00 root@k8s-node-2 ~]#curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
3.6.9.3 添加阿里源 K8S 镜像地址
1、master -1 操作
#配置K8S 下载进行源
[18:22:10 root@k8s-master-1 ~]#cat > /etc/apt/sources.list.d/kubernetes.list << EOF
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
#更新 apt 源
[18:24:28 root@k8s-master-1 ~]#apt update
2、master -2 操作
#配置K8S 下载进行源
[18:22:12 root@k8s-master-2 ~]#vim /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
#更新 apt 源
[18:24:39 root@k8s-master-2 ~]#apt update
3、node-1 操作
#配置K8S 下载进行源
[18:22:13 root@k8s-node-1 ~]#vim /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
#更新 apt 源
[18:24:39 root@k8s-node-1 ~]#apt update
4、node-2 操作
#配置K8S 下载进行源
[18:22:14 root@k8s-node-2 ~]#vim /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
#更新 apt 源
[18:24:39 root@k8s-node-2 ~]#apt update
3.6.9.4 安装指定版本为1.17.1的kubeadm和kubelet及 kubectl
升级完了软件包列表之后,我们开始安装kuberadm等命令。
1、随便在一台节点上使用 apt-cache madison kubeadm
命令查看 kubeadm 的版本信息
[18:26:22 root@k8s-master-1 ~]#apt-cache madison kubeadm kubelet kubectl
2、集群所有主机指定安装 1.17.1 版本
1)master -1 节点上安装
[18:28:33 root@k8s-master-1 ~]#apt install kubectl=1.17.1-00 kubelet=1.17.1-00 kubeadm=1.17.1-00 -y
2)master-2 节点上安装
[18:26:56 root@k8s-master-2 ~]#apt install kubectl=1.17.1-00 kubelet=1.17.1-00 kubeadm=1.17.1-00 -y
3)node-1 节点上安装
[18:32:21 root@k8s-node-1 ~]#apt install kubectl=1.17.1-00 kubelet=1.17.1-00 kubeadm=1.17.1-00 -y
4)node-2 节点上安装
[18:32:21 root@k8s-node-2 ~]#apt install kubectl=1.17.1-00 kubelet=1.17.1-00 kubeadm=1.17.1-00 -y
3.6.10 在两个master节点安装keepalived实现K8S集群的高可用
3.6.10.1 安装 keepalived
1、在master -1 节点上下载keepalived
[18:36:15 root@k8s-master-1 ~]#apt install keepalived -y
2、在master -2 节点上下载keepalived
[18:36:15 root@k8s-master-2 ~]#apt install keepalived -y
3.6.10.2 配置 master节点的 vip 文件
Keepalived默认是没有配置文件的,所以我们需要将他的模板配置文件拷贝到/etc/keeplived下。
1、使用find / -name keepalived*找到模板文件
[18:37:03 root@k8s-master-1 ~]#find / -name keepalived*
2、 拷贝到/etc/keepalived/下并改名为keepalived.conf
1)master -1 节点上操作
[18:39:39 root@k8s-master-1 ~]#cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf
2)master -2 节点上操作
[18:36:18 root@k8s-master-2 ~]#cp /usr/share/doc/keepalived/samples/keepalived.conf.vrrp /etc/keepalived/keepalived.conf
3.6.10.3 编辑/etc/keepalived/keepalived.conf 文件将我们的VIP添加进去
1、master -1 节点上操作。
#编辑 keepalived 配置文件
[18:42:39 root@k8s-master-1 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # master 节点
interface eth0 # 绑定在 eth0
garp_master_delay 10
smtp_alert
virtual_router_id 1 #路由 ID 两台主机必须相同
priority 100 #优先级为 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.18.188/16 dev eth0 label eth0:1
}
}
#启动 keepalived 并设置开机自启,服务观察 VIP 是否生成
[18:48:47 root@k8s-master-1 ~]#systemctl enable --now keepalived.service
#通过 grep 过滤 VIP 已经生成
[18:50:24 root@k8s-master-1 ~]#ip a | grep 172.16.18.188
inet 172.16.18.188/16 scope global eth0:1
2、master -2 节点上编辑。
#编辑 keepalived 配置文件
[18:50:37 root@k8s-master-2 ~]#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
acassen
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP #backup 节点
interface eth0
garp_master_delay 10
smtp_alert
virtual_router_id 1 #两台路由 ID 必须相同
priority 80 #优先级为80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111 #两个keepalived主机密码相同
}
virtual_ipaddress {
172.16.18.188/16 dev eth0 label eth0:1 #VIP地址绑定在eth0 上
}
}
#启动 keepalived 并设置开机自启
[18:54:22 root@k8s-master-2 ~]#systemctl enable --now keepalived.service
3.6.10.4 验证VIP是否能够实现飘逸高可用
1、现在我们将master1节点的keepalived服务宕了,观察VIP是否能够漂移到master2上
[19:02:43 root@k8s-master-1 ~]#systemctl stop keepalived.service
2、在master 2 节点上观察 VIP 已经实现了飘逸
[19:07:44 root@k8s-master-2 ~]#ip a | grep 172.16.18.188
inet 172.16.18.188/16 scope global secondary eth0:1
3、在回到 master -1 节点上启动keepalived服务
[19:07:48 root@k8s-master-1 ~]#systemctl start keepalived.service
3.6.11 在所有 K8S 集群主机中下载 K8S 安装的需要镜像
镜像最好提前下载下来,但是镜像默认使用 Google 的镜像仓库, 所以国内无法直接下载,但是可以通过阿里云的镜像仓库把镜像先提前下载下来, 可以避免后期因镜像下载异常而导致k8s 部署异常。
1、在任意一台 K8S 集群主机上查看安装指定的 K8S 1.17.1 需要那些镜像
[19:19:13 root@k8s-master-1 ~]#kubeadm config images list --kubernetes-version v1.17.1
k8s.gcr.io/kube-apiserver:v1.17.1
k8s.gcr.io/kube-controller-manager:v1.17.1
k8s.gcr.io/kube-scheduler:v1.17.1
k8s.gcr.io/kube-proxy:v1.17.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.5
3.6.11.1 通过安装K8S 集群所需镜像
1、master -1 节点上操作
#安装 kube-apiserver 组件镜像
[19:19:16 root@k8s-master-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.1
#拉取 kube-controller-manager:v1.17.1 组件
[19:22:36 root@k8s-master-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.1
#拉取 kube-scheduler:v1.17.1 组件
[19:23:27 root@k8s-master-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.1
#拉取 kube-proxy:v1.17.1 组件
[19:24:35 root@k8s-master-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.1
#拉取 pause:3.1 组件
[19:25:08 root@k8s-master-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
#拉取 etcd:3.4.3-0 组件
[19:25:43 root@k8s-master-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
#拉取 coredns 1.6.5 组件
[19:26:18 root@k8s-master-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
2、master -2 节点操作
#安装 kube-apiserver 组件镜像
[19:19:16 root@k8s-master-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.1
#拉取 kube-controller-manager:v1.17.1 组件
[19:22:36 root@k8s-master-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.1
#拉取 kube-scheduler:v1.17.1 组件
[19:23:27 root@k8s-master-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.1
#拉取 kube-proxy:v1.17.1 组件
[19:24:35 root@k8s-master-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.1
#拉取 pause:3.1 组件
[19:25:08 root@k8s-master-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
#拉取 etcd:3.4.3-0 组件
[19:25:43 root@k8s-master-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
#拉取 coredns 1.6.5 组件
[19:26:18 root@k8s-master-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
3、node -1 节点操作
#安装 kube-apiserver 组件镜像
[19:19:16 root@k8s-node-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.1
#拉取 kube-controller-manager:v1.17.1 组件
[19:22:36 root@k8s-node-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.1
#拉取 kube-scheduler:v1.17.1 组件
[19:23:27 root@k8s-node-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.1
#拉取 kube-proxy:v1.17.1 组件
[19:24:35 root@k8s-node-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.1
#拉取 pause:3.1 组件
[19:25:08 root@k8s-node-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
#拉取 etcd:3.4.3-0 组件
[19:25:43 root@k8s-node-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
#拉取 coredns 1.6.5 组件
[19:26:18 root@k8s-node-1 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
4、node -2 节点操作
#安装 kube-apiserver 组件镜像
[19:19:16 root@k8s-node-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-apiserver:v1.17.1
#拉取 kube-controller-manager:v1.17.1 组件
[19:22:36 root@k8s-node-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-controller-manager:v1.17.1
#拉取 kube-scheduler:v1.17.1 组件
[19:23:27 root@k8s-node-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-scheduler:v1.17.1
#拉取 kube-proxy:v1.17.1 组件
[19:24:35 root@k8s-node-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.1
#拉取 pause:3.1 组件
[19:25:08 root@k8s-node-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1
#拉取 etcd:3.4.3-0 组件
[19:25:43 root@k8s-node-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.4.3-0
#拉取 coredns 1.6.5 组件
[19:26:18 root@k8s-node-2 ~]#docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/coredns:1.6.5
3.6.12 master - 1 节点上初始化:
首先基于keepalived 实现高可用VIP,然后实现基于VIP 的高可用master。初始化仅一台master上初始化即可。所以我们的master2节点主机就不用初始化了,在master1初始化之后再将master2节点加到里面即可
参数解析:
--apiserver-advertise-address=172.16.18.101: #我们的master节点主机ip
--control-plane- endpoint=172.16.18.188: #用户请求访问ip
--apiserver-bind-port=6443: #对外暴露端口
--kubernetes-version=v1.17.1: #K8S版本号
--pod- network-cidr=10.10.0.0/16: #后端pod服务器内部ip地址池
--service-cidr=172.16.0.0/16: #service ip地址池
--service-dns-domain=linux38.local: #DNS解析域名
-- image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers:#使用的是阿里镜像仓库
--ignore-preflight- errors=swap: #忽略swap分区
3.6.12.1 基于命令初始化高可用 master 方式:
1、在master -1 节点上操作
[19:26:39 root@k8s-master-1 ~]#kubeadm init --apiserver-advertise-address=172.16.18.101 --control-plane-endpoint=172.16.18.188 --apiserver-bind-port=6443 --kubernetes-version=v1.17.1 --pod-network-cidr=10.10.0.0/16 --service-cidr=172.30.0.0/16 --service-dns-domain=linux38.local --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers --ignore-preflight-errors=swap
3.6.12.2 初始化完了之后启用集群
初始化完成之后会提示:
您的Kubernetes控制面板已成功初始化!
要开始使用群集,您需要以普通用户身份运行以下命令:
mkdir -p $ HOME / .kube
sudo cp -i /etc/kubernetes/admin.conf $ HOME / .kube / config
sudo chown $ {id -u):$ {id -g)$ HOME / .kube / config
现在,您应该将Pod网络部署到群集。
使用列出的选项之一运行“ kubectl apply -f [podnetwork] .yaml”:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
现在,您可以通过复制证书颁发机构来加入任意数量的控制平面节点
和每个节点上的服务帐户密钥,然后以超级用户身份运行以下命令:
#这是我们 K8S 集群添加新节点的 token 值,一定要保存好
kubeadm join 172.16.18.188:6443 --token dae93q.kr1vqn3zww1usaca \
--discovery-token-ca-cert-hash sha256:b6db906c943e0fff4b0f673fef34c886434df83e4bfc188c2acaf53daae83bcb \
--control-plane
3.6.12.2.1 K8S初始化之后的提示执行这三条命令
kdir -p $HOME/.kube #这是再当前目录下创建一个.kube文件
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config #然后将admin.conf文件拷贝到.kube中
sudo chown $(id -u):$(id -g) $HOME/.kube/config #这是添加这个用户的组和用户id信息
1、master -1 节点上操作
[19:41:09 root@k8s-master-1 ~]#mkdir -p $HOME/.kube
[19:45:28 root@k8s-master-1 ~]#sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[19:45:31 root@k8s-master-1 ~]#sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.6.12.3 下载 kube-flannel.yml 文件并编辑该文件解决pod的Pending状态
1、在 master -1 节点执行kubectl get node
命令来获取节点信息,这个命令获取到的信息就是通过.kube/config文件得到的。
#该命令查看当前有几个node节点
[19:45:36 root@k8s-master-1 ~]#kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 NotReady master 5m34s v1.17.1
2、查看 pod 信息
因为现在的 K8S 还缺少我们的网络组件所以得给他下载一个 flannel 的网络插件
#kubectl get pod -A 查看所有的pod状态会发现有两个coredns的pod状态是待定(Pending)的
[19:49:47 root@k8s-master-1 ~]#kubectl get pod -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7f9c544f75-dsxgj 0/1 Pending 0 12m
kube-system coredns-7f9c544f75-xl6q2 0/1 Pending 0 12m
kube-system etcd-k8s-master-1 1/1 Running 0 12m
kube-system kube-apiserver-k8s-master-1 1/1 Running 0 12m
kube-system kube-controller-manager-k8s-master-1 1/1 Running 0 12m
kube-system kube-proxy-wz2qj 1/1 Running 0 12m
kube-system kube-scheduler-k8s-master-1 1/1 Running 0 12m
3.6.12.3.1 下载kube-flannel.yml文件
1、master -1 节点上操作
[20:02:08 root@k8s-master-1 ~]#wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
2、在这个文件中找到 10.244.0.0/16 这一行改为我们的pod的ip地址段即可10.10.0.0/16
[20:06:10 root@k8s-master-1 ~]#vim kube-flannel.yml
"Network": "10.10.0.0/16",
3、将这个kube-flannel.yml 文件执行使 pod 的 ip 生成
[20:06:43 root@k8s-master-1 ~]#kubectl apply -f kube-flannel.yml
4、但是再次通过查看说有 pod 节点我们的 flannel 是不能拉取镜像状态,报错INIT:。
[20:10:40 root@k8s-master-1 ~]#kubectl get pod -A
3.6.12.3.2 解决 flannel 组件 init 状态问题
这是因为QUAY.IO国内无法访问,解决KUBERNETES应用FLANNEL失败,报错INIT:
原因查看kube-flannel.yml文件时发现quay.io/coreos/flannel:v0.12.0-amd64 。quay.io网站目前国内无法访问
flannel 下载地址GitHub 下载地址:https://github.com/coreos/flannel/releases
flannel 红帽镜像下载地址:https://quay.io/repository/coreos/flannel?tab=tags
1、下载flannel:v0.12.0-amd64导入到docker中或者去https://github.com/coreos/flannel/releases官方仓库下载镜像
2、将下载好的 flannel 容器上传至服务器导入到 master -1 节点
[20:22:25 root@k8s-master-1 ~]#docker load < flanneld-v0.12.0-amd64.docker
3、再次查看就会发现我们得flannel插件已启动
[20:22:34 root@k8s-master-1 ~]#kubectl get pod -n kube-system
4、查看会发现我们的K8Smaster节点已经运行了
[20:23:03 root@k8s-master-1 ~]#kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 42m v1.17.1
5、并且通过ifconfig 查看到多了一张flannel得网卡,而且该网卡得地址正好是我们在K8S得配置文件中指定得10.100.0
[20:31:28 root@k8s-master-1 ~]#ifconfig flannel.1
flannel.1: flags=4163 mtu 1450
inet 10.10.0.0 netmask 255.255.255.255 broadcast 0.0.0.0
ether fa:9a:f2:0d:c5:1a txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3.6.13 在 K8S 集群中加入 Master2 节点
3.6.13.1 在 K8S master -1 节点上生成证书用于添加新的控制节点
在已经安装好了kubeadm主机(master1)上使用下面条命令生成证书,这是让他打出了他的他的 key 值这里得到的是
master -1 操作
[22:02:34 root@k8s-master-1 ~]#kubeadm init phase upload-certs --upload-certs
W0818 22:04:04.527474 101947 version.go:101] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get https://storage.googleapis.com/kubernetes-release/release/stable-1.txt: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
W0818 22:04:04.527536 101947 version.go:102] falling back to the local client version: v1.17.1
W0818 22:04:04.527611 101947 validation.go:28] Cannot validate kube-proxy config - no validator is available
W0818 22:04:04.527626 101947 validation.go:28] Cannot validate kubelet config - no validator is available
[upload-certs] Storing the certificates in Secret "kubeadm-certs" in the "kube-system" Namespace
[upload-certs] Using certificate key:
da9acabfef1fd2fe235dd94c635b20922e8ed747876408d1e3ccfe99eb3471b6 #新的key值
3.6.13.2、 在 master -2 节点上操作,使用新 key 加入到 K8S集群中
因为我们需要添加--control-plane --certificate-key 参数来实现key的验证。在master2节点上安装完了之后系统会提示
Run 'kubectl get nodes' to see this node join the cluster.解释为:运行“ kubectl获取节点”以查看该节点加入集群。
#注意他加的时候是用 VIP 的地址加进去的,而不是使用本地地址,使用本地地址是加不进去的
[22:04:45 root@k8s-master-2 ~]#kubeadm join 172.16.18.188:6443 --token dae93q.kr1vqn3zww1usaca --discovery-token-ca-cert-hash sha256:b6db906c943e0fff4b0f673fef34c886434df83e4bfc188c2acaf53daae83bcb --control-plane --certificate-key da9acabfef1fd2fe235dd94c635b20922e8ed747876408d1e3ccfe99eb3471b6
kubeadm join 172.16.18.188:6443 #使用的是VIP 地址然后是master -1 节点上的6443端口
--token dae93q.kr1vqn3zww1usaca --discovery-token-ca-cert-hash sha256:b6db906c943e0fff4b0f673fef34c886434df83e4bfc188c2acaf53daae83bcb #这段是在master -1 节点初始化上
--control-plane --certificate-key da9acabfef1fd2fe235dd94c635b20922e8ed747876408d1e3ccfe99eb3471b6 #添加key验证
3.6.13.3 在master2节点上执行K8S初始化之后的提示执行这三条命令
三条命令是加上之后才能够使用kubectl get node -A命令查看节点集群节点信息,他起到了一个验证的作用,不然他会报错为连接拒绝
[22:18:13 root@k8s-master-2 ~]#mkdir -p $HOME/.kube
[22:18:16 root@k8s-master-2 ~]#sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[22:18:19 root@k8s-master-2 ~]#sudo chown $(id -u):$(id -g) $HOME/.kube/config
3.6.13.4 解决 flannel 组件 init 状态问题
这是因为QUAY.IO国内无法访问,解决KUBERNETES应用FLANNEL失败,报错INIT:
原因查看kube-flannel.yml文件时发现quay.io/coreos/flannel:v0.12.0-amd64 。quay.io网站目前国内无法访问
1、下载flannel:v0.12.0-amd64导入到docker中或者去https://github.com/coreos/flannel/releases官方仓库下载镜像
2、在master -2 节点上查看状态时没有准备好的
[22:21:31 root@k8s-master-2 ~]#kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 21m v1.17.1
k8s-master-2 NotReady master 17m v1.17.1
3、并且 flannel 组件是 init 状态
4、将下载好的 flannel 容器上传至服务器导入到 master -2 节点
[22:25:52 root@k8s-master-2 ~]#docker load < flanneld-v0.12.0-amd64.docker
5、查看 flannel 状态和 master -2 状态为运行。
3.6.14 验证 master-2 能否实现高可用
现在我们将master1节点上的keepalived服务停了,让他飘到 master2 节点上,然后是否能够使用kubectl命令
1、停掉master1节点的keepalived服务
[22:20:05 root@k8s-master-1 ~]#systemctl stop keepalived.service
2、Master2节点上VIP已经漂移过来,通过 grep 过滤
[22:35:39 root@k8s-master-2 ~]#ip a | grep 172.16.18.188
inet 172.16.18.188/16 scope global secondary eth0:1
3、通过 kubectl 命令查看依旧很够使用从而实现了 K8S 集群的高可用
[22:35:51 root@k8s-master-2 ~]#kubectl get node -A
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 35m v1.17.1
k8s-master-2 Ready master 31m v1.17.1
4、回到 master -1 节点开启keepalived服务
[22:37:30 root@k8s-master-1 ~]#systemctl start keepalived.service
以上就是两个master节点的搭建过程。下面我们开始搭建两个node节点
3.6.15 添加两个node节点:
只要将node节点加进来之后我们就可以跑容器了和跑服务了。各 node 节点都要安装 docker kubeadm kubelet ,因此都要重新执行安装 docker kubeadm kubelet 的步骤,即配置 apt 仓库、配置 docker 加速器、安装命令、启动kubelet 服务。
3.6.15.1 启动kubelet服务,并设置为开机启动
1、在 node -1 节点上操作
[21:26:46 root@k8s-node-1 ~]#systemctl start kubelet && systemctl enable kubelet
2、在 node -2 节点上操作
[21:26:52 root@k8s-node-2 ~]#systemctl start kubelet && systemctl enable kubelet
3.6.15.2 使用token将两个node节点加入到K8S集群中
这里又要用到我们在 master -1 节点上初始化 K8S 得 token 值,加入成功之后会提示:Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
1、在 node -1 节点上操作
[22:41:48 root@k8s-node-1 ~]#kubeadm join 172.16.18.188:6443 --token dae93q.kr1vqn3zww1usaca --discovery-token-ca-cert-hash sha256:b6db906c943e0fff4b0f673fef34c886434df83e4bfc188c2acaf53daae83bcb
2、在 node -2 节点上操作
[22:41:59 root@k8s-node-2 ~]#kubeadm join 172.16.18.188:6443 --token dae93q.kr1vqn3zww1usaca --discovery-token-ca-cert-hash sha256:b6db906c943e0fff4b0f673fef34c886434df83e4bfc188c2acaf53daae83bcb
3.6.15.3 解决 flannel 组件 init 状态问题
这是因为QUAY.IO国内无法访问,解决KUBERNETES应用FLANNEL失败,报错INIT:
原因查看kube-flannel.yml文件时发现quay.io/coreos/flannel:v0.12.0-amd64 。quay.io网站目前国内无法访问
1、下载flannel:v0.12.0-amd64导入到docker中或者去https://github.com/coreos/flannel/releases官方仓库下载镜像
2、在 node-1 节点上导入我们得 flannel 容器
[22:46:06 root@k8s-node-1 ~]#docker load < flanneld-v0.12.0-amd64.docker
3、在 node -2 节点导入我们的 flannel 容器
[22:46:10 root@k8s-node-2 ~]#docker load < flanneld-v0.12.0-amd64.docker
3.6.15.4 验证 node 节点是否加入到 K8S 集群中
回到 master1 节点上输入kubectl get node -A
命令查看我们的两个node节点已经加入,并且状态为ready(准备状态)
[22:47:09 root@k8s-master-1 ~]#kubectl get node -A
NAME STATUS ROLES AGE VERSION
k8s-master-1 Ready master 46m v1.17.1
k8s-master-2 Ready master 42m v1.17.1
k8s-node-1 Ready 5m21s v1.17.1
k8s-node-2 Ready 5m11s v1.17.1
后期添加新的node节点的时候也是这样,安装docker安装K8S等命令,添加到k8s集群就可以了
3.6.16 测试在k8s集群中运行nginx
1、在master -1 节点操作
[22:47:09 root@k8s-master-1 ~]#kubectl create deployment nginx --image=nginx
Deployment:这种类型针对得是那种无状态服务得,所谓无状态服务就是web网络服务创建一个nginx得镜像
kubectl create deployment 类型为无状态
nginx 镜像名为nginx
--image=nginx 拉取nginx镜像
2、使用kubectl get 后面跟我们拉取什么类型得镜像,查看已经有了一个nginx镜像
[22:49:50 root@k8s-master-1 ~]#kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 42s
3、查看这个镜像是在那个pod上面运行得,他创建起来会生成随机得名字,这个名称是k8s自己加得从而保证我们后期在横向扩容得时候避免名称相同而发生冲突,这个名称是第一无二得
[22:50:32 root@k8s-master-1 ~]#kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-86c57db685-lshls 1/1 Running 0 67s
4、然后在kubectl get pod 后面加-o wide这样可以显示出他更加详细得信息,能够看见他的ip地址和他运行在那个node节点上的,我们现在看见他是运行在node1节点上得
#运行在 node -1 节点上,还能够看见 pod IP
[22:50:57 root@k8s-master-1 ~]#kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-86c57db685-lshls 1/1 Running 0 105s 10.10.2.2 k8s-node-1
4、暴露 pod 端口提供外部访问
我们通过kubectl expose
命令来让用户远程访问,这是给 deployment 的 nginx 容器分配一个外网端口为80,然后将他的类型改为 nodeport 。这样K8s就会在宿主机上给他开一个端口,这个端口K8s随机开启得,然后用户就可以访问K8S开启得这个随机端口了。这种方法我们只用于测试环境
[22:51:35 root@k8s-master-1 ~]#kubectl expose deployment nginx --port=80 --type=NodePort
kubectl expose: #将资源暴露为新的Kubernetes Service。指定deployment、service、replica set、replication controller或pod ,并使用该资源的选择器作为指定端口上新服务的选择器。deployment 或 replica set只有当其选择器可转换为service支持的选择器时,即当选择器仅包含matchLabels组件时才会作为暴露新的Service。
deployment nginx: #无状态服务,nginx
--port=80: #暴露 pod 中的端口
--type=NodePort: #使用系统将选择一个随机端口
5、创建完了之后我们使用 kubectl get service 查看暴露并绑定在宿主机的那个随机端口上
随机端口是:31982
[22:53:28 root@k8s-master-1 ~]#kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.31.0.1 443/TCP 56m
nginx NodePort 172.31.68.137 80:31982/TCP 4m6s
3.6.16.1 通过浏览器访问验证 nginx
浏览器访问K8S集群中得 master 的 ip 地址和 31982 端口即可,也可以访问VIP。
1、通过 master -1 IP访问
2、通过 master -2 IP 访问
3、通过 VIP 加随机端口访问
现在我们的K8S就已经装好并且能够使用,但是kubeadm的安装方法一般只用于测试环境下,我们在生产中都是使用二进制安装的较多
3.7 选择K8S的优点
1、比如有一天我们删除一个 pod。
[10:23:32 root@k8s-master-1 ~]#kubectl delete pod nginx-59689bb68f-vpfhr
pod "nginx-59689bb68f-vpfhr" deleted #提示pod已经被删除
2、我们再次通过 kubectl gte pod
查看又多了一个pod,但是这两个pod之间名字是不一样的,原因是我们在运行这个pod 之前告诉 K8S 了他的副本数必须为 1,因为在启动 pod 的时候我们指定了参数 --replicas=1
但是我们一删除它的副本数就不为 1 了,所以它为了保持它必须为 1 就会自动启动一个新的 POD 出来
[10:38:18 root@k8s-master-1 ~]#kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-59689bb68f-m85jq 1/1 Running 0 46s
3、并且有一天我们觉得一个 pod 他的压力太大了,我们还可以将他进行扩容。
[11:33:18 root@k8s-master-1 ~]#kubectl scale --replicas=3 deployment/nginx-deployment
kubectl scale: #使用该命令是增加或缩减 pod 数量
--replicas=3: #增加副本数量为 3 个pod
deployment/nginx-deployment: #将我们的资源类型 deployment 下的nginx
4、扩容成功之后我们通过kubectl get pod
查看一下,就会发现有 3 个 pod
[10:43:41 root@k8s-master-1 ~]#kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-59689bb68f-bv496 1/1 Running 0 4m13s
nginx-59689bb68f-kkd8l 1/1 Running 0 4m13s
nginx-59689bb68f-m85jq 1/1 Running 0 9m38s
5、再通过kubectl get pod -o wide
查看 pod 的详细信息,node -1 节点运行了两个 node -2 运行了一个 pod,并且都在 running 的状态
[10:47:54 root@k8s-master-1 ~]#kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-59689bb68f-bv496 1/1 Running 0 5m10s 10.10.2.4 k8s-node-1
nginx-59689bb68f-kkd8l 1/1 Running 0 5m10s 10.10.2.5 k8s-node-1
nginx-59689bb68f-m85jq 1/1 Running 0 10m 10.10.3.3 k8s-node-2
6、现在我们指定的副本数为3个,这时候我在删除一个 pod,在观察他的 pod 副本数依旧是 3 个
#删除一个 pod
[10:57:38 root@k8s-master-1 ~]#kubectl delete pod nginx-59689bb68f-m85jq
pod "nginx-59689bb68f-m85jq" deleted
#然后再次查看 pod 数量依旧是三个,因为我们刚才重新修改了副本数量我 3 个pod
[10:57:57 root@k8s-master-1 ~]#kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-59689bb68f-9zwzn 1/1 Running 0 7s
nginx-59689bb68f-bv496 1/1 Running 0 14m
nginx-59689bb68f-kkd8l 1/1 Running 0 14m
7、但是这时候又会出现一个新的问题,现在我们有三个 pod 副本,想访问他们怎么办。
[11:34:23 root@k8s-master-1 ~]#kubectl expose deployment nginx-deployment --port=30000 --target-port=80
kubectl expose: #将资源暴露为新的服务
deployment nginx: #资源类型为 nginx
--port=30000: #这是暴露的宿主机端口
--target-port=80: #目标端口是pod 的80端口
8、通过 kubectl get svc
查看现在我们运行的服务就会多了一个nginx。
[11:11:17 root@k8s-master-1 ~]#kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.31.0.1 443/TCP 68m
nginx ClusterIP 172.31.100.168 30000/TCP 4m8
9、通过在别的主机上 curl 浏览器访问已经实现了访问。但是这个地址是一个内部地址,所以我们在外部访问是不能够实现的。
10、如果外部网络想访问我们的 pod 该怎么办呢?
我们可以看到他的类型等于 cluster IP ,这种 type 类型哈有很多种方式,比如 nodeport也是一种
11、这时候我们可以修改 nginx-deployment svc 的 type 方式。
#修改只后这是在我们所有的 nginx-deployment 所有的资源类型中都暴露一个端口被外部访问
[14:06:45 root@k8s-master-1 ~]#kubectl edit svc nginx-deployment
12、再次查看我们的 svc 就会发现他的类型已经修改为了 nodeport,并且开启了一个随机端口
[15:24:55 root@k8s-master-1 ~]#kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.30.0.1 443/TCP 8m58s
nginx NodePort 172.30.6.115 30000:32630/TCP 2m54s
13、通过netstat -anpt
命令查看他的31371 随机端口已经在宿主机上开启
[15:25:01 root@k8s-master-1 ~]#netstat -anpt | grep 32630
tcp6 0 0 :::32630 :::* LISTEN 25765/kube-proxy
14、浏览器通过访问我们宿主机的 32630 端口