概要

问:Kubernetes(俗称:k8s) 到底是什么?

答曰:一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化

可称之为:云原生的操作系统。

在这里插入图片描述

下面,我会逐步去探索 Kubernetes 的基础架构、部署方案(国内)。

一、架构介绍

Kubernetes 集群的组成:

  • 一个控制平面(控制节点)
  • 一组用于运行容器化应用的工作机器, 这些工作机器称作节点(Node)。

每个集群至少需要一个工作节点来运行 Pod。

以上这句话,意味着我可以把控制节点配置为工作节点。从而实现 “ 我就是集群,集群就是我 ”。换句话就是:我是牛马,身兼双职

在这里插入图片描述

为了加深记忆,轻松的了解有关Kubernetes的专业术语。下面,我要开店,还是一个连锁店(哇咔咔,属于咸鱼大翻身了)。

二、全自动化的连锁奶茶帝国

1、背景

在数字大陆上,有一个名叫 “小鳄” 的有名的创业者(就是我)。起初,我只有一家街角的奶茶店,雇佣了一个员工既是收银员,又是调茶师。那时候,只要客人一多,小店就乱作一团,给我整的焦头烂额。

后来随着规模的扩大,我建立了一个奶茶帝国,旗下店铺数不胜数,管理起来就更加力不从心了。

为了拯救我的事业,我决定引入传说中的“智能帝国管理系统”—— Kubernetes(K8s)

2、故事介绍

随着系统的启动,我眼前的景象变了。在这个帝国里,每一家店铺都是一个的自动化节点,它们整齐排列,等待着指令。为了井井有条,我利用 命名空间 将帝国划分成了研发实验室繁忙营业区,互不干扰,把 搞新口味研发的店铺卖货的店铺 彻底隔开。

在这里插入图片描述

我拿起了 kubectl —— 帝国的遥控器。他对它发出指令:“我要在营业区部署3个标准的奶茶制作工位。”

这个指令瞬间传达给 Deployment(排班经理)它立刻行动,他手里拿着 ReplicaSet(排班表),在集群中巡视,迅速找到空闲的店铺(节点 node),生成了3个工位(Pod)。

这些工位(Pod)可不简单,它们是一个精密的“智能工位”:里面有一个主容器像熟练工一样疯狂摇奶茶,旁边还有几个辅助容器(Sidecar)记录日志。它们共享着同一个网络IP和存储空间,就像共用一张桌子的亲密搭档。

在这里插入图片描述
为了让顾客能找到这些工位,Service(取餐窗口)自动建立了起来。

无论后端的Pod因为故障重启还是扩容漂移,Service这个“窗口”永远固定在那里,微笑着接过顾客的订单,然后分发给后面最空闲的那个工位。当外部流量如洪水般涌来时,Ingress(大门前台)像个专业的迎宾,根据域名规则,把想喝奶茶的、想买周边的、想查账单的顾客精准地引导到不同的Service面前。

在这里插入图片描述
有一天,系统突然报警,一个 Pod 因为内存溢出挂了。在之前,我得半夜爬起来重启这个Pod。但现在,Deployment 察觉到了异常:“排班表上少了一个人!”他二话不说,立刻在节点上重新拉起一个新的Pod。整个过程行云流水,顾客们甚至都没感觉到有任何延迟。

在这里插入图片描述

而在这些工位的背后,ConfigMap(配方表)挂在墙上,随时告诉机器现在的甜度是“七分糖”;
它通常包含两类内容:

  • 简单的参数:比如 LOG_LEVEL=INFO(日志级别),DB_HOST=192.168.1.5(数据库地址)。
  • 复杂的文件:比如整个 nginx.conf 配置文件,或者 application.yml。
    Secret(保险柜)则深埋地下,守护着仓库的密码,只有经过授权的Pod才能凭钥匙开启。

我坐在监控大屏前,看着这个自动运转、自我修复、弹性伸缩的智能帝国,喝了一口手中的奶茶。他明白,他不再是那个修水管的运维工,他是这个庞大数字生态的云原生架构师。这就是Kubernetes的力量——它让混乱归于秩序,让复杂变得简单。

