微信改版了,现在看到我们全凭缘分,为了不错过【全栈工程师修炼指南】重要内容及福利,大家记得按照上方步骤设置「接收文章推送」哦~
关注【公众号】回复【学习交流群】加入【SecDevOps】学习交流群!
原文链接:
文章目录:
本文为作者原创文章,为尊重作者劳动成果禁止非授权转载,若需转载请在【全栈工程师修炼指南】公众号留言,或者发送邮件到 [master@weiyigeek.top] 中我将及时回复。
描述: 由于公司内部需要将原本繁重的elk日志收集平台(等保需要)
以及Promethus资源监控预警平台(开发运维测试需要)
,迁移到国产Linux操作系统之中(大趋势
),作者我也趁着此机会,将原本单机部署的项目进行迁移到,使用银河麒麟( KylinOS V10)
服务器操作系统部署最新 V1.28 版本的高可用 Kubernetes 云平台上,让企业全面拥抱云原生,以及国产化替代。
此外,作者也将使用Promtail + Loki + Grafana
贴近于云原生的架构来全面替换繁重elk日志收集平台,并且使用 Promethus + Exporters + Alertmanager + PushGateWay
来完成企业内部主机、网络设备、业务等相关资源的监控预警,此系列文章将会在《#云原生落地实用指南》付费专栏之中进行持续更新,希望对各位有需要的朋友有帮助,也请多多支持作者创作更多云原生落地实践文章。
此篇文章是作者花费了半天时间,为了防止恶意爬虫和伸手党直接转发,所以作者将此文设为付费文章(请作者喝一杯☕ 精神精神),希望大家理解并多多支持。
作者将实践步骤流程进行总结,从而帮助各位企业IT朋友,在安全加固
后的银河麒麟(KylinOS V10
)服务器操作系统中,使用ansible + 手动的方式
快速安装部署最新v1.28版本的 Kubernetes 高可用集群,以及NFS动态持久存储卷、Ingress-nginx、
以及集群包管理工具 helm,集群管理工具 k9s
等相关基础安装配置,为前面所述的,以为后续的日志收集
和资源监控预警
做准备,让云原生实实在在企业中落地,加快企业内部的数字化转型以及完成企业内部国产化替代工作。
若还有不了解的银河麒麟( KylinOS V10)系统的朋友可以参考,作者的此篇文章《企业实践 | 国产操作系统之光? 银河麒麟KylinOS-V10(SP3)高级服务器操作系统基础安装篇》进行基础扫盲。
温馨提示: 此篇文章也适用于在 CentOS8 主机中安装高可用的K8S集群(V1.28)。
描述:下面介绍了几种 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/
描述: 此处作者使用 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银河麒麟安全加固实践视频
温馨提示: Kubernetes 是支持 IPv4 + IPv6
双栈, 若要使用IPV6的目的是在公网进行访问,需要配置 IPV6 静态地址。若您没有IPV6环境,或者不想使用IPv6,不对主机进行配置IPv6地址即可,并不会不影响后续,不过集群依旧是支持IPv6的,为后期留有扩展可能性。
描述: 此处作者使用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架构说明
描述: 由于我是采用安全加固后的虚拟机模板克隆的其他三台主机,我们需要按照K8S官方文档主机网络要求进行排除和配置; 我们需要确保每个节点上 MAC 地址
和 product_uuid
的唯一性,你可以使用命令 ip link
或 ifconfig -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"
使用 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
使用 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 <
- # 转发 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 <
- 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代理健康检测,以及安装keepalived
(LVS and VRRP High Availability Monitor
)用于虚拟路由协议-主从创建一个VIPS虚拟地址。
快速安装配置 HAproxy & Keepalived查看主机 HAproxy & Keepalived 可用版本
-
相关阅读:
C编程入门到精通 专辑目录
[LeetCode周赛复盘] 第 326 场周赛20230101
遭遇DDOS攻击忍气吞声?立刻报警!首都网警重拳出击,犯罪分子无所遁形
Python之并发编程(协程)
万圣节服装上亚马逊美国站CPC认证的注意事项
浅谈react组件间通信方式
基于IMDB评论数据集的情感分析
css的属性选择器的妙用,来用它实现一个轻量的tips组件吧
【毕业设计】 python flas疫情爬虫可视化
经常喝可乐会得肾结石吗?
-
原文地址:https://blog.csdn.net/u013072756/article/details/133191651