从零开始:新手快速在国产操作系统中搭建高可用K8S(V1.28)集群落地实践

[ 点击 👉 关注「 全栈工程师修炼指南」公众号 ]

希望各位看友多多支持【关注、点赞、评论、收藏、投币】,助力每一个梦想。

WeiyiGeek Blog's - 花开堪折直须折,莫待无花空折枝 】
作者主页: 【 https://weiyigeek.top
博客地址: 【 https://blog.weiyigeek.top 】
作者答疑学习交流群:欢迎各位志同道合的朋友一起学习交流【点击 👉 加入交流群】, 或者关注公众号回复【学习交流群】。


文章目录


首发地址: https://mp.weixin.qq.com/s/L-qABhXkHPx9dlmwQA-jFQ


本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。

0x00 前言简述

描述: 由于公司内部需要将原本繁重的elk日志收集平台(等保需要)以及Promethus资源监控预警平台(开发运维测试需要),迁移到国产Linux操作系统之中(大趋势),作者我也趁着此机会,将原本单机部署的项目进行迁移到,使用银河麒麟( KylinOS V10)服务器操作系统部署最新 V1.28 版本的高可用 Kubernetes 云平台上,让企业全面拥抱云原生,以及国产化替代。

此外,作者也将使用Promtail + Loki + Grafana贴近于云原生的架构来全面替换繁重elk日志收集平台,并且使用 Promethus + Exporters + Alertmanager + PushGateWay 来完成企业内部主机、网络设备、业务等相关资源的监控预警,此系列文章将会在《#云原生落地实用指南》付费专栏之中进行持续更新,希望对各位有需要的朋友有帮助,也请多多支持作者创作更多云原生落地实践文章。

此文章主要讲解实践及帮助各位搞IT朋友,企业内部在国产化银河麒麟(KylinOS V10)Linux服务器操作系统中安装Kubernetes容器编排云平台,基于安全加固后的操作系统,带领新手使用ansible 工具 + 手动的方式快速安装部署最新版本的高可用 Kubernetes (v1.28) 集群,以及NFS 动态持久存储卷、Ingress-nginx,以及集群包管理工具 helm,集群管理工具 k9s等相关基础安装配置,为前面所述的 日志收集平台资源监控预警平台做准备,让云原生实实在在企业中落地,加快企业内部的数字化转型以及完成企业内部国产化替代工作。

若还有不了解的银河麒麟( KylinOS V10)系统的朋友可以参考,作者的此篇文章《企业实践 | 国产操作系统之光? 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装篇》进行基础扫盲。

温馨提示: 此篇文章也适用于在 CentOS8 主机中安装高可用的K8S集群(V1.28)。


0x01 Kubernetes 前置准备

1.安装方式介绍

描述:下面介绍了几种 Kubernetes 安装方式,以及其安装部署的特点区别,和部署的时间耗费情况,时而选择出最适合本企业中安装部署K8S的方式。

  • 1.基于 kubeadm 工具部署 (耗费时间 30min)

    kubeadm (耗费时间 30min):K8S 官方提供的原生安装方式,学习时建议首选此方式。官方文档: https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/

    kubespray (耗费时间 20~30min) : 基于ansible其支持联邦与舰队,高可用性集群,网络插件,持续集成测试。项目地址: https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubespray/

    kubekey (耗费时间 20~30min) :由 Go 语言开发是一种全新的安装工具,替代了以前使用的基于 ansible 的安装程序,可快速安装 Kubernetes/K3s。项目地址: https://github.com/kubesphere/kubekey

    sealos (耗费时间 180second) : 持多种部署方式,包括单主节点、多主节点、高可用等,同时还提供了一些高级功能,如TLS证书自动签发、节点扩缩容、组件升级等。官方地址: https://docs.sealos.io/zh-Hans/

    kind (kubernetes in docker): 提供一个轻量级、快速部署的Kubernetes环境,适用于开发、测试和本地调试,生产环境不建议。 项目地址: https://github.com/kubernetes-sigs/kind

  • 2.基于 二进制离线部署 (耗费时间 较长)

    手动离线部署 (耗费时间 3~5hour) : 可参考博主的
    kubease (耗费时间 7~10 hour) :基于二进制方式部署和利用ansible-playbook实现自动化;既提供一键安装脚本, 也可以根据安装指南分步执行安装各个组。项目地址: https://github.com/easzlab/kubeasz

  • 3.基于 Rancher 方式部署:(RKE)是一款非常简单,运行速度快的 Kubernetes 安装程序,支持各种运行平台,其次它是一个功能强大的容器管理平台,可以简化容器化应用程序的部署和管理,并提供丰富的功能来帮助用户监控和保护容器K8S集群。项目地址: https://docs.rancher.cn/


