Ubuntu 系统上部署 Kubernetes 的完整指南
Ubuntu 系统上部署 Kubernetes 的完整指南
- 一、环境准备(Ubuntu 22.04/24.04)
- 1. 系统初始化
- 2. 安装容器运行时(containerd)
- 3. 安装 Kubernetes 组件(kubeadm, kubelet, kubectl)
- 二、部署 Kubernetes 集群
- 1. 初始化主节点
- 2. 添加工作节点
- 3. 验证集群状态
- 三、部署应用示例
- 1. 创建 Deployment
- 2. 创建 Service
- 3. 部署应用
- 四、运维管理
- 1. 资源监控
- 2. 日志管理
- 3. 自动扩缩容
- 五、生产级最佳实践
- 1. 高可用控制平面
- 2. 持久化存储
- 3. 安全加固
- 六、备份与灾难恢复
- 1. 备份 etcd 数据
- 2. 恢复 etcd 数据
- 七、常见问题排查
- 1. Pod 处于 Pending 状态
- 2. 服务无法访问
以下是 在全新安装的 Ubuntu 系统上部署 Kubernetes 的完整指南,涵盖环境准备、集群部署、运维管理及生产级最佳实践,适用于开发和生产场景。
一、环境准备(Ubuntu 22.04/24.04)
1. 系统初始化
# 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl gnupg apt-transport-https ca-certificates software-properties-common# 禁用交换分区(Kubernetes 要求)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 永久禁用# 设置主机名(可选)
sudo hostnamectl set-hostname k8s-master # 主节点
sudo hostnamectl set-hostname k8s-worker1 # 工作节点
2. 安装容器运行时(containerd)
# 安装 containerd
sudo apt install -y containerd
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd# 验证运行时状态
sudo ctr version
3. 安装 Kubernetes 组件(kubeadm, kubelet, kubectl)
# 添加 Kubernetes 官方 GPG 密钥
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg# 添加仓库源
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# 安装指定版本(例如 1.28.x)
sudo apt update && sudo apt install -y kubeadm=1.28.* kubelet=1.28.* kubectl=1.28.*# 设置 kubelet 自动启动(暂不启动)
sudo systemctl enable kubelet
二、部署 Kubernetes 集群
1. 初始化主节点
# 主节点执行
sudo kubeadm init \--pod-network-cidr=192.168.0.0/16 \ # 匹配 Calico 默认配置--apiserver-advertise-address=<主节点IP> \--control-plane-endpoint=<主节点IP或负载均衡地址># 成功后按提示操作
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config# 安装网络插件(Calico)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
2. 添加工作节点
# 在工作节点执行(使用主节点初始化后生成的命令)
sudo kubeadm join <主节点IP>:6443 \--token <token> \--discovery-token-ca-cert-hash sha256:<hash>
3. 验证集群状态
kubectl get nodes # 所有节点状态应为 Ready
kubectl cluster-info
三、部署应用示例
1. 创建 Deployment
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.25ports:- containerPort: 80resources:requests:cpu: "100m"memory: "128Mi"limits:cpu: "200m"memory: "256Mi"
2. 创建 Service
# service.yaml
apiVersion: v1
kind: Service
metadata:name: nginx-service
spec:type: NodePortselector:app: nginxports:- port: 80targetPort: 80nodePort: 30080
3. 部署应用
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml# 验证
kubectl get pods -o wide
curl http://<节点IP>:30080 # 应返回 Nginx 欢迎页
四、运维管理
1. 资源监控
# 安装 Metrics Server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml# 查看资源使用
kubectl top nodes
kubectl top pods
2. 日志管理
# 查看 Pod 日志
kubectl logs <pod-name> -f # 实时日志# 安装 EFK 日志系统(生产环境)
kubectl apply -f https://raw.githubusercontent.com/elastic/cloud-on-k8s/main/config/recipes/elasticsearch/elasticsearch.yaml
3. 自动扩缩容
# 设置 Horizontal Pod Autoscaler
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=2 --max=5
五、生产级最佳实践
1. 高可用控制平面
• 使用 kubeadm 部署多主节点:
# 第一个主节点初始化后,其他主节点执行:
sudo kubeadm join <负载均衡IP>:6443 --token <token> \--discovery-token-ca-cert-hash sha256:<hash> \--control-plane
2. 持久化存储
# 创建 PersistentVolume(示例使用本地存储)
apiVersion: v1
kind: PersistentVolume
metadata:name: local-pv
spec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /mnt/datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- <特定节点主机名>
3. 安全加固
• 启用 RBAC:
# 创建 Role 和 RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:name: pod-reader
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:name: read-pods
subjects:
- kind: Username: dev-user
roleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
• 网络策略:
# 限制 Pod 入站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-all-ingress
spec:podSelector: {}policyTypes:- Ingress
六、备份与灾难恢复
1. 备份 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 /backup/etcd-snapshot.db
2. 恢复 etcd 数据
# 停止 kube-apiserver 和 etcd
sudo systemctl stop kube-apiserver etcd# 恢复快照
sudo ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot.db \--data-dir=/var/lib/etcd-restored# 重启服务
sudo systemctl start etcd kube-apiserver
七、常见问题排查
1. Pod 处于 Pending 状态
• 可能原因:
• 资源不足(CPU/内存)。
• 没有可用节点匹配调度规则。
• 解决:
kubectl describe pod <pod-name> | grep Events # 查看事件
kubectl get nodes -o wide # 检查节点资源
2. 服务无法访问
• 可能原因:
• Service 的 selector 与 Pod 标签不匹配。
• 网络策略阻止流量。
• 解决:
kubectl describe service <service-name> # 检查 Endpoints
kubectl get networkpolicy # 查看网络策略
通过以上步骤,您可以在 Ubuntu 系统上完成 Kubernetes 集群的部署、应用管理及生产级运维。建议结合监控、日志和备份策略,确保集群的稳定性和可靠性。