Kubeadm 部署 Kubernetes v1.30.2 实战:Ubuntu24.04 三节点集群 + 排坑记录

00‑Kubernetes 介绍

应用部署发展过程

传统部署时代

企业在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。

物理机内部同时跑多个应用进程、Redis、DB 等,全部争抢宿主机 CPU、文件系统、内存硬件资源。

虚拟化部署时代

作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机 (VM)。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

层级:宿主机硬件资源 → 宿主机操作系统 → 虚拟机管理系统 → 多台独立虚拟机,每台虚拟机拥有独立操作系统、CPU、内存、文件系统,内部运行业务进程与依赖库。

容器部署时代

容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统 (OS)。因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植。

容器因具有许多优势而变得流行起来,下面列出了容器的一些好处:

  • 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
  • 持续开发、集成和部署:通过快速简单的回滚 (由于镜像不可变性),提供可靠且频繁的容器镜像构建和部署。
  • 关注开发与运维的分离:在构建 / 发布时而不是在部署时创建应用程序容器镜像,从而将应用程序与基础架构分离。
  • 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
  • 云和操作系统分发的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、Google Kubernetes Engine 和其他任何地方运行。
  • 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理‑而不是在一台大型单机上整体运行。
  • 资源隔离:可预测的应用程序性能。
  • 资源利用:高效率和高密度。

Kubernetes 前世今生

Kubernetes 的名字来自希腊语,意思是 "舵手" 或 "领航员"。K8s 是将 8 个字母 "ubernete" 替换为 "8" 的缩写。

据说 Google 的数据中心里运行着 20 多亿个容器,而且 Google 十年前就开始使用容器技术。最初,Google 开发了一个叫 Borg 的系统 (现在命名为 Omega) 来调度如此庞大数量的容器和工作负载。在积累了这么多年的经验后,Google 决定重写这个容器管理系统,并将其贡献到开源社区,让全世界都能受益。这个项目就是 Kubernetes (K8s)。简单地讲,Kubernetes 是 Google Omega 的开源版本。

  • 2014 年 6 月,谷歌云计算专家埃里克・布鲁尔 (Eric Brewer) 在旧金山的发布会为这款新的开源工具揭牌。
  • 2015 年 7 月 22 日 K8S 迭代到 v 1.0 并正式对外公布。
  • 2017 年 9 月,Mesosphere 宣布 支持 Kubernetes;10 月,Docker 宣布将在新版本中加入对 Kubernetes 的原生支持。至此,容器编排引擎领域的三足鼎立时代结束,Kubernetes 赢得全面胜利。

目前,AWS、Azure、Google、阿里云、腾讯云等主流公有云提供的是基于 Kubernetes 的容器服务;Rancher、CoreOS、IBM、Mirantis、Oracle、Red Hat、VMWare 等无数厂商也在大力研发和推广基于 Kubernetes 的容器 CaaS 或 PaaS 产品。可以说,Kubernetes 是当前容器行业最炙手可热的明星。

Kubernetes 是什么

官方介绍:Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。

Kubernetes 特性

  1. 自动化上线和回滚:Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。 如果出现问题,Kubernetes 会为你回滚所作更改。
  2. 服务发现与负载均衡:你无需修改应用来使用陌生的服务发现机制。Kubernetes 为每个 Pod 提供了自己的 IP 地址并为一组 Pod 提供一个 DNS 名称,并且可以在它们之间实现负载均衡。
  3. 存储编排:自动挂载所选存储系统,包括本地存储、公有云提供商所提供的存储或者诸如 iSCSI 或 NFS 这类网络存储系统。
  4. Secret 和配置管理:部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像, 且不必将软件堆栈配置中的秘密信息暴露出来。
  5. 自动装箱:根据资源需求和其他限制自动放置容器,同时避免影响可用性。 将关键性的和尽力而为性质的工作负载进行混合放置,以提高资源利用率并节省更多资源。
  6. 批量执行:除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。
  7. 自我修复:Kubernetes 会自动重启崩溃的容器,在必要时替换整个 Pod, 在发生更大范围的故障时重新挂载存储,并且能够与节点自动扩缩容器集成,实现节点级别的自我修复能力。
  8. 水平扩缩:使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。
  9. IPv4/IPv6 双协议栈:为 Pod 和 Service 分配 IPv4 和 IPv6 地址。
  10. 为扩展性设计:无需更改上游源码即可扩展你的 Kubernetes 集群。