2.安装依赖说明

描述: 此处作者使用 kubeadm 进行 kubernetes(k8s)高可用安装部署, 我们可从 Kubernetes 官方文档中可知,其安装部署K8S的控制平面以及工作节点主机要求如下所示:

  • 一台或多台运行兼容 deb/rpm 的 Linux 操作系统的计算机;例如:Ubuntu 或 CentOS 或者其他发行版, 此处作者将使用国产系统KylinOS v10操作系统
  • 每台机器 2 GB 以上的内存,内存不足时应用会受限制。
  • 用作控制平面节点的计算机上至少有 2 个 CPU
  • 集群中所有计算机之间具有完全的网络连接,你可以使用公共网络或专用网络。
  • 高可用集群中将要使用奇数的Master工作平面。

此处作者已经将国产系统KylinOS v10操作系统进行了安全加固以满足等保三级主机安全的要求,有需求的朋友请在下方自取,加固后的KylinOS系统登录连接界面如下所示:

[IP 地址] : 10.10.10.2~10.10.10.5
[System Info]
  SYSTEM    : Kylin Linux Advanced Server V10 (Lance)
  KERNEL    : Linux 4.19.90-52.25.v2207.ky10.x86_64
  ARCH      : x86_64
  UPTIME    : 0 days 0 hours 48 minutes 18 seconds
  CPU       : Intel(R) Xeon(R) CPU E7-4820 v4 @ 2.00GHz (8 vCPU)
  MEMORY    : 227 MB / 14749 MB (1.54% Used)
  LOAD AVG  : 0.00 (1m), 0.00 (5m), 0.00 (15m)
  PROCESSES : 194 (root), 3 (user), 197 (total)
  USERS     : 1 users logged in
  BASH      : 5.0.18(1)-release

[Disk Usage]
  Mounted: /                                3.0G / 98G (4% Used)
  [============================================================]
  Mounted: /boot                            280M / 1014M (28% Used)
  [============================================================]

Kylin银河麒麟安全加固脚本文档地址: https://mp.weixin.qq.com/s/eBF_Q-WkiZHKGdEG1MODNQ
Kylin银河麒麟安全加固实践视频地址: https://mp.weixin.qq.com/s/8HmwT_V23Ki2iMKWTpVdpw

weiyigeek.top-已加固的Kylin银河麒麟系统图

温馨提示: Kubernetes 是支持 IPv4 + IPv6 双栈, 若要使用IPV6的目的是在公网进行访问,需要配置 IPV6 静态地址。若您没有IPV6环境,或者不想使用IPv6,不对主机进行配置IPv6地址即可,并不会不影响后续,不过集群依旧是支持IPv6的,为后期留有扩展可能性。


3.安装环境说明

描述: 此处作者使用VMware EXSI安装的四台 KylinOS V10 虚拟机机器进行部署高可用的K8S集群,以及从存储NAS服务器划分的19T的NFS共享磁盘,用于存取相关设备抓取的日志,目标当然是存储 180天 以及满足等保的要求。

主机说明

