版权声明:本文为7号(又逢乱世)博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1053765496/article/details/147721777
————————————————
目录
1. 小型集群(适合小企业或试运行环境,主要用于试运行的测试环境)
kubeadm 是 Kubernetes 官方提供的一个命令行工具,用于快速初始化和管理 Kubernetes 集群。它适合在生产环境和开发测试中部署标准的 Kubernetes 集群。
Kubernetes 集群最低配置要求
控制节点(Master Node)
-
CPU:2 核或以上(最少 2 核)
-
内存:2GB(2048MB)或以上
-
磁盘空间:20 GB(建议更大,视情况而定)
-
操作系统:支持的 Linux 发行版
工作节点(Worker Node)
-
CPU:1 核
-
内存:1GB
-
磁盘空间:20 GB
-
操作系统:支持的 Linux 发行版
生产环境常见集群规模
1. 小型集群(适合小企业或试运行环境,主要用于试运行的测试环境)
-
🖥️ 1~3 台 Master 节点、每台2核/4G
-
⚙️ 2~5 台 Worker 节点、每台2~4核/4~8G
-
🌐 用于运行少量中型应用服务
-
✅ 支持基础高可用需 3 台Master
2. 中型集群(适合中等规模服务或多模块微服务)
-
🖥️ 3 台 Master 节点(高可用集群,etcd 分布式部署)、每台4核/8G
-
⚙️ 5~20 台 Worker 节点、每台4~8核/8~16G
-
🔄 通常结合 CI/CD、监控、日志等工具
3. 大型集群(大企业/云平台)
-
🖥️ 3~5 台 Master 节点(分区部署控制平面和 etcd)、每台8核/16~32G
-
⚙️ 二十到上百台或更多 Worker 节点、每台8~32核/16~64G
-
📦 可能运行上千个 Pod,支持多租户、多业务系统
Worker 建议资源划分
如果你部署的是 Spring Boot 项目:
- 每个 Pod 建议资源分配:0.5~1 核 CPU、512MB~1.5GB 内存
- 每台 Worker 根据 Pod 占用的资源,平均分配 Pod 数量
- 留出 25% 资源给系统组件,例如 8 核 / 16GB,实际可用是 6 核 / 12 GB
QPS 与并发的区别
并发:系统里有 100 个线程,每个线程在处理一个请求,那此时的并发就是 100。
- 并发就是服务器瞬时能接收的请求,接收满了后就要等到之前的请求处理完成才可以继续接收。
- 线程数量是不是设置的越大越好?
- 线程多,线程切换开销大(叫“上下文切换”)
- 超出CPU能力后,系统反而变慢,有效CPU时间下降(CPU忙着切换线程而不是干活)
- QPS 无法线性提升,反而会下降
- 内存也会被线程栈空间占满
QPS:一秒内系统处理了 500 个请求(假设接口处理时间为200ms,那么1个线程1秒可以处理完5个请求,有100个线程在处理),那么 QPS = 500。
名称 | 全称 | 含义 | 关注点 | 类比 |
---|---|---|---|---|
QPS | Queries Per Second | 每秒处理的请求数量,是一个 速率 | “同一时刻”在处理的请求数 | 1 秒钟你能接待多少人 |
并发数 | Concurrent Requests | 同时处理的请求数量,是一个 数量 | “每秒”处理完的请求数 | 当前正在排队/就餐的人数 |
注意:1核处理器也可以设置100个线程,因为 线程 ≠ 同时执行。
- 线程是 快速轮换执行的(称为 时间片轮转调度)。
- 每个线程分到一点点时间,CPU 快速来回切换,看起来像“并发”。
- 例如:一个厨师在 10 个锅之间不停切换炒菜,每次只炒几秒,但切得快,你觉得他“在同时炒很多锅”。
QPS 与并发估算
Kubernetes 本身并不会限制并发 HTTPS 请求的数量,真正影响并发能力的是你部署在 Kubernetes 上的应用服务的性能(如 Spring Boot)、负载均衡策略、资源配置(CPU、内存) 和 网络带宽。
假设:每个 Pod 分配的资源是 1核/1GB。请求处理时间为 100~200ms(较好接口的时间)。25个线程(I/O密集型项目1核较合理的数量)(大部分Web项目都是I/O密集型项目,主要处理的是HTTP请求、调用数据库、调用接口。计算密集型项目做的是图像处理、视频转码、加密计算、复杂算法运算)。
-
每个 Pod 的并发能力大约是 20~25 并发请求(并发已经由线程数限制住了)。
-
QPS 范围:125 ~ 250 请求每秒。
每台机器的 QPS 与并发估值
真实场景中请通过 性能测试 来精确量化你的服务在实际运行时的并发能力
集群规模 | 服务配置 | Pod核数 | Pod数量 | 并发 | QPS (每秒处理的请求数) | 十万/百万/千万QPS要几台服务器 |
---|---|---|---|---|---|---|
小型 | 4核/8G | 1 | 3 | 75 | 375~750 | 134/1334/13334~267/2667/26667 |
中型 | 8核/16G | 1 | 6 | 150 | 750~1500 | 67/667/6667~134/1334/13334 |
大型 | 16核32G | 1 | 12 | 300 | 1500~3000 | 34/334/3334~67/667/6667 |
大型 | 32核/64G | 1 | 24 | 600 | 3000~6000 | 17/167/1667~34/334/3334 |
安装 Kubernetes 集群
服务器配置要求
三台 Ubuntu 服务器,用于本文测试配置 Kubernetes 集群
IP地址 | 节点角色 | CPU核数 | 内存 |
---|---|---|---|
192.168.189.135 | Master | 2 | 4 |
192.168.189.136 | Worker | 2 | 4 |
192.168.189.137 | Worker | 2 | 4 |
安装软件:kubeadm、kubelet、kubectl、containerd、calico
k8s 从 v1.24 开始正式移除 Docker,如果你要强用 Docker,推荐使用 v1.24 版本以下的,使用 v1.24 版本及以上使用,你将面临一大堆报错异常。
calico 是 k8s 容器网络插件,flannel 也是,但是 flannel 性能一般,不支持网络策略,适合学习、测试、小规模集群。calico 性能更高,支持网络安全策略,适合生产环境、中大型集群、对安全有要求的部署。
配置 Ubuntu 服务器
(在所有节点上配置)
1. 确认 Ubuntu 系统版本
使用如下命令:
lsb_release -a
或者
cat /etc/os-release
或者
hostnamectl
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 24.04.2 LTS
Release: 24.04
Codename: noble
2. 关闭 Swap,因为 Kubernetes 不支持 swap
# 关闭 swap
sudo swapoff -a
# 开机禁用 swap
sudo sed -i '/\/swap.img/s/^/#/' /etc/fstab
# 查看 swap 是否开启
swapon --show
3. 更新国内镜像源
不然 sudo apt update 会失败。
备份原来的镜像文件:
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.backup
编辑 /etc/apt/sources.list.d/ubuntu.sources 文件
sudo vim /etc/apt/sources.list.d/ubuntu.sources
原内容:
Types: deb
URIs: http://cn.archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
替换镜像源后内容:
阿里云
Types: deb
URIs: http://mirrors.aliyun.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
Types: deb
URIs: http://mirrors.aliyun.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
腾讯云
Types: deb
#URIs: http://archive.ubuntu.com/ubuntu/
URIs: http://mirrors.tencentyun.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
#Types: deb
#URIs: http://security.ubuntu.com/ubuntu/
#Suites: noble-security
#Components: main restricted universe multiverse
#Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
4. 更新软件包
# 更新本地的“软件包索引缓存”,获取镜像源地址中最新的软件版本,这个命令不会更新升级软件
sudo apt update
# 更新升级 apt update 得到的新版本,更新安装这些新版本到我们的服务器上
sudo apt upgrade -y
5. 时钟同步
安装 chrony
sudo apt update
sudo apt install -y chrony
重启命令
sudo systemctl restart chrony
设置开机自启动
sudo systemctl enable chrony
查看同步状态
chronyc tracking
检查时间是否同步
timedatectl status
安装 containerd
(在所有节点上安装 containerd)
安装 Kubernetes
(在所有节点上安装)
安装依赖包
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
添加 Kubernetes APT 仓库镜像源
curl -fsSL https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /usr/share/keyrings/kubernetes-archive-keyring.gpg
添加 Kubernetes APT 镜像源到系统的 APT 配置文件中,这样你就可以通过 APT 安装 Kubernetes 相关的软件包
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null
更新软件包列表
sudo apt-get update
安装 kubeadm, kubelet 和 kubectl
sudo apt-get install -y kubeadm kubelet kubectl
查看 kubeadm, kubelet 和 kubectl 是否安装成功
# 查看 kubeadm 版本
kubeadm version
# 查看 kubelet 版本
kubelet --version
# 查看 kubectl 版本
kubectl version --client
显示如下:
此时 kubelet 会因为缺少配置文件(如 /var/lib/kubelet/config.yaml)启动失败,这是正常现象,稍后你执行 kubeadm init 或 join 后它会自动配置并运行。
查看 kubelet 错误信息:sudo journalctl -u kubelet -f
配置 k8s 集群 Master
1. 配置内核参数(在所有节点上配置)
作用是 Kubernetes 及其网络插件、容器运行时等。依赖内核的一些关键功能和行为,如果这些参数配置不当,会导致组件运行异常、网络不通、性能问题等。
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
2. 设置 iptables 模式为 legacy(在所有节点上设置)
作用是 iptables-legacy 是经过多年验证、非常稳定的实现,而 iptables-nft 和 nftables 虽然更现代,但早期版本的稳定性和社区支持较弱。Kubernetes 官方更倾向于选择一个广泛测试和成熟的后端,避免由于底层差异引起的问题。还有很多网络插件(CNI 插件,如 Flannel、Calico、Canal 等)在设计时基于 legacy 模式,如果切换为 nft,可能引发规则解析错误或不生效。
sudo apt-get install -y iptables arptables ebtables
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
查看 iptables 当前使用的是什么模式
sudo iptables --version
3. 初始化集群(在 Master 节点上执行)
a. 先提前拉取 k8s 镜像 kube-apiserver、kube-controller-manager、kube-scheduler、kube-proxy、pause、etcd、coredns。
sudo kubeadm config images pull \
--kubernetes-version=v1.28.2 \
--image-repository=registry.aliyuncs.com/google_containers
### 命令说明:
# kubeadm config images pull:拉取镜像
# kubernetes-version=vX.Y.Z:版本号通过 kubelet --version 查看
# --image-repository=registry.aliyuncs.com/google_containers:使用国内阿里云镜像
b. 初始化 Kubernetes 集群(在 Master 节点上执行)
sudo kubeadm init \
--apiserver-advertise-address=192.168.189.135 \
--pod-network-cidr=192.168.0.0/16 \
--node-name=192.168.189.135 \
--image-repository=registry.aliyuncs.com/google_containers
### 命令说明
# --apiserver-advertise-address=192.168.189.135:指定 kube-apiserver 向集群中其他节点通告的 IP 地址。这个地址必须是本机(master 节点)的内网 IP,不要写回环地址
# --pod-network-cidr=192.168.0.0/16:指定 Pod 网络使用的 CIDR(子网),用于之后安装 CNI 网络插件时匹配。Flannel 使用 10.244.0.0/16,Calico 使用 192.168.0.0/16
# --node-name=192.168.189.135:指定这个 master 节点的名称,在集群中注册为这个名字。可以使用IP 或者主机名
# --image-repository=registry.aliyuncs.com/google_containers:用于替代默认的 k8s.gcr.io 镜像仓库,加快国内拉取速度。
会报这个错:detected that the sandbox image "registry.k8s.io/pause:3.9" of the container runtime is inconsistent with that used by kubeadm. It is recommended that using "registry.aliyuncs.com/google_containers/pause:3.9" as the CRI sandbox image.
解决办法:
编辑 /etc/containerd/config.toml
sudo vim /etc/containerd/config.toml
把 sandbox_image 属性修改为上面错误信息提到的 registry.aliyuncs.com/google_containers/pause:3.9
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
修改好后,清理 kubeadm init 初始化记录,然后重新执行 b 操作
# 一键清理旧的 kubeadm 初始化记录
sudo kubeadm reset -f
执行成功图(输出 kubeadm join
的命令,要复制备用):
c. 配置 kubectl 权限,执行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
d. 一些查看集群状态的命令
查看集群节点状态
kubectl get nodes
显示如下:(NotReady:表示网络插件还没装)
NAME STATUS ROLES AGE VERSION
192.168.189.135 NotReady control-plane 86m v1.28.2
查看组件状态
kubectl get cs
查看所有 Pod 状态
kubectl get pods -A
配置网络插件 calico
calica 的 calica.yaml 配置文件下载地址(选择与自己 k8s 对于的版本):https://github.com/projectcalico/calico/blob/v3.26.4/manifests/calico.yaml
由于执行 calica.yaml 文件时,calica.yaml 文件中有拉取镜像的命令,镜像地址使用的是 docker.io 这个地址在国内是拉取不了镜像的。所以我们需要修改 calica.yaml 文件
将 calica.yaml 文件中的 docker.io/calico 修改为 swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico,如下图:
使用 docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/node:v3.26.4 拉一下这个镜像,看是否可以下载拉取。可以拉取的话 swr.cn-north-4.myhuaweicloud.com 这个镜像地址就可以用。
修改文件后,执行命令:
kubectl apply -f calico.yaml
查看 calico 节点是否启动
kubectl get pods -n kube-system
显示如下,表示 calico 安装成功,NotReady 状态还会变成 Ready
calico-kube-controllers-xxxxxx Running
calico-node-xxxxxx Running
如果不是上面的显示,可以执行下面的命令,查看 alico-node-xxxxxx 是哪个镜像拉取失败:
kubectl describe pod calico-node-xxxxxx -n kube-system
查看 calico-kube-controllers-xxxxxx 的错误信息:
kubectl describe pod calico-kube-controllers-xxxxxx -n kube-system
Worker 节点加入 k8s 集群
Worker 加入 Master 集群
在 Worker 节点上执行如下命令(这个命令是在初始化Master集群成功后输出的,token 默认过期时间24小时):
kubeadm join 192.168.189.135:6443 \
--token ai1cr3.rqux431ppyc4cgwm \
--discovery-token-ca-cert-hash sha256:4a03bed78a234fb41edb40f1cd762352bcc0905593debfff6b88ba75aea21453 \
--node-name 192.168.189.136
# --node-name 192.168.189.136:设置IP为节点名称,不设置默认使用该节点的主机名
加入成功效果图如下:
查看集群节点(在 Master 节点上查看)
kubectl get nodes
显示如下:
- STATUS 是 Ready 表示一切正常。
- <none> 表示它是 Worker 节点,没有控制角色。
NAME STATUS ROLES AGE VERSION
192.168.189.135 Ready control-plane 3h45m v1.28.2
192.168.189.136 Ready <none> 23m v1.28.2
token 过期,重新生成 token
在 master 节点上执行:
# --ttl=0 表示 token 永不过期,不带此参数 token 默认过期时间24小时
kubeadm token create --print-join-command --ttl=0
Master 移除 Worker 节点
在 master 节点上执行:
# kubectl delete node <node-name>
kubectl delete node 192.168.189.136
在 worker 节点上执行:
kubeadm reset -f
版权声明:本文为7号(又逢乱世)博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1053765496/article/details/147721777