Kubernetes 不是什么

Kubernetes 并不是传统的 PaaS (平台即服务) 系统。

  • Kubernetes 不限制支持应用的类型,不限制应用框架。不限制受支持的语言 runtimes (例如,Java, Python, Ruby),满足 12‑factor applications。不区分 "apps" 或者 "services"。 Kubernetes 支持不同负载应用,包括有状态、无状态、数据处理类型的应用。只要这个应用可以在容器里运行,那么就能很好的运行在 Kubernetes 上。
  • Kubernetes 不提供中间件 (如 message buses)、数据处理框架 (如 Spark)、数据库 (如 Mysql) 或者集群存储系统 (如 Ceph) 作为内置服务。但这些应用都可以运行在 Kubernetes 上面。
  • Kubernetes 不部署源码不编译应用。持续集成的 (CI) 工作流方面,不同的用户有不同的需求和偏好的区域,因此,我们提供分层的 CI 工作流,但并不定义它应该如何工作。
  • Kubernetes 允许用户选择自己的日志、监控和报警系统。
  • Kubernetes 不提供或授权一个全面的应用程序配置 语言 / 系统 (例如,jsonnet)。
  • Kubernetes 不提供任何机器配置、维护、管理或者自修复系统。

PaaS 是 (Platform as a Service) 的缩写,是指平台即服务。云计算时代的服务器平台或者开发环境作为服务进行提供就成为了 PaaS。典型的 PaaS 是一个开发平台框架,开发人员可以基于该框架进行构建,从而开发或自定义基于云的应用程序。

Kubernetes 架构

一个 Kubernetes 集群由一组被称作 node 的计算机组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群至少具有一个 master 节点和一个 worker 节点。

控制平面组件(Control Plane Components)

控制平面组件对集群做出全局决策 (比如调度),以及检测和响应集群事件 (例如,当不满足部署的 replicas 字段时,启动新的 pod )。 控制平面组件可以在集群中的任何节点上运行。为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。

表格

组件 说明
kube‑apiserver 部署在 master 节点,提供 Kubernetes API 服务,是 Kubernetes 控制面的前端。各种客户端工具 (CLI 或 UI) 以及 Kubernetes 其他组件可以通过它管理 Cluster 的各种资源。
kube‑scheduler 部署在 master 节点,按照预定的调度策略将 Pod 调度到相应的机器上。
kube‑controller‑manager 部署在 master 节点,负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。
etcd 兼具一致性和高可用性的键值数据库,保存 Kubernetes 所有集群数据的后台数据库。

Worker 组件

Worker 组件在每个节点上运行 (包括 master 节点),维护运行的 Pod 并提供 Kubernetes 运行环境。

表格

组件 说明
kubelet 集群中每个节点上都需要运行的代理,负责维护容器的生命周期,同时也负责 Volume (CVI) 和网络 (CNI) 的管理。kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。
kube‑proxy 集群中每个节点上运行的网络代理,负责为 Service 提供 cluster 内部的服务发现和负载均衡。kube‑proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。
容器运行环境 (Container Runtime) 负责镜像管理以及 Pod 和容器的真正运行 (CRI)。Kubernetes 支持多个容器运行环境: containerd、cri‑o 等任何实现 Kubernetes CRI (容器运行环境接口)。

插件 (Addons)

插件使用 Kubernetes 资源 (DaemonSet , Deployment 等) 实现集群功能,插件资源属于 kube‑system 命名空间。

  • kubedns:一个 DNS 服务器,为 Kubernetes 服务提供 DNS 记录。
  • Dashboard:为 Kubernetes 集群提供 Web UI,用于管理集群应用与排错。
  • 容器资源监控:采集容器时序指标存入数据库,提供浏览界面。
  • 集群层面日志:收集容器日志集中存储,提供检索。
  • 网络插件:实现 CNI 规范,给 Pod 分配 IP,实现 Pod 跨节点通信。