主机名称 主机地址 K8S角色 K8S版本 主机与内核版本
weiyigeek-02 10.10.10.2 control-plane v1.28.1 Kylin V10 (Lance)-4.19.90-52.26.v2207.ky10.x86_64
weiyigeek-03 10.10.10.3 control-plane v1.28.1 Kylin V10 (Lance)-4.19.90-52.26.v2207.ky10.x86_64
weiyigeek-04 10.10.10.4 control-plane v1.28.1 Kylin V10 (Lance)-4.19.90-52.26.v2207.ky10.x86_64
weiyigeek-05 10.10.10.5 work v1.28.1 Kylin V10 (Lance)-4.19.90-52.26.v2207.ky10.x86_64

存储说明

共享类型 共享目录 挂载点 容量
NFS 192.168.4.9:/volume1/storage/ /storage 19T

VIP 负载均衡说明

主机名称 主机地址 负载端口
sec-lb.k8s.weiyigeek.cn 10.10.10.10 16443

K8S配置说明

关键项 配置项
clusterName 集群名称 kubernetes
dnsDomain 集群根域 cluster.sec
serviceSubnet 服务子网段 10.96.0.0/16
podSubnet pod 服务子网段 172.16.0.0/16

高可用K8S架构说明

weiyigeek.top-高可用K8S架构说明图


4.安装主机配置

主机网络

描述: 由于我是采用安全加固后的虚拟机模板克隆的其他三台主机,我们需要按照K8S官方文档主机网络要求进行排除和配置; 我们需要确保每个节点上 MAC 地址product_uuid 的唯一性,你可以使用命令 ip linkifconfig -a 来获取网络接口的 MAC 地址, 可使用 sudo cat /sys/class/dmi/id/product_uuid 命令对 product_uuid 校验

一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复, Kubernetes 使用这些值来唯一确定集群中的节点; 如果这些值在每个节点上不唯一,可能会导致安装失败。

# 注意!
# 若虚拟机是进行克隆的那么网卡的UUID会重复的,而重复的UUID无法获取到IPV6地址,当然若没有IPV6的需求可略过此部分。
# 若UUID重复需要重新生成新的UUID, 此时使用 nmcli 进行快速配置

# 查看当前的网卡列表和 UUID:
# nmcli con show
# 删除要更改 UUID 的网络连接:
# nmcli con delete uuid <原 UUID>
# 重新生成 UUID:
# nmcli con add type ethernet ifname <接口名称> con-name <新名称>
# 重新启用网络连接:
# nmcli con up <新名称>

# 更改网卡的UUID&及IP地址(执行后无需通过控制台登录)
# control-plane
ssh -p 20211 root@weiyigeek-03 "nmcli con delete uuid 2394d226-1467-4118-b358-2d90cd02e65b;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160;nmcli con mod ens160 ipv4.addresses 10.10.10.3/24; nmcli con mod ens160 ipv4.gateway 10.10.10.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "223.6.6.6"; nmcli con up ens160"
ssh -p 20211 root@weiyigeek-04 "nmcli con delete uuid 2394d226-1467-4118-b358-2d90cd02e65b;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160;nmcli con mod ens160 ipv4.addresses 10.10.10.4/24; nmcli con mod ens160 ipv4.gateway 10.10.10.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "223.6.6.6"; nmcli con up ens160"
# work
ssh -p 20211 root@weiyigeek-05 "nmcli con delete uuid 2394d226-1467-4118-b358-2d90cd02e65b;nmcli con add type ethernet ifname ens160 con-name ens160;nmcli con up ens160;nmcli con mod ens160 ipv4.addresses 10.10.10.5/24; nmcli con mod ens160 ipv4.gateway 10.10.10.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "223.6.6.6"; nmcli con up ens160"

使用 nmcli 命令单独配置主机的IPv4/6地址命令参考:

# 进行静态IPv4地址配置
ssh -p 20211 root@weiyigeek-05 "nmcli con mod ens160 ipv4.addresses 10.10.10.5/24; nmcli con mod ens160 ipv4.gateway 10.10.10.1; nmcli con mod ens160 ipv4.method manual; nmcli con mod ens160 ipv4.dns "223.6.6.6"; nmcli con up ens160"

