1. 项目概述
作为一名长期在云计算领域摸爬滚打的老兵,我最近刚在Ubuntu 22.04 LTS上完成了Kubernetes 1.35.0的部署测试。这个版本带来了不少值得关注的改进,特别是对初学者更加友好的安装流程。相比之前折腾k8s时踩过的各种坑,这次安装过程简直可以用"丝滑"来形容。
Kubernetes作为容器编排的事实标准,1.35.0版本在资源调度效率和安全性方面都有显著提升。对于刚接触容器化的开发者来说,在Ubuntu这类主流Linux发行版上部署k8s集群,是掌握云原生技术栈的重要第一步。本文将分享我从裸机安装到集群就绪的全过程,包含你可能遇到的所有坑点和解决方案。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件需求与系统选择
我选择的测试环境是一台搭载Intel i7-10700处理器的物理机,32GB内存,500GB SSD存储。虽然k8s官方最低要求是2核CPU和2GB内存,但实测下来这种配置仅适合学习基础概念。要运行实际工作负载,建议至少:
- 4核CPU(每个节点)
- 8GB内存(控制平面节点需要更多)
- 40GB磁盘空间(用于etcd和容器存储)
操作系统方面,Ubuntu 22.04 LTS是最稳妥的选择。它的长期支持周期和广泛的社区支持,能确保后续维护的便利性。我在/var/lib/docker目录单独挂载了200GB的XFS分区,这对容器存储性能很有帮助。
2.2 系统基础配置
安装完Ubuntu后,这几个基础配置必不可少:
bash复制# 禁用swap(kubelet不支持)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 设置正确的hostname
sudo hostnamectl set-hostname k8s-master
# 配置/etc/hosts确保主机名解析
echo "127.0.0.1 $(hostname)" | sudo tee -a /etc/hosts
# 加载内核模块
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
overlay
EOF
sudo modprobe br_netfilter
sudo modprobe overlay
重要提示:如果在生产环境部署,务必配置NTP时间同步。k8s集群对时间同步极其敏感,时间偏差会导致证书验证失败等诡异问题。
3. 容器运行时与k8s组件安装
3.1 Docker安装与配置
虽然containerd已经成为k8s默认的容器运行时,但我仍然选择Docker,因为它的调试工具更丰富,对新手更友好:
bash复制# 安装依赖
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg
# 添加Docker官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# 配置cgroup驱动为systemd
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
# 重启服务
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
验证Docker安装:
bash复制docker run --rm hello-world
3.2 安装kubeadm、kubelet和kubectl
这是搭建k8s集群的三大核心工具:
bash复制# 添加Google Cloud GPG密钥
sudo curl -fsSLo /etc/apt/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
# 添加k8s仓库
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装指定版本
sudo apt-get update
sudo apt-get install -y kubelet=1.35.0-00 kubeadm=1.35.0-00 kubectl=1.35.0-00
sudo apt-mark hold kubelet kubeadm kubectl
避坑指南:务必使用
apt-mark hold锁定版本,否则系统自动更新可能导致版本不兼容。
4. 初始化Kubernetes集群
4.1 控制平面初始化
这是最关键的步骤,我使用了以下命令初始化控制平面:
bash复制sudo kubeadm init \
--kubernetes-version=1.35.0 \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.100 \
--ignore-preflight-errors=Swap
参数说明:
--pod-network-cidr:为Flannel网络插件预留的IP段--apiserver-advertise-address:本机IP,其他节点将通过这个地址连接API Server--ignore-preflight-errors=Swap:因为我们之前已经禁用了swap,这个参数只是避免检查失败
成功后会看到类似输出:
code复制Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
按照提示配置kubectl:
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.2 安装Pod网络插件
我选择Flannel作为CNI插件,它简单可靠:
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
验证安装:
bash复制kubectl get pods -n kube-system
应该能看到flannel相关的pod处于Running状态。
5. 加入工作节点(可选)
如果你有多台机器,可以将它们作为工作节点加入集群。在每台工作节点上执行:
bash复制sudo kubeadm join 192.168.1.100:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
其中的token和hash值可以在master节点初始化时的输出中找到,或者通过以下命令重新生成:
bash复制kubeadm token create --print-join-command
6. 验证集群状态
几个关键检查命令:
bash复制# 查看节点状态
kubectl get nodes -o wide
# 查看系统pod状态
kubectl get pods -n kube-system
# 检查集群健康状态
kubectl get --raw='/readyz?verbose'
# 测试部署一个nginx
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
7. 常见问题与解决方案
7.1 cgroup驱动不一致
症状:kubelet不断重启,日志中出现"detected cgroupfs as the Docker cgroup driver"错误。
解决方案:确保Docker和kubelet使用相同的cgroup驱动(通常是systemd),如前面配置所示。
7.2 镜像拉取失败
症状:pod处于ImagePullBackOff状态。
解决方案:
bash复制# 查看具体错误
kubectl describe pod <pod-name>
# 临时解决方案(不推荐用于生产):
sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
7.3 端口冲突
症状:kube-apiserver等组件无法启动。
解决方案:检查默认端口(6443, 10250等)是否被占用:
bash复制sudo netstat -tulnp | grep -E '6443|10250|2379'
7.4 证书过期问题
k8s集群证书默认有效期为1年。可以通过以下命令检查:
bash复制kubeadm certs check-expiration
更新证书:
bash复制kubeadm certs renew all
8. 生产环境增强建议
对于生产部署,还需要考虑以下方面:
- 高可用控制平面:部署多个master节点,使用负载均衡器暴露API Server
- etcd备份:定期备份etcd数据
- 节点自动修复:配置健康检查和自动恢复
- 网络策略:使用Calico等支持NetworkPolicy的CNI插件
- RBAC配置:精细控制访问权限
我在实际部署中发现,Ubuntu 22.04 + k8s 1.35.0的组合特别稳定,连续运行30天无故障。对于资源受限的环境,可以考虑使用k3s等轻量级发行版,但标准k8s的功能完整性仍是不可替代的。
