Kubernetes 安装 kubeadm

版权声明:本文为7号(又逢乱世)博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a1053765496/article/details/147721777
————————————————

目录

Kubernetes 集群最低配置要求

生产环境常见集群规模

1. 小型集群(适合小企业或试运行环境,主要用于试运行的测试环境)

2. 中型集群(适合中等规模服务或多模块微服务)

3. 大型集群(大企业/云平台)

Worker 建议资源划分

QPS 与并发的区别

QPS 与并发估算

安装 Kubernetes 集群

服务器配置要求

配置 Ubuntu 服务器

安装 containerd

安装 Kubernetes

配置 k8s 集群 Master

配置网络插件 calico

Worker 节点加入 k8s 集群

Worker 加入 Master 集群

Master 移除 Worker 节点


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

名称全称含义关注点类比
QPSQueries 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核/8G1375375~750134/1334/13334~267/2667/26667
中型8核/16G16150750~150067/667/6667~134/1334/13334
大型16核32G1123001500~300034/334/3334~67/667/6667
大型32核/64G1246003000~600017/167/1667~34/334/3334


安装 Kubernetes 集群

服务器配置要求

三台 Ubuntu 服务器,用于本文测试配置 Kubernetes 集群

IP地址节点角色CPU核数内存
192.168.189.135Master24
192.168.189.136Worker24
192.168.189.137Worker24

安装软件: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)

请查看 Ubuntu 安装 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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

7 号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值