三、部署 — V1.33.10

在 Kubernetes v1.24 版本之后,官方已经移除了对 Docker 的支持(Kubelet -> Dockershim -> Docker Daemon -> containerd)。

默认使用更轻量的 Containerd。直接使用 Kubelet -> containerd

注:

  • Containerd运行时引擎,专注运行(run)、镜像管理。对 K8s 原生支持 ,通过 CRI(容器运行时接口)。
  • Dockershim: 作为适配层(dockershim 的模块)。
    • 它是 Kubernetes 的 CRI(容器运行时接口)与 Docker 引擎之间的“垫片”。
    • Kubelet 发出指令 -> Dockershim 接收 -> 翻译成 Docker 能听懂的语言 -> Docker 执行。

前提准备

服务器:两台,OS版本 Ubuntu 24.04.3

1、系统初始化(两台机器都执行)


# 1、在控制节点上执行,修改主机名称
hostnamectl set-hostname k8s-master

# 2、在工作节点上执行,修改主机名称
hostnamectl set-hostname k8s-worker-1

# 3、查看是否更改成功
hostnamectl

1)配置 Hosts 文件


# 1、修改/etc/hosts文件
cat >> /etc/hosts <<EOF
<控制节点主机ip>  k8s-master
<工作节点主机ip>  k8s-worker-1
EOF

# 查看修改请款
cat /etc/hosts

2)关闭 Swap

Kubernetes 要求必须关闭 Swap 分区,为了确保集群的性能可预测性、资源调度的准确性 以及 系统的稳定性

  1. 保证性能可预测性

    • Swap 的机制是将不常用的内存数据写入磁盘,当 Pod 内存不足时,系统会频繁进行内存与磁盘的数据交换
    • Kubernetes 初衷是 应用要么运行得快,要么明确失败(OOM),而不是在慢速的 Swap 中苟延残喘。
  2. 确保资源调度的准确性

    • Kubernetes 的核心设计理念是 资源隔离服务质量(QoS)保障。
    • 如果允许使用 Swap,容器有可能会突破 物理内存 的限制,去使用 Swap 空间,进而导致节点(node) 整体资源被过度消耗(Overcommit),最终引发连锁反应,拖垮整个节点。

# 1、立即停止系统上所有的 Swap 设备和文件
 swapoff -a
 
# 2、修改 /etc/fstab 文件,注释配置文件里的 Swap 项
 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 3、验证
swapon --show
# 或者
free -h

如果 swapon --show 输出为空,或者 free -h 中 Swap 总量为 0。则表示操作成功。

3)加载内核模块与配置网络转发

  • overlay: Kubernetes 默认使用的联合文件系统驱动
    • 容器镜像由多层只读层和一个可写层组成。overlay 模块负责将这些层“叠加”在一起,让容器看起来像是一个完整的文件系统。
  • br_netfilter:它让 Linux 内核的网桥(Bridge)能够调用防火墙规则。
    • 默认情况下,Linux 内核认为网桥内部的流量是“内部流量”,不走防火墙( iptables )。
    • 但是Kubernetes 的网络插件(CNI)依赖 iptables 来实现服务发现 和 负载均衡
# =================== 加载内核模块 ============================
# 1、生成模块加载脚本
cat <<EOF |  tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

# 2、 立即加载模块,无需重启
 modprobe overlay
 modprobe br_netfilter
 
# ==================== 配置网络转发 =========================
# 1、配置 sysctl (允许 iptables 检查桥接流量)
cat <<EOF |  tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# 4、应用配置
 sysctl --system
  • net.bridge.bridge-nf-call-iptables = 1:告诉内核,“经过网桥的流量,也要交给 iptables 处理”。
  • net.ipv4.ip_forward = 1:开启 Linux 内核的IP 转发功能,便于向外网或其他节点发送包。

4)时间同步

确保两个节点时间一致。


# 1、安装 ntpsec-ntpdate 软件包
 apt install -y ntpsec-ntpdate
 
 # 2、向阿里云的 NTP 服务器发起时间同步请求。
 ntpdate ntp.aliyun.com