为什么 master 上也有 kubelet 和 kube‑proxy 呢? Master 同时也是一个 worker。Master 上也可以运行应用,几乎所有的 Kubernetes 组件本身都运行在 Pod 里。例如 etcd,kube‑apiserver,kube‑controller‑manager 等。kubelet 是唯一没有以容器形式运行的 Kubernetes 组件。


01‑Kubernetes 安装

生产环境说明

安装方式对比

表格

安装方式 核心特点 难度 适用场景 优点 缺点 推荐指数
kubeadm 官方标准、无魔改 中等 生产自建、CKA/CKAD 考试、标准集群 兼容性强、易升级、生态完善、文档全 步骤较多,需手动配置运行时 / 网络 ⭐⭐⭐⭐⭐
二进制手工部署 全手动、底层可控 极高 原理研究、深度定制、教学演示 掌控所有组件、无任何封装 极易出错、升级繁琐、维护成本高 ⭐⭐
Sealos / KubeKey 一键部署、高可用 低 快速搭建生产 / 测试环境 命令简单、自动装依赖、自带插件 轻度封装,不如 kubeadm 透明 ⭐⭐⭐⭐
k3s / k0s 轻量、单二进制 低 边缘节点、低配机器、开发测试 占用小、启动快、自带 containerd/ingress 裁剪版,部分高级特性有差异 ⭐⭐⭐⭐
minikube / kind / k3d 单机实验环境 极低 本地开发、快速验证学习调试 一键启动、环境干净 不能模拟真实多节点生产集群 ⭐⭐⭐
云厂商托管 (ACK/EKS 等) Master 托管、免运维 低 云上生产业务 高可用、自动升级、无需维护控制面 成本高、受厂商限制 ⭐⭐⭐⭐
RKE / OpenShift 企业发行版 中高 大型企业、有商业化支持需求 生态成熟、技术支持完善 重、学习成本高、商用成本高 ⭐⭐⭐

选择建议

  • 学习 + 未来上生产:优先 kubeadm
  • 快速搭建、不想折腾:Sealos
  • 本地测试 / 开发:k3s 或 minikube
  • 边缘 / 低配机器:k3s

环境说明

软件清单

  • vmware workstation 17
  • ubuntu‑24.04‑live‑server‑amd64
  • kubeadm 1.30.2
  • kubernetes 1.30.2
  • containerd.io=1.7.20‑1
  • nerdctl‑1.7.7‑linux‑amd64
  • cni‑plugins‑linux‑amd64‑v1.6.0

虚拟机硬件配置

  • 2 cpu
  • 4G memory
  • 1 个 NAT 网卡
  • 1 个 200G 硬盘

节点规划

表格

节点 IP 角色
master30.laoma.cloud 10.1.8.30 master
worker31.laoma.cloud 10.1.8.31 worker
worker32.laoma.cloud 10.1.8.32 worker

系统准备

安装系统

Ubuntu 2404 系统最小化安装,不要 swap 分区。分区:

  • /boot 2G
  • / 90G

配置操作系统华为源

复制代码
cat > /etc/apt/sources.list.d/ubuntu.sources <<'EOF'
Types: deb
URIs: http://mirrors.huaweicloud.com/ubuntu/
Suites: noble noble‑updates noble‑backports
Components: main restricted universe multiverse
Signed‑By: /usr/share/keyrings/ubuntu‑archive‑keyring.gpg
EOF

containerd 仓库

复制代码
# 导入 containerd 仓库 key
curl -fsSL https://mirrors.huaweicloud.com/docker‑ce/linux/ubuntu/gpg | gpg --dearmour -o /etc/apt/trusted.gpg.d/containerd.gpg

# 添加 containerd 仓库
cat << 'EOF' > /etc/apt/sources.list.d/docker‑ce.list
deb [arch=amd64] https://mirrors.huaweicloud.com/docker‑ce/linux/ubuntu noble stable
EOF

kubernetes 阿里源 (v1.30)

复制代码
# 添加 kubernetes 仓库 key
curl -fsSL https://mirrors.aliyun.com/kubernetes‑new/core/stable/v1.30/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes‑apt‑keyring.gpg

# 添加 kubernetes 仓库
echo "deb [signed‑by=/etc/apt/keyrings/kubernetes‑apt‑keyring.gpg] https://mirrors.aliyun.com/kubernetes‑new/core/stable/v1.30/deb/ /" > /etc/apt/sources.list.d/kubernetes.list

