1. Ubuntu系统部署Kubernetes集群完整指南
在云计算和容器化技术大行其道的今天,Kubernetes(简称k8s)已经成为容器编排领域的事实标准。作为一名长期在Ubuntu环境下工作的系统工程师,我经历过无数次k8s集群的部署过程。本文将分享我在Ubuntu 22.04 LTS上部署生产级k8s集群的完整经验,包含从系统准备到集群验证的全流程,以及那些官方文档不会告诉你的实战技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与系统配置
2.1 硬件与系统要求
对于生产环境,建议至少准备:
- 2核CPU/4GB内存的主机(master节点)
- 1核CPU/2GB内存的工作节点(数量根据业务需求)
- 20GB以上的磁盘空间
- 稳定的网络连接(各节点间延迟<1ms为佳)
在虚拟机或物理机上安装Ubuntu 22.04 LTS时,建议选择最小化安装(Minimal Install)以减少不必要的软件包。安装完成后立即执行:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
注意:Ubuntu 22.04默认使用netplan进行网络配置,如果遇到网络问题,可检查/etc/netplan/下的配置文件。我曾遇到过默认MTU设置导致calico网络插件异常的情况,将MTU调整为1440解决了问题。
2.2 禁用Swap内存
Kubernetes从1.8版本开始要求禁用swap,否则kubelet服务将无法正常启动:
bash复制sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2.3 配置系统内核参数
将以下参数添加到/etc/sysctl.d/kubernetes.conf:
bash复制net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
加载配置并验证:
bash复制sudo sysctl --system
sysctl net.bridge.bridge-nf-call-iptables
3. 容器运行时安装与配置
3.1 Docker CE安装
虽然Kubernetes已经支持containerd作为默认运行时,但Docker仍然是最常用的选择:
bash复制curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 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
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
配置Docker使用systemd作为cgroup驱动(必须与k8s一致):
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
重启服务并设置开机自启:
bash复制sudo systemctl enable docker && sudo systemctl daemon-reload
sudo systemctl restart docker
3.2 containerd配置(可选)
如果选择直接使用containerd:
bash复制sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
4. Kubernetes组件安装
4.1 添加k8s仓库并安装工具
bash复制curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl # 防止自动升级导致版本不兼容
4.2 初始化Master节点
执行初始化前,确保:
- 各节点主机名唯一(使用hostnamectl set-hostname设置)
- 主机名解析正常(/etc/hosts或DNS配置)
- 防火墙放行6443、2379-2380等端口
初始化命令示例:
bash复制sudo kubeadm init \
--pod-network-cidr=192.168.0.0/16 \
--apiserver-advertise-address=<master节点IP> \
--control-plane-endpoint=<负载均衡IP或DNS> \
--upload-certs
实战技巧:首次初始化很可能会遇到各种问题,建议添加--v=5参数查看详细日志。我遇到过最常见的问题是镜像拉取失败,可以通过kubeadm config images pull预先拉取镜像。
成功后会输出join命令,务必保存好。配置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.3 安装网络插件
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
验证安装:
bash复制watch kubectl get pods -n calico-system
5. 工作节点加入集群
在每个工作节点上执行master初始化时输出的join命令,例如:
bash复制kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
加入后,在master节点检查节点状态:
bash复制kubectl get nodes
常见问题:如果节点长时间处于NotReady状态,通常问题出在:
- 网络插件未正确安装(检查calico或flannel的pod状态)
- 节点间网络不通(检查防火墙规则)
- 容器运行时异常(检查docker或containerd日志)
6. 集群验证与基本操作
6.1 基本状态检查
bash复制kubectl get all -A # 查看所有资源
kubectl get cs # 检查组件状态
kubectl describe node <node-name> # 查看节点详情
6.2 测试部署应用
部署一个nginx测试:
bash复制kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx # 获取访问端口
访问http://<节点IP>:
6.3 核心组件监控
安装metrics-server用于资源监控:
bash复制kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
查看资源使用情况:
bash复制kubectl top nodes
kubectl top pods
7. 生产环境关键配置
7.1 证书自动续期
kubeadm默认证书有效期为1年,配置自动续期:
bash复制sudo sed -i 's|KUBELET_KUBECONFIG_ARGS=.*|KUBELET_KUBECONFIG_ARGS="--kubeconfig=/etc/kubernetes/kubelet.conf --rotate-certificates"|' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo systemctl daemon-reload
sudo systemctl restart kubelet
7.2 集群备份与恢复
定期备份etcd数据:
bash复制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 /opt/etcd-backup-$(date +%F).db
恢复etcd快照:
bash复制sudo kubeadm reset
sudo ETCDCTL_API=3 etcdctl snapshot restore /opt/etcd-backup.db \
--data-dir /var/lib/etcd-from-backup
sudo systemctl restart kubelet
8. 常见问题排查指南
8.1 网络问题排查流程
- 检查Calico/Fannel Pod是否运行正常
- 检查节点路由表(ip route)
- 验证节点间网络连通性(ping/telnet)
- 检查iptables/nftables规则
- 验证网络策略是否阻止了通信
8.2 Pod卡在Pending状态
bash复制kubectl describe pod <pod-name> # 查看事件
kubectl get events --sort-by='.metadata.creationTimestamp' # 集群级别事件
常见原因:
- 资源不足(CPU/内存)
- 没有满足条件的节点(nodeSelector/affinity)
- PV/PVC问题(如果是stateful应用)
8.3 节点NotReady处理步骤
- 检查kubelet服务状态:systemctl status kubelet
- 查看kubelet日志:journalctl -u kubelet -f
- 验证容器运行时状态(docker info或crictl info)
- 检查节点资源是否耗尽(df -h / free -m)
9. 性能优化建议
9.1 内核参数调优
在/etc/sysctl.d/10-k8s.conf中添加:
bash复制fs.file-max=1000000
net.core.somaxconn=32768
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_fin_timeout=30
net.core.netdev_max_backlog=5000
9.2 kubelet资源配置
编辑/var/lib/kubelet/config.yaml:
bash复制systemReserved:
cpu: "500m"
memory: "500Mi"
kubeReserved:
cpu: "500m"
memory: "500Mi"
evictionHard:
memory.available: "200Mi"
nodefs.available: "10%"
9.3 镜像仓库加速
对于国内环境,配置Docker使用镜像加速:
bash复制sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
10. 安全加固措施
10.1 RBAC权限控制
创建最小权限ServiceAccount:
bash复制kubectl create serviceaccount limited-user
kubectl create role limited-role --resource=pods --verb=get,list
kubectl create rolebinding limited-role-binding --role=limited-role --serviceaccount=default:limited-user
10.2 Pod安全策略
启用PodSecurity admission(k8s 1.23+):
bash复制apiVersion: apiserver.config.k8s.io/v1
kind: AdmissionConfiguration
plugins:
- name: PodSecurity
configuration:
apiVersion: pod-security.admission.config.k8s.io/v1
kind: PodSecurityConfiguration
defaults:
enforce: "restricted"
enforce-version: "latest"
10.3 网络策略
限制default命名空间的所有Pod入站流量:
bash复制kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
EOF
在Ubuntu上部署Kubernetes集群虽然步骤明确,但实际环境中总会遇到各种意外情况。建议首次部署时做好文档记录,将关键命令脚本化。对于生产环境,一定要考虑高可用架构、监控告警和日志收集等配套系统。