# 进行静态IPv6地址配置; 若没有IPv6选择不配置即可
ssh -p 20211 root@weiyigeek-05 "nmcli con mod ens160 ipv6.addresses fc00:43f4:1eea:1::10; nmcli con mod ens160 ipv6.gateway fc00:43f4:1eea:1::1; nmcli con mod ens160 ipv6.method manual; nmcli con mod ens160 ipv6.dns "2400:3200::1"; nmcli con up ens160"

让 "cali、tunl" 开头的接口不被 NetworkManager 所管理, 温馨提示KylinOS v10 适用于CentOS8的源,所以此处你应该明白我所说的吧。

# 适用于 CentOS 系列发行版本 ,若你是Ubuntu请忽略。
 
# 方式一
# systemctl disable --now NetworkManager
# systemctl start network && systemctl enable network
 
# 方式二
cat > /etc/NetworkManager/conf.d/calico.conf << EOF 
[keyfile]
unmanaged-devices=interface-name:cali*;interface-name:tunl*
EOF
systemctl restart NetworkManager
 
# 参数解释:
# unmanaged-devices 参数用于指定不由 NetworkManager 管理的设备。

# interface-name:cali*
# 表示以 "cali" 开头的接口名称被排除在 NetworkManager 管理之外。例如,"cali0", "cali1" 等接口不受 NetworkManager 管理。
# interface-name:tunl*
# 表示以 "tunl" 开头的接口名称被排除在 NetworkManager 管理之外。例如,"tunl0", "tunl1" 等接口不受 NetworkManager 管理。

# 通过使用这个参数,可以将特定的接口排除在 NetworkManager 的管理范围之外,以便其他工具或进程可以独立地管理和配置这些接口。

主机名称

描述: 此处作者建议使用ansible 自动化运维工具针对K8S节点所有Linux进行管理,它可以极大方便我们批量执行命令,而不是在各主机上分别去单独执行,所以此处我们需要先在weiyigeek-02机器上安装 ansible 工具,在后续高可用集群的安装中会大量的使用。

若对ansible 自动化运维工具还不了解的朋友,可以参考作者的《Ansible-自动化运维大成之路》专栏文章进行基础扫盲。

首先,手动将下述主机名与IP地址解析配置追加到 master 角色 weiyigeek-02 主机的 /etc/hosts 文件中。

tee -a /etc/hosts <<'EOF'
10.10.10.2 weiyigeek-02
10.10.10.3 weiyigeek-03
10.10.10.4 weiyigeek-04
10.10.10.5 weiyigeek-05
10.10.10.10 sec-lb.k8s.weiyigeek.cn   # VIP
EOF

快速安装配置 ansible

# 只在 weiyigeek-02 节点安装
# 查看安装
dnf update 
dnf list ansible --showduplicates | sort -r
dnf install ansible -y

# 查看版本
$ ansible --version
ansible 2.8.8
  config file = /etc/ansible/ansible.cfg
  .........
  python version = 3.7.9 (default, Aug 14 2023, 15:59:31) [GCC 7.3.0]

# 配置分组&组变量
tee -a /etc/ansible/hosts <<'EOF'
[master]
weiyigeek-[02:04]

[work]
weiyigeek-05

[k8s:children]
master
work

[k8s:vars]
ansible_port=20211
ansible_user=root
EOF

在 weiyigeek-02 节点上生成主机公密钥认证的所需的公密钥,以及配置与其他三台主机互信

ssh-keygen -t ed25519 -C "devops@weiyigeek"
for i in $(seq 2 5);do ssh-copy-id -o StrictHostKeyChecking=no -p 20211 root@weiyigeek-0${i};done

验证 Ansible 是否工作正常,若出现 SUCCESS => {"ping": "pong"} 表示各节点连接成功

ansible k8s -m ping -o
  weiyigeek-02 | SUCCESS => {"ping": "pong"}
  weiyigeek-03 | SUCCESS => {"ping": "pong"}
  weiyigeek-04 | SUCCESS => {"ping": "pong"}
  weiyigeek-05 | SUCCESS => {"ping": "pong"}
  
