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: v1kind: PersistentVolumemetadata:name: local-pvspec:capacity:storage: 10GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: local-storagelocal:path: /mnt/datanodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostnameoperator: Invalues:- <特定節點主機名>
3. 安全加固
-
啟用 RBAC:
# 創建 Role 和 RoleBindingapiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:name: pod-readerrules:- apiGroups: [""]resources: ["pods"]verbs: ["get", "list"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:name: read-podssubjects:- kind: Username: dev-userroleRef:kind: Rolename: pod-readerapiGroup: rbac.authorization.k8s.io
-
網絡策略:
# 限制 Pod 入站流量apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata:name: deny-all-ingressspec: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 和 etcdsudo 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 集群的部署、應用管理及生產級運維。建議結合監控、日志和備份策略,確保集群的穩定性和可靠性。