1. 为什么选择Ubuntu部署Kubernetes?
作为Linux发行版中的常青树,Ubuntu凭借其稳定的LTS版本和活跃的社区支持,成为部署生产级Kubernetes集群的首选操作系统。我在多个实际项目中发现,Ubuntu 22.04 LTS与Kubernetes 1.24+版本的组合能提供最佳兼容性——内核默认包含overlay2存储驱动所需模块,且systemd版本完美适配kubelet服务管理。
重要提示:生产环境务必选择LTS版本(当前推荐22.04),非LTS版可能遇到内核模块缺失问题
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统调优
2.1 硬件资源配置建议
- 控制节点:至少2核CPU/4GB内存/50GB磁盘
- 工作节点:根据负载调整,建议4核CPU起/8GB内存/100GB磁盘
- 所有节点需要:
- 唯一主机名(通过
hostnamectl set-hostname设置) - 禁用交换分区(
swapoff -a并注释/etc/fstab中的swap行) - 时间同步(
timedatectl set-ntp true)
- 唯一主机名(通过
2.2 网络预配置要点
bash复制# 加载br_netfilter模块
sudo modprobe br_netfilter
echo 'br_netfilter' | sudo tee /etc/modules-load.d/k8s.conf
# 设置网络参数
cat <<EOF | sudo 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
sudo sysctl --system
3. 容器运行时安装与配置
3.1 Docker CE安装(可选方案)
bash复制# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt-get update
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 设置稳定版仓库
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引擎
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
3.2 Containerd直接安装(推荐方案)
bash复制# 安装containerd
sudo apt-get update
sudo apt-get install -y containerd
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置使用systemd cgroup
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 重启服务
sudo systemctl restart containerd
sudo systemctl enable containerd
4. Kubernetes组件安装
4.1 添加Kubernetes仓库
bash复制# 添加APT密钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
# 添加Kubernetes仓库
echo "deb [signed-by=/usr/share/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 kubeadm kubectl
# 锁定版本防止自动升级
sudo apt-mark hold kubelet kubeadm kubectl
4.2 初始化控制平面
bash复制# 使用国内镜像源初始化
sudo kubeadm init \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=<本机IP>
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5. 网络插件部署
5.1 Flannel网络部署
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
5.2 Calico网络部署(推荐生产环境)
bash复制kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml
6. 工作节点加入集群
在控制平面初始化完成后,会输出类似以下的加入命令:
bash复制kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
注意:token默认24小时有效,过期后可通过
kubeadm token create --print-join-command生成新命令
7. 集群验证与问题排查
7.1 基础状态检查
bash复制# 查看节点状态
kubectl get nodes -o wide
# 查看Pod状态
kubectl get pods --all-namespaces
# 查看服务状态
kubectl get svc -A
7.2 常见问题解决方案
问题1:kubelet无法启动
- 现象:
systemctl status kubelet显示"failed to load Kubelet config file" - 解决:
bash复制sudo rm -rf /etc/kubernetes/manifests/ sudo systemctl restart kubelet
问题2:Pod一直处于Pending状态
- 可能原因:未安装网络插件或资源不足
- 检查命令:
bash复制kubectl describe pod <pod-name> | grep -A 10 Events kubectl get events --sort-by='.metadata.creationTimestamp'
问题3:镜像拉取失败
- 临时解决方案:
bash复制
docker pull registry.aliyuncs.com/google_containers/<image-name> docker tag registry.aliyuncs.com/google_containers/<image-name> k8s.gcr.io/<image-name>
8. 生产环境优化建议
8.1 证书自动续期配置
bash复制# 修改kubeadm配置
sudo vi /etc/kubernetes/kubeadm-config.yaml
# 添加如下内容:
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
controllerManager:
extraArgs:
feature-gates: RotateKubeletServerCertificate=true
cluster-signing-duration: 87600h0m0s
8.2 节点资源预留配置
bash复制# 编辑kubelet配置
sudo vi /var/lib/kubelet/config.yaml
# 添加:
evictionHard:
memory.available: "500Mi"
nodefs.available: "10%"
systemReserved:
cpu: "500m"
memory: "500Mi"
8.3 日志轮转配置
bash复制# 创建日志轮转配置
sudo tee /etc/logrotate.d/kubernetes <<EOF
/var/log/pods/*/*/*.log {
daily
rotate 7
missingok
compress
delaycompress
copytruncate
}
EOF
9. 集群维护操作指南
9.1 版本升级流程
bash复制# 1. 升级kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm=<新版本号>
# 2. 检查升级计划
sudo kubeadm upgrade plan
# 3. 执行升级
sudo kubeadm upgrade apply <目标版本>
# 4. 升级节点组件
sudo apt-get install -y kubelet=<新版本号> kubectl=<新版本号>
sudo systemctl daemon-reload
sudo systemctl restart kubelet
9.2 备份与恢复方案
bash复制# 备份etcd
sudo ETCDCTL_API=3 etcdctl \
--endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save /tmp/etcd-snapshot-$(date +%Y%m%d).db
# 恢复etcd
sudo ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-snapshot.db \
--data-dir /var/lib/etcd-backup