ansible work -m ping -o
  weiyigeek-05 | SUCCESS => {"ping": "pong"}

使用 ansible 批量添加本地 hosts 解析

方式1.blockinfile 模块
ansible k8s -m blockinfile -a 'path=/etc/hosts block="10.10.10.2 weiyigeek-02\n10.10.10.3 weiyigeek-03\n10.10.10.4 weiyigeek-04\n10.10.10.5 weiyigeek-05\n10.10.10.10 sec-lb.k8s.weiyigeek.cn" marker="#{mark} K8S Master-work Hosts" '

方式2.lineinfile 模块(推荐), 若存在则不会插入
ansible k8s -m lineinfile -a 'path=/etc/hosts line="10.10.10.2 weiyigeek-02" create=yes' -o
ansible k8s -m lineinfile -a 'path=/etc/hosts line="10.10.10.3 weiyigeek-03" create=yes' -o
ansible k8s -m lineinfile -a 'path=/etc/hosts line="10.10.10.4 weiyigeek-04" create=yes' -o
ansible k8s -m lineinfile -a 'path=/etc/hosts line="10.10.10.5 weiyigeek-05" create=yes' -o
ansible k8s -m lineinfile -a 'path=/etc/hosts line="10.10.10.10 sec-lb.k8s.weiyigeek.cn" create=yes' -o

批量验证主机硬解析配置: ansible k8s -m shell -a "cat /etc/hosts"


主机时间

使用 ansible 批量修改主机时间时区

# 自动同步时间以及主机时区设置
ansible k8s -m shell -a "ntpdate ntp1.aliyun.com" -o
ansible k8s -m shell -a "timedatectl set-timezone Asia/Shanghai && timedatectl set-local-rtc 0" -o 

# 此处KylinOS安全加固模板是采用的chronyd同步而非ntpdate,而需将ntp.aliyun.com更改为ntp1.aliyun.com
ansible k8s -m replace -a 'path=/etc/chrony.conf regexp="ntp.aliyun.com" replace="ntp1.aliyun.com"' -o

批量验证主机时间时区(CST,+0800): ansible k8s -m shell -a "timedatectl"


主机 swap 禁用

使用 ansible 批量修改禁用主机的swap交换空间:

# 临时生效
ansible k8s -m shell -a "sysctl -w vm.swappiness=0"

# 永久生效
ansible k8s -m lineinfile -a 'path=/etc/sysctl.conf line="# 部署 Kubernetes 集群相关内核参数配置"' -o
ansible k8s -m lineinfile -a 'path=/etc/sysctl.conf line="vm.swappiness = 0"' -o

主机 SELINUX 禁用

使用 ansible 批量修改主机 SELINUX

# 临时生效
ansible k8s -m shell -a "setenforce 0"
# 永久生效
ansible k8s -m replace -a 'path=/etc/selinux/config regexp="SELINUX=enforcing" replace="SELINUX=disabled"' -o
ansible k8s -m shell -a "grep "SELINUX" /etc/selinux/config"

主机内核参数调整

使用 ansible 批量启用内核转发模块及网桥过滤:

# 临时生效
# ansible k8s -m shell -a "sudo modprobe overlay && sudo modprobe br_netfilter" -o 

# 永久生效
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
# 转发 IPv4 并让 iptables 看到桥接流量
overlay
br_netfilter
EOF
ansible k8s -m copy -a "src=/etc/modules-load.d/k8s.conf dest=/etc/modules-load.d/k8s.conf force=yes" -o 

# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF
ansible k8s -m copy -a "src=/etc/sysctl.d/k8s.conf dest=/etc/sysctl.d/k8s.conf force=yes" -o 

# 应用 sysctl 参数而不重新启动
ansible k8s -m shell -a "sudo sysctl --system"

验证主机 br_netfilter 和 overlay 模块被加载: ansible k8s -m shell -a 'lsmod | grep -E "br_netfilter|overlay"'