=============== 日常运维平滑过渡时间使用 ===================
# 使用 timedatectl (systemd 系统)
timedatectl set-ntp true
# 等待几秒后查看状态
timedatectl status

2、安装容器运行时 Containerd(两台机器都执行)

1)安装依赖并添加 Docker 官方仓库(Containerd 在此仓库中)

# 1、更新软件包索引
apt update

# 2、安装必要的系统工具
apt install -y ca-certificates curl gnupg lsb-release

# 3、创建密钥存储目录
mkdir -p /etc/apt/keyrings
 
# 4、下载阿里云的 Docker GPG 公钥并进行格式转换,以确保后续安装的 Docker 软件包来自官方且未被篡改。
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 5、生成 Docker 的 APT 软件源配置文件,添加阿里云 Docker 源,用于下载和更新 Docker 软件包
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

2)安装和配置 Containerd

# 1、安装containerd
apt install -y containerd

# 1. 创建默认配置存放的文件夹
 mkdir -p /etc/containerd
 
# 2、生成默认配置
containerd config default | sudo tee /etc/containerd/config.toml

# 3. 开启 SystemdCgroup (K8s 强制要求),用于限制容器的内存使用
 sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# 4. 配置阿里云镜像加速器 (替换默认的 registry.k8s.io)
 sed -i "s#registry.k8s.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml

# 5. 重启服务
 systemctl restart containerd
 systemctl enable containerd
 ========================== 检查操作 =================================
# 检查 cgroup 是否为 true
grep SystemdCgroup /etc/containerd/config.toml

# 检查 pause 镜像地址
grep sandbox_image /etc/containerd/config.toml

3、安装 Kubernetes 组件(两台机器都执行)

1)添加 Kubernetes 软件源(使用阿里云镜像)

# 1. 安装必要依赖
 apt update
 
# 2、安装核心依赖工具
 apt install -y apt-transport-https ca-certificates curl gpg

# 3、下载并转换 GPG 密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 4、添加软件源列表
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.33/deb/ /' |  tee /etc/apt/sources.list.d/kubernetes.list

2)安装 kubeadm, kubelet, kubectl

# 1、让系统去抓取刚添加的 Kubernetes 仓库里的软件包列表
apt update
# 2、查看可用版本,确认有 1.33.0
apt list kubelet kubeadm kubectl

# 3、安装指定版本
apt install -y kubelet=1.33.10-1.1 kubeadm=1.33.10-1.1 kubectl=1.33.10-1.1

# 4、锁定版本,防止意外升级
 apt-mark hold kubelet kubeadm kubectl

# ===================  检查版本  ====================

# 1. 查看 kubeadm 版本
kubeadm version

# 2. 查看 kubectl 版本 (仅客户端,避免连接服务器报错)
kubectl version --client

# 3. 查看 kubelet 版本
kubelet --version

4、初始化 Master 节点(仅在 Master 上执行)

1)执行初始化命令

请将 <Master的内网IP> 替换为你的 Master 节点内网 IP。
--image-repository 参数指定了从阿里云拉取 Kubernetes 核心组件镜像。

# 1、将当前的 Linux 节点初始化为集群的控制平面节点(即 Master 节点)
 kubeadm init \
  --apiserver-advertise-address=192.168.150.110 \
  --image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
  --pod-network-cidr=192.168.0.0/16 \
  --kubernetes-version=v1.33.0
  
# 以上命令默认会生成一个用于其他节点加入的命令。
#kubeadm join 192.168.150.110:6443 --token 0ly5mr.e0qds6g7ok811l28 \
#        --discovery-token-ca-cert-hash #sha256:c8f49c39c0457f4a24966c0d9524a1c1fcf6ab9ac121f9d076919f0185c20c8a

#===================== 如果忘记,可以执行以下命令:==========================
# 在 Master 节点 上重新生成一个加入命令。
kubeadm token create --print-join-command

2)配置 kubectl

初始化成功后,根据提示执行以下命令来配置 kubectl

  • 让普通用户也能管理集群。
# 1、创建配置目录
mkdir -p $HOME/.kube

