今でもあなたは私の光丶

K8S(6)k8s高可用-

kubespray

官网地址

不推荐安装使用的理由如下:

  1. .国内特殊的网络环境导致使用kubespray困难重重,部分镜像需要从gcr.io拉取,部分二进制文件需要 从github下载 。
  2. 额外安装大量的软件。造成不必要的学习成本。
  3. 二进制安装文件和镜像体积庞大。
https://kubespray.io/
github地址
https://github.com/kubernetes-sigs/kubespray

centos系统设置

hosts文件

可以忽略不执行,kubespray会再次更改hosts文件内容。

192.168.198.181 k8s-master01
192.168.198.182 k8s-node01
192.168.198.183 k8s-node02

上传二进制文件

mkdir -p /tmp/releases
cd /tmp/releases/
将下边三个文件上传到/tmp/releases/目录中
kubeadm-v1.17.6-amd64
kubectl-v1.17.6-amd64
kubelet-v1.17.6-amd64

上传镜像

cd /tmp/releases/
docker load < calico3.13.2.tar
docker load < k8sv1.17.6.tar
rm -rf calico3.13.2.tar
rm -rf k8sv1.17.6.tar

免密登录

需要对所有K8S节点免密登录,master节点本身也需要免密登录。在master节点执行免密命令。
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.198.181
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.198.182
ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.198.183

安装准备

安装ansible软件包

老版本安装方式

# 安装ansible
yum install -y ansible
# 安装Python 3.6
yum install –y python36
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip Jinja2

新版本安装方式

yum install -y epel-release python3-pip

安装kubespray

上传kubespray安装tar包到/opt目录
cd /opt
tar zxf kubespray-2.13.1.tar.gz
mv kubespray-2.13.1 kubespray
cd kubespray/
pip3 install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt
cp -rfp inventory/sample inventory/mycluster
declare -a IPS=(192.168.198.181 192.168.198.182 192.168.198.183)
CONFIG_FILE=inventory/mycluster/hosts.yaml python3
contrib/inventory_builder/inventory.py ${IPS[@]}

配置集群环境

如果是下载安装包进行安装,以下配置可以忽略不进行配置。

main配置文件

如果有自己的harbor私服镜像地址,可以修改默认配置文件中的镜像地址。

cd /opt/kubespray/roles/download/defaults/main.yml
修改镜像地址:
kube_image_repo: "harbor.lagou.com/k8s.gcr.io"
docker_image_repo: "harbor.lagou.com/docker.io"
quay_image_repo: "harbor.lagou.com/quay.io"

k8s-cluster配置文件

如果有自己的harbor私服镜像地址,可以修改默认配置文件中的镜像地址。

cd /opt/kubespray/inventory/mycluster/group_vars/k8s-cluster/k8scluster.yml
确认k8s版本
kube_version: v1.17.6
修改k8s镜像下载地址:
kube_image_repo: "harbor.lagou.com/k8s.gcr.io"
修改k8s网络配置:默认为calico,推荐大家使用calico。也可以选择其他网络模式
kube_network_plugin: calico
kube_service_addresses: 172.25.0.0/16
kube_pods_subnet: 172.26.0.0/16
kube_network_node_prefix: 16

安装集群

cd /opt/kubespray
ansible-playbook -i inventory/mycluster/hosts.yaml --become --becomeuser=root cluster.yml

Sealos

Sealos

Sealos 是一个 Go 语言开发的简单干净且轻量的 Kubernetes 集群部署工具, Sealos 能很好的支 持在生产环境中部署高可用的 Kubernetes 集群。

Sealos 特性与优势

  1. 支持离线安装,工具与部署资源包分离,方便不同版本间快速升级。
  2. 证书有效期默认延期至 99 年。
  3. 工具使用非常简单。
  4. 支持使用自定义配置文件,可灵活完成集群环境定制。
  5. 使用内核进行本地负载,稳定性极高,故障排查也极其简单。
  6. 最主要的优势是不需要翻墙出去!!!

为什么不用 KeepAlived 和 HAProxy 实现集群高可用