weiyigeek.top-br_netfilter 和 overlay 模块加载图

使用 ansible 批量修改禁用主机的防火墙:

ansible k8s -m shell -a "systemctl disable firewalld.service && systemctl stop firewalld.service"

5.安装配置 ipvs 负载均衡模块

使用 ansible 批量安装 ipvs 工具并配置自动加载 ipvs 相关参数到内核中。

# 安装 ipvs 工具
ansible k8s -m shell -a "dnf install ipset ipvsadm -y"

# 重启主机后将自动加载 ipvs 相关模块到内核中
tee /etc/modules-load.d/ipvs.conf <<'EOF'
# 加载 ipvs 负载均衡相关模块到内核
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
ansible k8s -m copy -a "src=/etc/modules-load.d/ipvs.conf dest=/etc/modules-load.d/ipvs.conf force=yes" -o 

# 使用Shell脚本加载 overlay、br_netfilter、ipvs 模块
ansible k8s -m file -a "path=/etc/modules.d/ state=directory mode=0644"
tee /etc/modules.d/k8s.modules <<'EOF'
#!/bin/bash
# netfilter 模块 允许 iptables 检查桥接流量
modprobe br_netfilter
modprobe overlay

# nf_conntrack
modprobe nf_conntrack

# ipvs
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
EOF
ansible k8s -m copy -a "src=/etc/modules.d/k8s.modules dest=/etc/modules.d/k8s.modules force=yes" -o 
ansible k8s -m shell -a "bash /etc/modules.d/k8s.modules"

验证主机nf_conntrack、ip_vs相关模块是否被加载:ansible k8s -m shell -a "lsmod | grep -e ip_vs -e nf_conntrack"

weiyigeek.top-验证nf_conntrack、ip_vs相关模块加载图

温馨提示: 上述配置参考了【基于 IPVS 的集群内部负载均衡 [https://kubernetes.io/zh-cn/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive/]】文章,想详细了解的配置可以进去看看。

温馨提示: 在 kernel 4.19 版本及以上将使用 nf_conntrack 模块, 则在 4.18 版本以下则需使用nf_conntrack_ipv4 模块。


6.安装配置 HAproxy & Keepalived

描述: 此处需要在主机中安装haproxy(HAProxy Load Balancer)用于HA代理健康检测,以及安装keepalivedLVS and VRRP High Availability Monitor)用于虚拟路由协议-主从创建一个VIPS虚拟地址。

快速安装配置 HAproxy & Keepalived
查看主机 HAproxy & Keepalived 可用版本

dnf list haproxy keepalived --showduplicates | sort -r
# 上次元数据过期检查:0:25:52 前,执行于 2023年08月25日 星期五 11时04分07秒。
# 可安装的软件包
keepalived.x86_64                   2.0.20-19.ky10                   ks10-adv-os
haproxy.x86_64                      2.2.16-3.ky10                    ks10-adv-os

使用 ansible 批量在 master 组中节点安装 HAproxy & Keepalived 工具

ansible master -m shell -a "dnf install haproxy keepalived -y" -o

HAproxy 配置文件,需要放置在各 maste 节点上 。


完整原文地址: https://mp.weixin.qq.com/s/L-qABhXkHPx9dlmwQA-jFQ

本文至此完毕,更多技术文章,尽情期待下一章节!


专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注,转个发,留个言】(人间六大情),这将对我的肯定,谢谢!。

点击 👉 关注「 全栈工程师修炼指南」公众号
微信沟通交流: weiyigeeker (点击添加)
交流沟通群:629184198 或 关注公众号回复【学习交流群】

温馨提示: 由于作者水平有限,本章错漏缺点在所难免,希望读者批评指正,并请在文章末尾留下您宝贵的经验知识,联系邮箱地址 master@weiyigeek.top 或者关注公众号 WeiyiGeek 联系我。

posted @ 2023-09-25 10:20  全栈工程师修炼指南  阅读(900)  评论(0编辑  收藏  举报