基础环境配置:关闭swap、加载内核模块、安装containerd、安装kubeadm/kubelet/kubectl(K8S上篇)

什么是Kubernetes?

Kubernetes(常称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。

简单理解:如果你用 Docker 把应用打包成容器,那么 Kubernetes 就是负责把这些容器安排在服务器集群上运行,并保证它们一直正常工作。

为什么需要 Kubernetes?

部署复杂:容器该放在哪台机器?资源够不够?——K8s 自动调度,实现负载均衡。

故障恢复:容器挂了谁能自动重启?——K8s 的自我修复能力。

流量分发:如何让外部用户访问容器?——K8s 提供 Service 和 Ingress。

弹性伸缩:晚上访问量大,能否自动增加容器?——K8s 的 Horizontal Pod Autoscaler。

滚动更新:升级应用时如何不停机?——K8s 的滚动更新和回滚。

核心概念:

概念
解释
podK8s 里最小的部署单元,一个 Pod 里可以放一个或多个容器(通常一个)。它们共享网络和存储,像“同一个屋檐下的室友”。
Deployment管理 Pod 的控制器。你告诉它“我要运行 3 个 Nginx 副本”,它会保证始终有 3 个在跑,并支持滚动更新、回滚。
Service给一组 Pod 提供一个固定 IP 和 DNS 名称,做负载均衡。因为 Pod 的 IP 是动态变化的,Service 解决了“怎么找到 Pod”的问题。
Namespace虚拟集群,用来隔离不同环境(如 dev、test、prod)或不同团队的资源。
ConfigMap / Secret用来存储配置信息(非敏感)和敏感信息(密码、Token),把它们和容器镜像解耦。

Node(节点,即一台服务器)、kubelet(节点上的代理)、etcd(存储集群状态的数据库)。

Kubernetes 的优势:

高可用:应用不会因为单点故障而整体不可用。

弹性资源利用率:用多少资源开多少容器,节省成本。

云中立:可以跑在任何公有云、私有云、甚至裸机上,避免被特定云厂商绑定。

生态强大:几乎所有的云原生工具(Prometheus、Istio、Helm、ArgoCD 等)都围绕 K8s 构建。

准备工作:

1. 环境规划:三台服务器信息如下(因为是香港VPS服务器,公网和内网IP一致,是因为服务器没有独立的私有网络(VPC),直接分配的是公网IP。):

角色主机名内网IP(示例)公网IP(示例)
masterk8s-master162.211.180.112162.211.180.112
worker1k8s-node1103.117.122.76103.117.122.76
worker2k8s-node2103.117.122.88103.117.122.88

要求:

操作系统:Ubuntu 24.04.1-x64(推荐,其他版本也可)

CPU:至少2核

内存:至少2GB(实际master需要2GB+,worker可2GB,我操作环境都是4核4G)

内网互通(同一VPC或内网IP可达)

建议使用内网IP。

注意:没有特殊说明的就是要在三台服务器都执行

2. 更新系统并安装基础软件(需要在三台服务器都执行)

apt update && apt upgrade -y
apt install -y apt-transport-https ca-certificates curl gnupg lsb-release software-properties-common

3. 配置 /etc/hosts(如果网络环境不支持内部DNS)云网络环境没有设置内部DNS,需要在每台机器上明确指明各个节点的对应关系,将内网IP与主机名绑定。比如三台内网IP是 162.211.180.112,103.117.122.76,103.117.122.88。在每台服务器上都要执行:

# 编辑hosts文件
vi /etc/hosts

# 在文件末尾添加以下三行,确保IP地址和主机名与你的实际设置一致
162.211.180.112 k8s-master
103.117.122.76 k8s-node1
103.117.122.88 k8s-node2

4. 禁用 swap(kubelet 强制要求)

Kubernetes 要求禁用交换分区,以保证内存管理的稳定性。

swapoff -a
# 永久关闭,注释掉 /etc/fstab 中与 swap 相关的行
sed -i '/ swap / s/^/#/' /etc/fstab

加载所需内核模块

Kubernetes 的网络和存储功能依赖几个特定的内核模块,确保它们被加载

# 加载 overlay 和 br_netfilter 模块
modprobe overlay
modprobe br_netfilter

# 创建配置文件以确保每次开机都自动加载
cat <<EOF | tee /etc/modules-load.d/k8s.confoverlay
br_netfilter
EOF

配置内核参数(允许IP转发、桥接流量)

# 创建一个新的 sysctl 配置文件
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

# 立即应用配置文件中的参数
sysctl --system

安装容器运行时 (Containerd)

Kubernetes 需要容器运行时来运行 Pod。

添加 Docker 的官方 GPG 密钥和仓库

containerd.io 包在 Docker 的仓库里,所以要添加它

# 更新软件包列表并安装必要的依赖
apt update && apt install -y curl ca-certificates

# 创建存放密钥的目录
install -m 0755 -d /etc/apt/keyrings

# 下载并添加 Docker 的 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc

# 添加 Docker 官方仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null

# 再次更新软件包列表,使新仓库生效
apt update

image.png

安装 containerd 并配置

containerd 需要一些特殊配置才能更好地与 Kubernetes 协同工作,其中最重要的是启用 SystemdCgroup# 安装 containerd.io

apt install -y containerd.io

# 生成 containerd 的默认配置文件
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml

# 修改配置:启用 SystemdCgroup(用 sed 命令直接替换)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 重启 containerd 使配置生效
systemctl restart containerd
systemctl enable containerd

国内服务器特别配置:镜像加速器

如果使用的是国内服务器,直接拉取 k8s.gcr.io 等仓库的镜像会非常慢甚至失败。可以在 containerd 的配置中添加国内的镜像加速器来解决这个问题

# 在 /etc/containerd/config.toml 中找到 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 这一部分,添加镜像站配置
# 你可以使用阿里云、腾讯云等提供的镜像加速地址。以下是一个示例:
# 请注意:你需要将 https://mirror.ccs.tencentyun.com 替换成你自己的加速器地址
# 如果你是阿里云用户,可以在容器镜像服务控制台获取专属加速地址

# 编辑 containerd 配置文件
vi /etc/containerd/config.toml

# 找到 [plugins."io.containerd.grpc.v1.cri".registry.mirrors] 部分,在下面添加以下内容:
#   [plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
#     endpoint = ["https://mirror.ccs.tencentyun.com"]
#   [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
#     endpoint = ["https://mirror.ccs.tencentyun.com"]
#   [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
#     endpoint = ["https://mirror.ccs.tencentyun.com"]

# 修改保存后,需要重启 containerd
systemctl restart containerd

装 kubeadm, kubelet 和 kubectl

现在安装 Kubernetes 的核心管理工具和节点代理

添加 Kubernetes 官方 GPG 密钥和仓库

# 下载并添加 Kubernetes 的 GPG 密钥
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 添加 Kubernetes 1.34 版本的软件源
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list

# 更新软件包列表
apt update

安装指定版本的 kubelet, kubeadm, kubectl

指定版本号 1.34.2-1.1 进行安装,这是目前最新的稳定版。使用 apt-mark hold 可以防止它们被意外更新

image.png
--

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

# 锁定版本,防止自动更新
apt-mark hold kubelet kubeadm kubectl

启动并检查 kubelet(可选)

现在 kubelet 可能无法运行,因为它还没有加入集群,不过可以先启用它,让它开机自启。

systemctl enable kubelet

至此,每台服务器的“地基”都已打好,它们都拥有了成为 K8s 节点的能力

已经完成了

基础系统配置:设置主机名、配置 hosts 解析、禁用 SWAP。

加载内核模块与参数:确保 overlay 和 br_netfilter 模块加载,并配置了网络转发相关的内核参数。

安装容器运行时(containerd):安装并配置了 containerd,包括启用 SystemdCgroup。

安装 Kubernetes 核心组件:通过官方源安装了最新版(v1.34.2)的 kubeadm、kubelet 和 kubectl。

所有服务器的基础环境都已准备就绪。在下一篇文章(中篇)里,将正式开始搭建集群,执行 kubeadm init 初始化控制平面,并将工作节点加入集群。

以使用以下命令检查各服务的状态

systemctl status containerd
systemctl status kubelet

b077fa5fb3267a1f81296c502e09cee4.png

如果它们显示为 active (running) 或类似状态,那么恭喜你,已经成功迈出了第一步。

kubelet 是 Kubernetes 的节点代理,它需要被 kubeadm 告知加入哪个集群才会真正启动并工作。在还没有执行 kubeadm init 或 kubeadm join 之前,它处于待命状态是预期行为。当初始化成功后,kubelet 会自动被启动并注册到集群中。之后再用 systemctl status kubelet 就能看到它变成 active (running) 了


本文最后更新时间 2026-06-01
文章链接地址:
https://yrajsh.cn/index.php/archives/84/
本站文章除注明[转载|引用|原文]出处外,均为本站原生内容,转载前请注明出处

文章附件
  • 暂无附件
希望可以帮助到你

留言