k8s实践(十五):Centos7.6部署k8s v1.16.4高可用集群(主备模式)
k8s实践(十五):Centos7.6部署k8s v1.16.4高可用集群(主备模式)
原创loong5762019-12-30 16:11:53博主文章分类:kubernetes©著作权
文章标签kubernetesHAkeepalivedcentos7.6kubernetes高可用集群文章分类Linux系统/运维阅读数1.1万
一、部署环境
主机列表:
主机名 | Centos版本 | ip | docker version | flannel version | Keepalived version | 主机配置 | 备注 |
---|---|---|---|---|---|---|---|
master01 | 7.6.1810 | 172.27.34.3 | 18.09.9 | v0.11.0 | v1.3.5 | 4C4G | control plane |
master02 | 7.6.1810 | 172.27.34.4 | 18.09.9 | v0.11.0 | v1.3.5 | 4C4G | control plane |
master03 | 7.6.1810 | 172.27.34.5 | 18.09.9 | v0.11.0 | v1.3.5 | 4C4G | control plane |
work01 | 7.6.1810 | 172.27.34.93 | 18.09.9 | / | / | 4C4G | worker nodes |
work02 | 7.6.1810 | 172.27.34.94 | 18.09.9 | / | / | 4C4G | worker nodes |
work03 | 7.6.1810 | 172.27.34.95 | 18.09.9 | / | / | 4C4G | worker nodes |
VIP | 7.6.1810 | 172.27.34.130 | 18.09.9 | v0.11.0 | v1.3.5 | 4C4G | 在control plane上浮动 |
client | 7.6.1810 | 172.27.34.234 | / | / | / | 4C4G | client |
共有7台服务器,3台control plane,3台work,1台client。
k8s 版本:
主机名 | kubelet version | kubeadm version | kubectl version | 备注 |
---|---|---|---|---|
master01 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl选装 |
master02 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl选装 |
master03 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl选装 |
work01 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl选装 |
work02 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl选装 |
work03 | v1.16.4 | v1.16.4 | v1.16.4 | kubectl选装 |
client | / | / | v1.16.4 | client |
二、高可用架构
本文采用kubeadm方式搭建高可用k8s集群,k8s集群的高可用实际是k8s各核心组件的高可用,这里使用主备模式,架构如下:
主备模式高可用架构说明:
核心组件 | 高可用模式 | 高可用实现方式 |
---|---|---|
apiserver | 主备 | keepalived |
controller-manager | 主备 | leader election |
scheduler | 主备 | leader election |
etcd | 集群 | kubeadm |
- apiserver 通过keepalived实现高可用,当某个节点故障时触发keepalived vip 转移;
- controller-manager k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个controller-manager组件运行;
- scheduler k8s内部通过选举方式产生领导者(由–leader-elect 选型控制,默认为true),同一时刻集群内只有一个scheduler组件运行;
- etcd 通过运行kubeadm方式自动创建集群来实现高可用,部署的节点数为奇数,3节点方式最多容忍一台机器宕机。
三、安装准备工作
control plane和work节点都执行本部分操作。
Centos7.6安装详见: Centos7.6操作系统安装及优化全纪录
安装Centos时已经禁用了防火墙和selinux并设置了阿里源。
1. 配置主机名
1.1 修改主机名
退出重新登陆即可显示新设置的主机名master01
1.2 修改hosts文件
2. 验证mac地址uuid
保证各节点mac和uuid唯一
3. 禁用swap
3.1 临时禁用
3.2 永久禁用
若需要重启后也生效,在禁用swap后还需修改配置文件/etc/fstab,注释swap
4. 内核参数修改
本文的k8s网络使用flannel,该网络需要设置内核参数bridge-nf-call-iptables=1,修改这个参数需要系统有br_netfilter模块。
4.1 br_netfilter模块加载
查看br_netfilter模块:
如果系统没有br_netfilter模块则执行下面的新增命令,如有则忽略。
临时新增br_netfilter模块:
该方式重启后会失效
永久新增br_netfilter模块:
4.2 内核参数临时修改
4.3 内核参数永久修改
5. 设置kubernetes源
5.1 新增kubernetes源
- [] 中括号中的是repository id,唯一,用来标识不同仓库
- name 仓库名称,自定义
- baseurl 仓库地址
- enable 是否启用该仓库,默认为1表示启用
- gpgcheck 是否验证从该仓库获得程序包的合法性,1为验证
- repo_gpgcheck 是否验证元数据的合法性 元数据就是程序包列表,1为验证
- gpgkey=URL 数字签名的公钥文件所在位置,如果gpgcheck值为1,此处就需要指定gpgkey文件的位置,如果gpgcheck值为0就不需要此项了
5.2 更新缓存
6. 免密登录
配置master01到master02、master03免密登录,本步骤只在master01上执行。
6.1 创建秘钥
6.2 将秘钥同步至master02/master03
6.3 免密登陆测试
master01可以直接登录master02和master03,不需要输入密码。
四、Docker安装
control plane和work节点都执行本部分操作。
1. 安装依赖包
2. 设置Docker源
3. 安装Docker CE
3.1 docker安装版本查看
3.2 安装docker
指定安装的docker版本为18.09.9
4. 启动Docker
5. 命令补全
5.1 安装bash-completion
5.2 加载bash-completion
6. 镜像加速
由于Docker Hub的服务器在国外,下载镜像会比较慢,可以配置镜像加速器。主要的加速器有:Docker官方提供的中国registry mirror、阿里云加速器、DaoCloud 加速器,本文以阿里加速器配置为例。
6.1 登陆阿里云容器模块
登陆地址为: https://cr.console.aliyun.com ,未注册的可以先注册阿里云账户
6.2 配置镜像加速器
配置daemon.json文件
重启服务
加速器配置完成
7. 验证
通过查询docker版本和运行容器hello-world来验证docker是否安装成功。
8. 修改Cgroup Driver
8.1 修改daemon.json
修改daemon.json,新增‘“exec-opts”: [“native.cgroupdriver=systemd”’
8.2 重新加载docker
修改cgroupdriver是为了消除告警:
[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/
五、keepalived安装
control plane节点都执行本部分操作。
1. 安装keepalived
2. keepalived配置
master01上keepalived配置:
master02上keepalived配置:
master03上keepalived配置:
3. 启动keepalived
所有control plane启动keepalived服务并设置开机启动
4. VIP查看
vip在master01上
六、k8s安装
control plane和work节点都执行本部分操作。
1. 版本查看
本文安装的kubelet版本是1.16.4,该版本支持的docker版本为1.13.1, 17.03, 17.06, 17.09, 18.06, 18.09。
2. 安装kubelet、kubeadm和kubectl
2.1 安装三个包
2.2 安装包说明
- kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
- kubeadm 用于初始化集群,启动集群的命令工具
- kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
2.3 启动kubelet
启动kubelet并设置开机启动
2.4 kubectl命令补全
3. 下载镜像
3.1 镜像下载的脚本
Kubernetes几乎所有的安装组件和Docker镜像都放在goolge自己的网站上,直接访问可能会有网络问题,这里的解决办法是从阿里云镜像仓库下载镜像,拉取到本地以后改回默认的镜像tag。本文通过运行image.sh脚本方式拉取镜像。
url为阿里云镜像仓库地址,version为安装的kubernetes版本。
3.2 下载镜像
运行脚本image.sh,下载指定版本的镜像
七、初始化Master
master01节点执行本部分操作。
1. kubeadm.conf
kubeadm.conf为初始化的配置文件
2. master初始化
记录kubeadm join的输出,后面需要这个命令将work节点和其他control plane节点加入集群中。
初始化失败:
如果初始化失败,可执行kubeadm reset后重新初始化
3. 加载环境变量
本文所有操作都在root用户下执行,若为非root用户,则执行如下操作:
4. 安装flannel网络
在master01上新建flannel网络
由于网络原因,可能会安装失败,可以在文末直接下载kube-flannel.yml文件,然后再执行apply
八、control plane节点加入集群
1. 证书分发
master01分发证书:
在master01上运行脚本cert-main-master.sh,将证书分发至master02和master03
master02移动证书至指定目录:
在master02上运行脚本cert-other-master.sh,将证书移至指定目录
master03移动证书至指定目录:
在master03上也运行脚本cert-other-master.sh
2. master02加入集群
运行初始化master生成的control plane节点加入集群的命令
3. master03加入集群
4. 加载环境变量
master02和master03加载环境变量
该步操作是为了在master02和master03上也能执行kubectl命令。
5. 集群节点查看
所有control plane节点处于ready状态,所有的系统组件也正常。
九、work节点加入集群
1. work01加入集群
运行初始化master生成的work节点加入集群的命令
2. work02加入集群
3. work03加入集群
4. 集群节点查看
十、client配置
1. 设置kubernetes源
1.1 新增kubernetes源
1.2 更新缓存
2. 安装kubectl
安装版本与集群版本保持一致
3. 命令补全
3.1 安装bash-completion
3.2 加载bash-completion
3.3 拷贝admin.conf
3.4 加载环境变量
4. kubectl测试
十一、Dashboard搭建
本节内容都在client端完成
1. 下载yaml
如果连接超时,可以多试几次。recommended.yaml已上传,也可以在文末下载。
2. 配置yaml
2.1 修改镜像地址
由于默认的镜像仓库网络访问不通,故改成阿里镜像
2.2 外网访问
配置NodePort,外部通过https://NodeIp:NodePort 访问Dashboard,此时端口为30001
2.3 新增管理员帐号
创建超级管理员的账号用于登录Dashboard
3. 部署访问
3.1 部署Dashboard
3.2 状态查看
3.3 令牌查看
令牌为:
3.4 访问
**请使用火狐浏览器访问:** https://VIP:30001
接受风险
通过令牌方式登录
Dashboard提供了可以实现集群管理、工作负载、服务发现和负载均衡、存储、字典配置、日志视图等功能。
十二、集群高可用测试
本节内容都在client端完成
1. 组件所在节点查看
通过ip查看apiserver所在节点,通过leader-elect查看scheduler和controller-manager所在节点:
组件名 | 所在节点 |
---|---|
apiserver | master01 |
controller-manager | master01 |
scheduler | master01 |
2. master01关机
2.1 关闭master01,模拟宕机
2.2 各组件查看
vip飘到了master02
controller-manager和scheduler也发生了迁移
组件名 | 所在节点 |
---|---|
apiserver | master02 |
controller-manager | master02 |
scheduler | master03 |
2.3 集群功能性测试
查询:
master01状态为NotReady
新建pod:
2.4 结论
当有一个control plane节点宕机时,VIP会发生漂移,集群各项功能不受影响。
3. master02关机
在关闭master01的同时关闭master02,测试集群还能否正常对外服务。
3.1 关闭master02:
3.2 查看VIP:
vip漂移至唯一的control plane:master03
3.3 集群功能测试
etcd集群崩溃,整个k8s集群也不能正常对外服务。
单节点版k8s集群部署详见: Centos7.6部署k8s(v1.14.2)集群
k8s集群高可用部署详见: lvs+keepalived部署k8s v1.16.4高可用集群
本文所有脚本和配置文件已上传: Centos7.6-install-k8s-v1.16.4-HA-cluster