无论是通过 KeepAlived 还是 HAProxy 进行高可用集群调度都会存在以下一些劣势。

  1. 软件源不一致可能导致容器中安装的软件版本也不一致,进而会引起相应检查脚本不生效等故障。
  2. 可能因为系统依赖库问题,在某些特定环境下就直接无法完成安装。
  3. 只依靠检测 HAProxy 进程是否存活是无法保证集群高可用的,正确的检测方式应该是判断 ApiServer 是否 healthz 状态。
  4. Keepalived 可能存在 Cpu 占满的情况。

本地负载为什么不使用 Envoy 或者 Nginx 实现

Sealos 高可用实现是通过本地负载方式完成的。本地负载实现方式有多种,比如: IPVS 、 Envoy 、 Nginx 等,而 Sealos 采用的是通过内核 IPVS 来实现的。

本地负载:在每个 Node 节点上都启动一个负载均衡,同时监听集群中的多个 Master 节点。

Sealos 选择通过内核 IPVS 来实现主要有以下几个原因:

  • 如果使用 Envoy 等需要在每个节点上都跑一个进程,消耗更多资源。虽然 IPVS 实际上也会多跑 一个 lvscare 进程 ,但是 lvscare 只是负责管理 IPVS 规则,原理和 Kube-Proxy 类似。真正 的流量直接从内核层面走,不需要把数据包先走到用户态中去处理。
  • 使用 Envoy 存在启动优先级的问题,比如:Join 集群时,如果负载均衡没有建立,Kubelet 就会 启动失败。使用 IPVS 则不会存在这样的问题,因为我们可以在 Join 集群前先建立好转发规则。

为什么要定制 Kubeadm

  • 解决默认证书有效期只有一年的问题。
  • 更方便的实现本地负载。
  • 核心的功能均集成到 Kubeadm 中了,Sealos 只管分发和执行上层命令,相对就更轻量了。

Sealos 执行流程

  1. 通过 SFTP 或者 Wget 命令把离线安装包拷贝到目标机器上,包括所有 Master 和 Node 节点
  2. 在 Master 0 节点上执行 kubeadm init 命令。
  3. 在其它 Master 节点上执行 kubeadm join 命令并设置控制面。这个过程中多个 Master 节点上 的 Etcd 会自动组成一个 Etcd 集群,并启动相应控制组件。
  4. 所有 Node 节点都加入到集群中,这个过程中会在 Node 节点上进行 IPVS 转发规则和 /etc/hosts 配置。

Node 节点对 ApiServer 的访问均是通过域名进行的。因为 Node 节点需要通过 虚拟 IP 连接到多 个 Master 上,但是每个 Node 节点的 Kubelet 与 Kube-Proxy 访问 ApiServer 的地址是不同的, 所以这里使用域名来解析每个节点上 ApiServer 不同的 IP 地址。

部署准备

sealos官网

官网地址:
https://sealyun.com/
企业级应用的集群离线包需要付费,我们只是学习,使用作者提供的免费离线包:
http://store.lameleg.com/

安装文档

官网中文安装手册:
https://github.com/fanux/sealos

sealos下载

可以下载sealos不同版本的二进制文件
https://github.com/fanux/sealos/releases

K8S离线包

离线包包含所有二进制文件配置文件和镜像

非免费V1.16.0版本下载地址
https://sealyun.oss-cnbeijing.aliyuncs.com/cf6bece970f6dab3d8dc8bc5b588cc18-
1.16.0/kube1.16.0.tar.gz
免费V1.17.0版本下载地址
https://sealyun.oss-cnbeijing.aliyuncs.com/413bd3624b2fb9e466601594b4f72072-
1.17.0/kube1.17.0.tar.gz
非免费V1.18.0版本下载地址:
https://sealyun.oss-cnbeijing.aliyuncs.com/7b6af025d4884fdd5cd51a674994359c1.18.0/kube1.18.0.tar.gz
免费V1.18.1版本下载地址:
https://sealyun.oss-cnbeijing.aliyuncs.com/7b6af025d4884fdd5cd51a674994359c1.18.0/kube1.18.0.tar.gz
非免费V1.18.2版本下载地址:
https://sealyun.oss-cnbeijing.aliyuncs.com/9a8299ea8016abe32e1564a44d5162e4-
1.18.2/kube1.18.2.tar.gz

