文章目录
更新说明
本方案与上一个版本做了大量更新,主要更新如下:
1:底层操作系统从 CentOS 更新为 Ubuntu Server 24.04 ;
2:环境预配置同步迭代为在 Ubuntu Server 上执行;
3:创建配置文件脚本彻底重构,实现多节点的动态支持;
4:Metrics、Ingress、Longhorn、kubesphere均更新为helm部署的方式;
5:Longhorn做了图形界面UI组件和真正提供存储的driver组件分离;
6:新增了kube-Prometheus+grafana组件,并做了数据持久化,提供集群监控;
7:新增了一个快速生成自签名证书的脚本。
部署组件
该 Kubernetes 部署过程中,对于部署环节,涉及多个组件,主要有 kubeadm 、kubelet 、kubectl。
kubeadm介绍
Kubeadm 为构建 Kubernetes 提供了便捷、高效的“最佳实践” ,该工具提供了初始化完整 Kubernetes 过程所需的组件,其主要命令及功能有:
- kubeadm init:用于搭建 Kubernetes 控制平面节点;
- kubeadm join:用于搭建 Kubernetes 工作节点并将其加入到集群中;
- kubeadm upgrade:用于升级 Kubernetes 集群到新版本;
- kubeadm token:用于管理 kubeadm join 使用的 token;
- kubeadm reset:用于恢复(重置)通过 kubeadm init 或者 kubeadm join 命令对节点进行的任何变更;
- kubeadm certs:用于管理 Kubernetes 证书;
- kubeadm kubeconfig:用于管理 kubeconfig 文件;
- kubeadm version:用于显示(查询)kubeadm 的版本信息;
- kubeadm alpha:用于预览当前从社区收集到的反馈中的 kubeadm 特性。
更多参考:Kubeadm介绍
kubelet介绍
kubelet 是 Kubernetes 集群中用于操作 Docker 、containerd 等容器运行时的核心组件,需要在每个节点运行。通常该操作是基于 CRI 实现,kubelet 和 CRI 交互,以便于实现对 Kubernetes 的管控。
kubelet 主要用于配置容器网络、管理容器数据卷等容器全生命周期,对于 kubelet 而言,其主要的功能核心有:
- Pod 更新事件;
- Pod 生命周期管理;
- 上报 Node 节点信息。
更多参考:kubelet介绍
kubectl介绍
kubectl 控制 Kubernetes 集群管理器,是作为 Kubernetes 的命令行工具,用于与 apiserver 进行通信,使用 kubectl 工具在 Kubernetes 上部署和管理应用程序。
使用 kubectl,可以检查群集资源的创建、删除和更新组件。
同时集成了大量子命令,可更便捷的管理 Kubernetes 集群,主要命令如下:
- Kubetcl -h:显示子命令;
- kubectl option:查看全局选项;
- kubectl <command> --help:查看子命令帮助信息;
- kubelet [command] [PARAMS] -o=<format>:设置输出格式,如json、yaml等;
- Kubetcl explain [RESOURCE]:查看资源的定义。
更多参考:kubectl介绍
方案概述
方案介绍
本方案基于 kubeadm 部署工具实现完整生产环境可用的 Kubernetes 高可用集群,同时提供相关 Kubernetes 周边组件。
其主要信息如下:
- 版本:Kubernetes 1.32.3 版本;
- kubeadm:采用 kubeadm 部署 Kubernetes ;
- OS:Ubuntu Server 24.04 LTS;
- etcd:采用融合方式;
- HAProxy:以系统systemd形式运行,提供反向代理至3个master 6443端口;
- KeepAlived:用于实现 apiserver 的高可用;
- KubeSphere:是基于 Kubernetes 内核的分布式多租户商用云原生操作系统。在开源能力的基础上,在多云集群管理、微服务治理、应用管理等多个核心业务场景进行功能延伸。
- Prometheus+Grafana:用于集群监控;
- 其他主要部署组件包括:
- Metrics:度量组件,用于提供相关监控指标;
- Dashboard:Kubernetes 集群的前端图形界面;
- Helm:Kubernetes Helm 包管理器工具,用于后续使用 helm 整合包快速部署应用;
- Ingress:Kubernetes 服务暴露应用,用于提供7层的负载均衡,类似 Nginx,可建立外部和内部的多个映射规则;
- containerd:Kubernetes 底层容器时;
- Longhorn:Kubernetes 动态存储组件,用于提供 Kubernetes 的持久存储。
提示:本方案部署所使用脚本均由本人提供,可能不定期更新。
部署规划
节点规划
节点主机名 | IP | 类型 | 可运行服务/组件 |
---|---|---|---|
master01 | 172.24.8.181 | Kubernetes master节点 | kubeadm、kubelet、kubectl、KeepAlived、containerdetcd、kube-apiserver、kube-scheduler、kube-controller-manager、calicodashboard、metrics、ingress、Longhorn ui节点、Prometheus+Grafana节点KubeSphere节点 |
master02 | 172.24.8.182 | Kubernetes master节点 | kubeadm、kubelet、kubectl、KeepAlived、containerdetcd、kube-apiserver、kube-scheduler、kube-controller-manager、calicodashboard、metrics、ingress、Longhorn ui节点、Prometheus+Grafana节点KubeSphere节点 |
master03 | 172.24.8.183 | Kubernetes master节点 | kubeadm、kubelet、kubectl、KeepAlived、containerdetcd、kube-apiserver、kube-scheduler、kube-controller-manager、calicodashboard、metrics、ingress、Longhorn ui节点、Prometheus+Grafana节点KubeSphere节点 |
worker01 | 172.24.8.184 | Kubernetes worker节点 | kubelet、containerd、calico、metrics、Longhorn driver节点Prometheus+Grafana节点、KubeSphere节点 |
worker02 | 172.24.8.185 | Kubernetes worker节点 | kubelet、containerd、calico、metrics、Longhorn driver节点Prometheus+Grafana节点、KubeSphere节点 |
worker03 | 172.24.8.186 | Kubernetes worker节点 | kubelet、containerd、calico、metrics、Longhorn driver节点Prometheus+Grafana节点、KubeSphere节点 |
Kubernetes集群高可用主要指的是控制平面的高可用,多个Master节点组件(通常为奇数)和Etcd组件的高可用,worker节点通过前端负载均衡VIP( 172.24.8.180 )连接到Master。
Kubernetes高可用架构中etcd与Master节点组件混合部署方式特点:
- 所需服务器节点资源少,具备超融合架构特点
- 部署简单,利于管理
- 容易进行横向扩展
- etcd复用Kubernetes的高可用
- 存在一定风险,如一台master主机挂了,master和etcd都少了一个节点,集群冗余度受到一定影响
提示:本实验使用Keepalived+HAProxy架构实现Kubernetes的高可用。
主机名配置
需要对所有节点主机名进行相应配置。
root@localhost:~# hostnamectl set-hostname master01 #其他节点依次修改
提示:如上需要在所有节点修改对应的主机名。\
生产环境通常建议在内网部署dns服务器,使用dns服务器进行解析,本指南采用本地hosts文件名进行解析。
如下hosts文件修改仅需在master01执行,后续使用批量分发至其他所有节点。
root@master01:~# cat >> /etc/hosts << EOF
172.24.8.181 master01
172.24.8.182 master02
172.24.8.183 master03
172.24.8.184 worker01
172.24.8.185 worker02
172.24.8.186 worker03
EOF
提示:如上仅需在master01节点上操作。\
变量准备
为实现自动化部署,自动化分发相关文件,提前定义相关主机名、IP组、变量等。
root@master01:~# wget http://down.linuxsb.com/mydeploy/k8s/v1.32.3/environment.sh
root@master01:~# vi environment.sh #确认相关主机名和IP
#!/bin/bash
#***************************************************************#
# ScriptName: environment.sh
# Author: xhy
# Create Date: 2025-02-22 01:44
# Modify Author: xhy
# Modify Date: 2025-02-22 01:44
# Version: v1
#***************************************************************#
# 集群 MASTER 机器 IP 数组
export MASTER_IPS=(172.24.8.181 172.24.8.182 172.24.8.183)
# 集群 MASTER IP 对应的主机名数组
export MASTER_NAMES=(master01 master02 master03)
# 集群 NODE 机器 IP 数组
export NODE_IPS=(172.24.8.184 172.24.8.185 172.24.8.186)
# 集群 NODE IP 对应的主机名数组
export NODE_NAMES=(worker01 worker02 worker03)
# 集群所有机器 IP 数组
export ALL_IPS=(172.24.8.181 172.24.8.182 172.24.8.183 172.24.8.184 172.24.8.185 172.24.8.186)
# 集群所有IP 对应的主机名数组
export ALL_NAMES=(master01 master02 master03 worker01 worker02 worker03)
提示:如上仅需在master01节点上操作。\
互信配置
为了方便远程分发文件和执行命令,本方案配置master01节点到其它节点的 ssh信任关系,即免秘钥管理所有其他节点。
root@master01:~# source environment.sh #载入变量
root@master01:~# ssh-keygen -f ~/.ssh/id_rsa -N ''
root@master01:~# for all_ip in ${ALL_IPS[@]}
do
echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
ssh-copy-id -i ~/.ssh/id_rsa.pub root@${all_ip}
done
root@master01:~# for all_name in ${ALL_NAMES[@]}
do
echo -e "\n\n\033[33m[INFO] >>> ${all_name}...\033[0m"
ssh-copy-id -i ~/.ssh/id_rsa.pub root@${all_name}
done
提示:如上仅需在master01节点上操作。\
环境预配置
kubeadm本身仅用于部署Kubernetes集群,在正式使用kubeadm部署Kubernetes集群之前需要对操作系统环境进行准备,即环境预配置。
环境的预配置本方案使用脚本自动完成。
使用如下脚本对基础环境进行初始化,主要功能包括:
- 安装containerd,Kubernetes平台底层的容器组件
- 关闭SELinux及防火墙
- 优化相关内核参数,针对生产环境Kubernetes集群的基础系统调优配置
- 关闭swap
- 设置相关模块,主要为转发模块
- 配置相关基础软件,部署Kubernetes集群所需要的基础依赖包
- 创建container所使用的独立目录
- 配置crictl和运行时的连接,便于后期使用crictl命令
提示:后续ctr命令下载镜像的时候,若需要使用containerd的加速,必须带上–hosts-dir,ctr当前环境所管理的镜像都属于k8s.io,因此创建一个别名。
root@master01:~# wget http://down.linuxsb.com/mydeploy/k8s/v1.32.3/uk8spreconfig.sh
root@master01:~# vim uk8spreconfig.sh
#!/bin/bash
#***************************************************************#
# ScriptName: uk8spreconfig.sh
# Author: xhy
# Create Date: 2025-03-29 12:30
# Modify Author: xhy
# Modify Date: 2025-03-29 21:06
# Version: v1
#***************************************************************#
# Initialize the machine. This needs to be executed on every machine.
apt update && apt upgrade -y && apt autoremove -y
# Install package
sudo apt -y install conntrack ntpdate ntp ipvsadm ipset jq iptables sysstat wget
# Add Docker's official GPG key
sudo apt -y install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
# Install and config containerd
apt-cache madison containerd
sudo apt -y install containerd.io
sleep 3s
mkdir -p /etc/containerd/certs.d/docker.io
mkdir -p /data/containerd
cat > /etc/containerd/config.toml <<EOF
disabled_plugins = ["io.containerd.internal.v1.restart"]
root = "/data/containerd"
version = 2
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
# sandbox_image = "registry.k8s.io/pause:3.10"
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.10"
[plugins."io.containerd.grpc.v1.cri".containerd]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
[plugins."io.containerd.runtime.v1.linux"]
shim_debug = true
EOF
cat > /etc/containerd/certs.d/docker.io/hosts.toml <<EOF
server = "https://registry-1.docker.io"
[host."https://docker.1ms.run"]
capabilities = ["pull", "resolve", "push"]
[host."https://dbzucv6w.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve", "push"]
[host."https://docker.xuanyuan.me"]
capabilities = ["pull", "resolve", "push"]
EOF
# config crictl & containerd
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
echo 'alias ctrpull="ctr -n k8s.io images pull --hosts-dir /etc/containerd/certs.d"' >> /etc/profile.d/custom_bash.sh
systemctl restart containerd
systemctl enable containerd --now
# Turn off and disable the firewalld.
systemctl disable ufw --now || true
# Modify related kernel parameters & Disable the swap.
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.tcp_tw_recycle = 0
vm.swappiness = 0
vm.overcommit_memory = 1
vm.panic_on_oom = 0
net.ipv6.conf.all.disable_ipv6 = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
modprobe br_netfilter
modprobe overlay
sysctl --system
# Add ipvs modules
cat > /etc/modules-load.d/ipvs.conf <<EOF
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
br_netfilter
overlay
EOF
systemctl restart systemd-modules-load.service
提示:containerd 镜像加速配置更多可参考:
containerd配置镜像加速器 containerd官方加速配置
提示:如上仅需在master01节点上操作,建议初始化完后进行重启。\
root@master01:~# source environment.sh
root@master01:~# chmod +x *.sh
root@master01:~# for all_ip in ${ALL_IPS[@]}
do
echo -e "\n\n\033[33m[INFO] >>> ${all_ip}...\033[0m"
sleep 2
scp -rp /etc/hosts root@${all_ip}:/etc/hosts
scp -rp uk8spreconfig.sh root@${all_ip}:/root/
ssh root@${all_ip} "bash /root/uk8spreconfig.sh"
done
提示:如上仅需在master01节点上操作。\
部署高可用组件
HAProxy安装
HAProxy是可提供高可用性、负载均衡以及基于TCP(从而可以反向代理kubeapiserver等应用)和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种高可用解决方案。
root@master01:~# HAVERSION=3.1.6
root@master01:~# LHAVERSION=$(echo ${HAVERSION} | cut -d. -f1,2)
root@master01:~# wget https://mirrors.huaweicloud.com/haproxy/${LHAVERSION}/src/haproxy-${HAVERSION}.tar.gz
root@master01:~# for master_ip in "${MASTER_IPS[@]}"
do
echo -e "\n\n\033[33m[INFO] >>> ${master_ip}...\033[0m"
sleep 2
ssh root@${master_ip} "apt-get -y install binutils gcc make wget openssh-client libssl-dev libpcre2-dev zlib1g-dev"
scp -rp haproxy-${HAVERSION}.tar.gz root@${master_ip}:/root/
ssh root@${master_ip} "tar -zxvf haproxy-${HAVERSION}.tar.gz"
ssh root@${master_ip} "cd haproxy-${HAVERSION}/ && make USE_OPENSSL=1 TARGET=linux-glibc USE_PCRE2=1 USE_ZLIB=1 PREFIX=/usr/local/haprpxy && make install PREFIX=/usr/local/haproxy"
ssh root@${master_ip} "cp /usr/local/haproxy/sbin/haproxy /usr/sbin/"
ssh root@${master_ip} "useradd -r haproxy && usermod -G haproxy haproxy"
ssh root@${master_ip} "mkdir -p /etc/haproxy && mkdir -p /etc/haproxy/conf.d && cp -r /root/haproxy-${HAVERSION}/examples/errorfiles/ /usr/local/haproxy/"
done
提示:如上仅需在master01节点上操作,,在ubuntu 24.04上需要明确指定 USE_PCRE2 ,使用 libssl-dev 和 libpcre2-dev 相关库文件。\
提示:Haproxy官方参考: https://docs.haproxy.org/ 。
KeepAlived安装
KeepAlived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。
本方案3台master节点均部署并运行Keepalived,一台为主服务器(MASTER),另外两台为备份服务器(BACKUP)。
Master集群外表现为一个VIP,主服务器会发送特定的消息给备份服务器,当备份服务器收不到这个消息的时候,即主服务器宕机的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。
root@master01:~# KPVERSION=2.3.2
root@master01:~# LKPVERSION=$(echo ${HAVERSION} | cut -d. -f1,2)
root@master01:~# wget https://www.keepalived.org/software/keepalived-${KPVERSION}.tar.gz
root@master01:~# for master_ip in "${MASTER_IPS[@]}"
do
echo -e "\n\n\033[33m[INFO] >>> ${master_ip}...\033[0m"
sleep 2
ssh root@${master_ip} "apt-get -y install curl gcc make libnl-3-dev libnl-genl-3-dev
"
scp -rp keepalived-${KPVERSION}.tar.gz root@${master_ip}:/root/
ssh root@${master_ip} "tar -zxvf keepalived-${KPVERSION}.tar.gz"
ssh root@${master_ip} "cd keepalived-${KPVERSION}/ && ./configure --sysconf=/etc --prefix=/usr/local/keepalived && make && make install"
ssh root@${master_ip} "cd keepalived-${KPVERSION}/ && cp -a keepalived/keepalived.service /usr/lib/systemd/system/"
ssh root@${master_ip} "systemctl daemon-reload && systemctl enable keepalived"
done
提示:如上仅需在master01节点上操作。\
提示:KeepAlive官方参考: https://www.keepalived.org/manpage.html 。
创建配置文件
创建集群部署所需的相关组件配置,采用脚本自动化创建相关配置文件。
root@master01:~# wget http://down.linuxsb.com/mydeploy/k8s/v1.32.3/uk8sconfig.sh #拉取自动部署脚本
root@master01:~# vim uk8sconfig.sh
#!/bin/bash
#***************************************************************#
# ScriptName: uk8sconfig.sh
# Author: xhy
# Create Date: 2025-03-29 13:01
# Modify Author: xhy
# Modify Date: 2025-03-29 21:32
# Version: v1
#***************************************************************#
#######################################
# 全局变量配置区
#######################################
echo -e "\n\033[33m[INFO] 开始定义全局参数...\033[0m"
sleep 1
declare -A NODES=(
[master01]="172.24.8.181"
[master02]="172.24.8.182"
[master03]="172.24.8.183"
)
# 公共参数
K8SHA_VERSION=v1.32.3
K8SHA_VIP="172.24.8.180"
K8SHA_PORT="6443"
K8SHA_AUTH="ilovek8s"
K8SHA_PODCIDR="10.10.0.0/16"
K8SHA_SVCCIDR="10.20.0.0/16"
K8SHA_DNSIP="10.20.0.10"
K8SHA_NETINF="eth0"
echo -e "\n\033[32m[SUCCESS] 全局参数定义已完成...\033[0m"
set -euo pipefail # 启用严格模式
#######################################
# 函数定义区
#######################################
# 创建目录结构
init_dirs() {
echo -e "\n\033[33m[INFO] 开始创建目录结构...\033[0m"
sleep 1
for node in "${
!NODES[@]}"; do
mkdir -p k8sdir/${node}/{
keepalived,haproxy}
done
mkdir -p k8sdir/{
keepalived,haproxy,init}
echo -e "\n\033[32m[SUCCESS] 目录结构创建已完成...\033[0m"
}
# 下载基础配置文件
download_templates() {
echo -e "\n\033[33m[INFO] 开始下载模板文件...\033[0m"
sleep 1
# Keepalived模板
wget -qcP k8sdir/keepalived/ http://down.linuxsb.com/mydeploy/k8s/common/{
uk8s-keepalived.conf.tpl,uk8s-check-apiserver.sh}
# HAProxy模板
wget -qcP k8sdir/haproxy/ http://down.linuxsb.com/mydeploy/k8s/common/{
uk8s-haproxy.cfg.tpl,k8s-haproxy.service}
# k8s配置模板
wget -qcP k8sdir/init/ http://down.linuxsb.com/mydeploy/k8s/${K8SHA_VERSION}/ukubeadm-config.yaml.tpl
echo -e "\n\033[32m[SUCCESS] 模板文件下载已完成...\033[0m"
}
# 生成HAProxy配置
gen_haproxy_conf() {
echo -e "\n\033[33m[INFO] 生成 HAProxy 配置...\033[0m"
sleep 1
local backend_servers=