安装基础软件包

复制代码
apt update && apt install -y vim lrzsz bash‑completion open‑vm‑tools apt‑transport‑https sshpass

设置静态 IP (master 示例)

复制代码
mkdir /etc/netplan/origin
mv /etc/netplan/*yaml /etc/netplan/origin
cat > /etc/netplan/00‑static.yaml <<EOF
network:
ethernets:
ens33:
dhcp4: no
addresses:
‑ 10.1.8.30/24
routes:
to: default
via: 10.1.8.2
nameservers:
addresses:
10.1.8.2
223.5.5.5
version: 2
EOF
chmod 600 /etc/netplan/00‑static.yaml
netplan apply

设置 /etc/hosts

复制代码
cat << 'EOF' >> /etc/hosts
###### kubernetes #####
10.1.8.30 master30.laoma.cloud master30
10.1.8.31 worker31.laoma.cloud worker31
10.1.8.32 worker32.laoma.cloud worker32
10.1.8.21 hub.laoma.cloud
EOF

关闭 swap

复制代码
swapoff -a && sed -i '/^.*swap/d' /etc/fstab
rm -f /swap.img

配置 chrony 时间同步

复制代码
apt install -y chrony
systemctl enable chrony --now

ssh 优化

复制代码
echo 'UseDNS no' >> /etc/ssh/sshd_config
echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
ssh‑keygen -N '' -f ~/.ssh/id_rsa -t rsa

配置 IPVS

复制代码
# 安装依赖
apt install -y iptables ipvsadm ipset conntrack

# 临时加载模块
modprobe overlay
modprobe br_netfilter
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_lc
modprobe ip_vs_sh
modprobe nf_conntrack

# 永久加载模块
cat > /etc/modules‑load.d/k8s‑net.conf << EOF
# K8s 基础网络
br_netfilter
overlay
# IPVS 必需
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_lc
ip_vs_sh
nf_conntrack
EOF

内核参数

复制代码
cat > /etc/sysctl.d/k8s.conf << 'EOF'
net.bridge.bridge‑nf‑call‑iptables=1
net.bridge.bridge‑nf‑call‑ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF
sysctl -p /etc/sysctl.d/k8s.conf

配置 containerd

复制代码
apt install -y containerd.io=1.7.20‑1 cri‑tools
crictl config runtime‑endpoint unix:///var/run/containerd/containerd.sock
containerd config default > /etc/containerd/config.toml

# 修改 cgroup 与pause镜像
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sed -i 's|sandbox_image = ".*"|sandbox_image = "registry.k8s.io/pause:3.9"|' /etc/containerd/config.toml

再修改 config.toml 配置镜像 mirrors、tls 跳过校验,之后重启服务

复制代码
systemctl restart containerd.service

安装 nerdctl & cni‑plugins

复制代码
tar -xf nerdctl‑1.7.7‑linux‑amd64.tar.gz -C /usr/bin/
mkdir -p /opt/cni/bin
tar -xf cni‑plugins‑linux‑amd64‑v1.6.0.tgz -C /opt/cni/bin

配置 nerdctl 镜像加速:/etc/containerd/certs.d/ 下配置各个仓库 hosts.toml

安装 kubeadm kubelet kubectl

复制代码
apt install -y kubeadm=1.30.2‑1.1 kubelet=1.30.2‑1.1 kubectl=1.30.2‑1.1
systemctl enable kubelet --now

命令补全

复制代码
mkdir /etc/bash_completion.d
crictl completion bash > /etc/bash_completion.d/crictl
nerdctl completion bash > /etc/bash_completion.d/nerdctl
echo 'export CONTAINERD_NAMESPACE=k8s.io' >> /etc/bash_completion.d/nerdctl
kubectl completion bash > /etc/bash_completion.d/kubectl
kubeadm completion bash > /etc/bash_completion.d/kubeadm

初始化集群

预拉取镜像

复制代码
kubeadm config images pull --kubernetes‑version=v1.30.2 --image‑repository registry.aliyuncs.com/google_containers

kubeadm init 初始化 master

复制代码
kubeadm init \
--kubernetes‑version=v1.30.2 \
--pod‑network‑cidr=10.224.0.0/16 \
--image‑repository registry.aliyuncs.com/google_containers

配置 kubectl 凭据

复制代码
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

部署 calico 网络

复制代码
# 内网下载calico yaml
wget http://192.168.46.200/class/course‑materials/softwares/stage03/calico‑3.30.7.yaml -O calico.yaml

# 修改pod网段为10.224.0.0/16
sed -i "s|# ‑ name: CALICO_IPV4POOL_CIDR|‑ name: CALICO_IPV4POOL_CIDR|g" calico.yaml
sed -i "s|# value: \"192.*| value: \"10.224.0.0/16\"|g" calico.yaml

kubectl apply -f calico.yaml

worker 节点加入集群

复制代码
# master生成join命令
kubeadm token create --print‑join‑command

# worker节点执行输出的join命令示例
kubeadm join 10.1.8.30:6443 --token xxx --discovery‑token‑ca‑cert‑hash sha256:xxx

验证集群

复制代码
kubectl get nodes
kubectl get pods -A
kubectl cluster‑info
kubectl version

节点状态 Ready 条件:网络插件就绪、kubelet 正常运行、swap 关闭。


02‑Node and Cluster

查看节点

复制代码
# 查看节点清单
kubectl get nodes

# 查看节点详细信息
kubectl describe node worker31.laoma.cloud

删除 worker 节点流程

  1. 节点设置维护模式,驱逐 Pod

    kubectl drain worker31.laoma.cloud --ignore‑daemonsets

执行后节点状态变为 Ready,SchedulingDisabled,不再调度新 Pod。

  1. master 删除节点对象

    kubectl delete node worker31.laoma.cloud

  2. 在被删除的 worker 机器执行重置

    kubeadm reset -f

reset 不会清理 CNI 网络配置、iptables/ipvs 规则,需要手动清理:

复制代码
rm -rf /etc/cni/net.d
ipvsadm --clear

完整删除整个集群

  1. 先驱逐所有 worker 节点

    kubectl drain worker31.laoma.cloud --ignore‑daemonsets --force
    kubectl drain worker32.laoma.cloud --ignore‑daemonsets --force
    kubectl delete node worker31.laoma.cloud worker32.laoma.cloud

  2. worker 节点执行重置

    worker31

    kubeadm reset -f
    rm -rf /etc/cni/net.d
    ipvsadm --clear

    worker32

    kubeadm reset -f
    rm -rf /etc/cni/net.d
    ipvsadm --clear

  3. master 节点删除、重置

    kubectl delete node master30.laoma.cloud
    kubeadm reset -f
    rm -fr .kube/

重建集群

复制代码
# 方式1:使用配置文件初始化
kubeadm init --config kubeadm.yml

# 方式2:直接命令行初始化
kubeadm init \
--kubernetes‑version=v1.30.2 \
--pod‑network‑cidr=10.224.0.0/16 \
--image‑repository hub.laoma.cloud/kubernetes

# 配置kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# 部署calico网络
kubectl apply -f calico.yaml

# worker节点加入集群
kubeadm join 10.1.8.30:6443 --token xxx --discovery‑token‑ca‑cert‑hash sha256:xxx
相关推荐
Eminem891 小时前
15、k8s控制器Statefulset
k8s
Eminem891 小时前
17、k8s配置管理中心configmap
k8s
xiaobobo33301 小时前
man手册的格式、共性、命令
ubuntu·man手册结构·man手册共性·man手册命令
Happy_Sharing1 小时前
Windows虚拟机安装ubuntu后,如何在虚拟机Ubuntu系统中访问Windows文件夹
linux·运维·ubuntu
闲云自留地2 小时前
从零造一台 Ubuntu 24.04:虚拟机、装系统、配 IP 到 root 远程登录一篇通
数据库·tcp/ip·ubuntu
xiaobobo33303 小时前
Ubuntu 26.04环境下使用vim软件编辑文档的一些不常用用法
ubuntu·vim常用用法
abcefg_h3 小时前
多卡多机训练任务调度系统:从梯度平均到拓扑感知调度
kubernetes·大模型·分布式训练·nccl·gpu调度
Eminem893 小时前
16、k8s控制器Daemnonset
k8s
szuaudi3 小时前
K8s 节点假死故障排查过程复盘
网络·容器·kubernetes