Sealos 常用参数说明

--master Master 节点服务器地址列表
--node Node 节点服务器地址列表
--user 服务器 SSH 用户名
--passwd 服务器 SSH 用户密码
--pkg-url 离线包所在位置,可以是本地目录,也可以是一个 HTTP 地址
--version 指定需要部署的 Kubernetes 版本
--pk 指定 SSH 私钥所在位置,默认为 /root/.ssh/id_rsa
Other flags:
--kubeadm-config string kubeadm-config.yaml 用于指定自定义 kubeadm 配置文件
--vip string virtual ip (default "10.103.97.2") 本地负载时虚拟IP ,不推荐修改,集群外不可访问

部署多主节点的高可用集群

节点信息

服务器用户名:root,服务器密码:123456

安装相关环境依赖

通过 Sealos 进行 Kubernetes 集群部署,你需要先准备好以下环境。
1.在所有要部署的机器上,先完成 Docker 的安装和启动。
2.下载 Kubernetes 离线安装包。
3.下载最新版本 Sealos。
4.对所有服务器进行时间同步。
5.系统支持:centos7.2以上,ubuntu16.04以上。内核推荐4.14以上。推荐配置:centos7.8
6.主机名不可重复
7.master节点CPU必须2C以上
8.请使用sealos 3.2.0以上版本

升级系统内核

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-lt
grep initrd16 /boot/grub2/grub.cfg
grub2-set-default 0
reboot

修改Cgroup Driver

修改/etc/docker/daemon.json,新增:
"exec-opts": ["native.cgroupdriver=systemd"]
重启docker服务:
systemctl daemon-reload
systemctl restart docker
查看修改后状态:
docker info | grep Cgroup

设置hostname

cat <<EOF >>/etc/hosts
192.168.198.121 sealos-master01
192.168.198.122 sealos-master02
192.168.198.123 sealos-master03
192.168.198.124 sealos-node01
192.168.198.125 sealos-node02
192.168.198.126 sealos-node03
EOF

初始化安装

多master

将sealos二进制文件上传sealos-master01:/data
将kubernates离线安装包上传sealos-master01:/data
cd /data
授权并移动到/usr/bin目录中
chmod +x sealos && mv sealos /usr/bin
多master HA:
sealos init \
--master 192.168.198.121 \
--master 192.168.198.122 \
--master 192.168.198.123 \
--node 192.168.198.124 \
--node 192.168.198.125 \
--node 192.168.198.126 \
--user root \
--passwd 123456 \
--version v1.17.0 \
--pkg-url /data/kube1.17.0.tar.gz
单master多node:
sealos init --master 192.168.198.121 \
--node 192.168.198.124 \
--node 192.168.198.125 \
--node 192.168.198.126 \
--user root \
--passwd 123456 \
--version v1.17.0 \
--pkg-url /data/kube1.17.0.tar.gz

kubectl命令自动补全

sealos默认已经帮我们安装命令补全功能。

echo "source <(kubectl completion bash)" >> ~/.bash_profile
source ~/.bash_profile

master节点操作

增加master

sealos join --master 192.168.198.127 --master 192.168.198.128
或者多个连续IP
sealos join --master 192.168.198.127-192.168.198.128

删除指定master节点

sealos clean --master 192.168.198.122 --master 192.168.198.123
或者多个连续IP
sealos clean --master 192.168.198.122-192.168.198.123

node节点操作

增加node

sealos join --node 192.168.198.127 --node 192.168.198.128
或者多个连续IP
sealos join --node 192.168.198.127-192.168.198.128

删除指定node节点

sealos clean --node 192.168.198.125 --node 192.168.198.126
或者多个连续IP
sealos clean --node 192.168.198.125-192.168.198.126

清理集群

sealos clean --all -f