1. Kubernetes 集群搭建概述
Kubernetes(简称K8s)作为当前最流行的容器编排平台,已经成为云原生技术栈的核心组件。对于开发者、运维工程师和技术团队来说,掌握Kubernetes集群的搭建是必备技能。本文将详细介绍使用kubeadm工具从零开始搭建生产级Kubernetes集群的全过程。
为什么选择kubeadm?相比二进制部署方式,kubeadm提供了更简单的集群初始化和管理体验,同时保留了足够的灵活性。它通过kubeadm init和kubeadm join命令简化了集群的创建和节点加入过程,特别适合中小规模的生产环境部署。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件与操作系统要求
搭建Kubernetes集群前,需要确保所有节点满足以下基本要求:
- 至少2GB内存(推荐4GB以上)
- 2核CPU(推荐4核以上)
- 20GB可用磁盘空间
- 所有节点间网络互通
- 操作系统:Ubuntu 20.04/22.04或CentOS 7/8
提示:生产环境建议使用3个或更多节点组成高可用集群,本文以1个Master和2个Worker节点为例。
2.2 系统基础配置
在所有节点上执行以下配置:
2.2.1 关闭防火墙和SELinux
bash复制# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 永久关闭SELinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
setenforce 0
2.2.2 禁用Swap分区
bash复制# 临时禁用
swapoff -a
# 永久禁用
sed -ri 's/.*swap.*/#&/' /etc/fstab
禁用Swap的原因:Kubernetes的内存管理机制依赖Linux原生内存管理,Swap会导致内存调度不稳定,可能引发容器性能问题。
2.2.3 配置主机名和hosts
bash复制# 设置主机名(分别在各个节点执行)
hostnamectl set-hostname k8s-master # Master节点
hostnamectl set-hostname k8s-node1 # Worker节点1
hostnamectl set-hostname k8s-node2 # Worker节点2
# 在所有节点添加hosts解析
cat >> /etc/hosts <<EOF
192.168.1.100 k8s-master
192.168.1.101 k8s-node1
192.168.1.102 k8s-node2
EOF
2.2.4 内核参数优化
bash复制cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
# 加载模块并应用配置
modprobe br_netfilter
sysctl --system
这些参数确保:
- 容器网络流量能被正确路由
- 启用IP转发功能
- 禁止使用swap内存
2.2.5 时间同步配置
bash复制# 安装chrony
apt install -y chrony
# 启动并设置开机自启
systemctl start chronyd
systemctl enable chronyd
# 验证时间同步
chronyc sources -v
date
3. 容器运行时与Kubernetes组件安装
3.1 Docker安装与配置
Kubernetes 1.24+版本已移除对Docker的直接支持,我们需要安装cri-docker适配器:
bash复制# 安装依赖
apt update && apt install -y apt-transport-https ca-certificates curl software-properties-common
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加Docker仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker
apt update && apt install -y docker-ce docker-ce-cli containerd.io
# 配置Docker使用systemd作为cgroup驱动
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
# 重启Docker
systemctl daemon-reload
systemctl restart docker
systemctl enable docker
3.2 安装cri-docker适配器
bash复制# 下载cri-docker
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz
# 解压安装
tar xvf cri-dockerd-0.3.4.amd64.tgz
cp cri-dockerd/cri-dockerd /usr/local/bin/
# 创建systemd服务
cat > /etc/systemd/system/cri-docker.service <<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target docker.service
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/cri-dockerd --container-runtime-endpoint fd://
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF
# 启动服务
systemctl daemon-reload
systemctl enable cri-docker --now
3.3 安装kubeadm、kubelet和kubectl
bash复制# 添加Kubernetes仓库
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装组件
apt update && apt install -y kubelet kubeadm kubectl
# 锁定版本防止自动升级
apt-mark hold kubelet kubeadm kubectl
# 启动kubelet
systemctl enable --now ku