# 2、 复制管理员配置文件
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

# 3、修改文件所有者
chown $(id -u):$(id -g) $HOME/.kube/config

# ====================== 验证是否成功 =========================

kubectl cluster-info

3)安装网络插件 (CNI)(两个机器上都执行)

离线处理,请执行以下脚本:

  • 从华为云镜像源拉取 Calico 所需的镜像,并为它们打上 Docker Hub 的“标签”,这样 Kubernetes 就能识别并使用它们了

# 定义镜像版本和列表
CALICO_VERSION="v3.26.1"
images=(
  cni
  pod2daemon-flexvol
  node
  kube-controllers
  typha
  node-driver-registrar
  csi
)

echo "🚀 开始拉取 Calico 镜像 (版本: $CALICO_VERSION)..."

# 循环处理每个镜像
for image in "${images[@]}"; do
  # 1. 定义源镜像(华为云加速地址)
  SOURCE_IMAGE="swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/calico/${image}:${CALICO_VERSION}"
  
  # 2. 定义目标镜像(K8s 默认寻找的地址)
  TARGET_IMAGE="docker.io/calico/${image}:${CALICO_VERSION}"

  echo "⬇️ 正在拉取: ${image}..."
  # 拉取镜像
  sudo ctr -n k8s.io image pull ${SOURCE_IMAGE}
  
  if [ $? -eq 0 ]; then
    echo "🏷️ 正在标记: ${image} -> ${TARGET_IMAGE}"
    # 标记镜像,让 K8s 以为它已经从官方源下载好了
    sudo ctr -n k8s.io image tag ${SOURCE_IMAGE} ${TARGET_IMAGE}
    echo "✅ ${image} 处理完成。"
  else
    echo "❌ ${image} 拉取失败,请检查网络连接。"
  fi
  echo "--------------------------"
done

echo "🎉 所有镜像处理完毕!请检查下方是否有报错。"

4) 仅master节点执行

# 只需要在 Master 节点执行一次,Calico 会自动“蔓延”到所有 Worker 节点。
#  Worker 节点加入集群(执行 kubeadm join)后,Master 会自动将 calico-node Pod 部署到该 Worker 节点上。
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.1/manifests/calico.yaml

总结

1、 基础设施与基础单元

名词 英文 通俗比喻 核心作用
集群 Cluster 整个奶茶连锁品牌 由多台机器组成的整体计算环境。
节点 Node 具体的门店 真正干活的地方(物理机或虚拟机),应用就运行在这里。
Pod Pod 后厨的一个工位 K8s 中最小的部署单元。一个 Pod 里通常运行一个主容器(如做奶茶的机器)和几个辅助容器(如清理垃圾的助手),它们共享网络和存储。
命名空间 Namespace 不同的部门/分店 用来隔离资源。比如“开发环境”和“生产环境”互不干扰。

2、管理与控制(店长与规则)

名词 英文 通俗比喻 核心作用
工作负载 Deployment 排班经理 你告诉他“我要3个做奶茶的工位”,他会自动维持这个数量。如果有一个挂了,他会立马补一个新的。
副本 ReplicaSet 排班表 确保随时有指定数量的 Pod 在运行。
服务 Service 固定的取餐窗口 Pod 是临时的(工位数可能变),IP 会变。Service 提供一个固定的 IP 和端口,让外部能稳定访问到后端的 Pod。
入口 Ingress 门店大门/前台 处理外部流量(如 HTTP/HTTPS)。根据域名(如 milktea.com)把请求转发给不同的 Service。

3、交互与配置

名词 英文 通俗比喻 核心作用
命令行工具 kubectl 遥控器/对讲机 你用来向 K8s 下达指令的工具(如“启动应用”、“查看状态”)
配置项 ConfigMap 配方表 存储非敏感配置(如环境变量),把配置和程序代码分开。
密钥 Secret 保险柜 存储敏感信息(如密码、证书),保障安全。

各位再见!这里是 鳄鱼杆的空间,钓……鳄鱼的杆儿!

期待下次再会!

愿你的每一次垂钓之旅都能满载而归。

在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