Kubernetes(k8s)是一個開源的容器編排平臺,用于自動化部署、擴展和管理容器化應用。以下是其基本原理、使用步驟和注意事項的總結:
一、k8s 基本原理
-
核心架構
- Master 節點:控制集群的核心組件,包括:
- API Server:所有操作的入口,提供 RESTful API。
- Scheduler:將 Pod 分配到合適的 Node。
- Controller Manager:維護集群狀態(如副本數、故障檢測)。
- etcd:分布式鍵值存儲,保存集群狀態。
- Worker 節點:運行容器化應用,包含:
- kubelet:與 Master 通信,管理 Pod 生命周期。
- kube-proxy:處理網絡規則和負載均衡。
- 容器運行時(如 Docker、containerd)。
- Master 節點:控制集群的核心組件,包括:
-
關鍵概念
- Pod:最小部署單元,包含一個或多個共享資源的容器。
- Deployment:定義 Pod 的副本數和更新策略。
- Service:為 Pod 提供穩定的網絡訪問(ClusterIP、NodePort、LoadBalancer)。
- Namespace:邏輯隔離集群資源(如開發、生產環境)。
- ConfigMap/Secret:管理配置和敏感數據。
-
工作流程
- 用戶通過
kubectl
或 API 提交 YAML 描述文件。 - Master 組件協調資源分配,調度 Pod 到 Node。
- kubelet 拉取鏡像并啟動容器,持續監控狀態。
- 用戶通過
以下是一個簡化的 Kubernetes 架構圖,描述 物理機(服務器)、K8s 集群、應用節點 之間的關系,并用文字逐步解釋關鍵組件和交互流程:
Kubernetes 架構圖
關鍵關系說明
-
物理服務器層
- 提供硬件資源(CPU/內存/存儲/網絡)。
- 每臺物理機部署一個角色:
- Master 節點:運行控制平面組件(API Server、Scheduler 等)。
- Worker 節點:運行應用負載(Pod)。
-
K8s 集群層
- Master 節點:
- API Server:接收用戶或工具(如
kubectl
)的指令。 - Scheduler:決定 Pod 運行在哪個 Worker 節點。
- etcd:存儲集群狀態(如 Pod、Service 配置)。
- API Server:接收用戶或工具(如
- Worker 節點:
- kubelet:與 Master 通信,管理 Pod 生命周期。
- kube-proxy:處理節點上的網絡規則(Service 流量轉發)。
- Pod:最小調度單元,包含一個或多個容器。
- Master 節點:
-
應用層
- 每個 Pod 中運行具體的容器化應用(如 Nginx、MySQL)。
- 應用通過 Service 或 Ingress 暴露給外部訪問。
交互流程示例
-
用戶部署應用
- 用戶通過
kubectl apply -f app.yaml
提交請求到 API Server。 - Scheduler 根據資源情況,將 Pod 分配到 Node1 或 Node2。
- 目標節點的 kubelet 拉取鏡像并啟動容器。
- 用戶通過
-
應用訪問
- 其他 Pod 或外部用戶通過 Service(如 ClusterIP)訪問應用。
- kube-proxy 負責將請求轉發到具體的 Pod。
-
高可用性
- 若 Node1 宕機,Master 檢測到故障后,會在 Node2 上重新調度 Pod。
注意事項
-
物理機與 K8s 節點的映射
- 生產環境中,建議 Master 節點獨占物理機(避免資源競爭)。
- Worker 節點可以跨多臺物理機,提高容災能力。
-
網絡要求
- 所有物理機需在同一網絡,確保 Pod 間可通信。
- 避免防火墻阻斷 K8s 組件端口(如 6443、10250)。
-
存儲卷
- 如果應用需要持久化數據,需掛載物理機的存儲(如 NFS)或云存儲(如 AWS EBS)。
通過此架構圖,可以清晰看到:
物理機提供資源 → K8s 管理調度 → 應用運行在 Pod 中。
實際部署時,還需考慮網絡插件(如 Calico)、負載均衡(如 MetalLB)等組件。
二、使用步驟
1. 安裝與初始化
- 安裝工具:
kubectl
、minikube
(本地測試)或kubeadm
(生產集群)。 - 初始化集群(以
kubeadm
為例):kubeadm init --apiserver-advertise-address=<MASTER_IP>
- 加入 Worker 節點:
kubeadm join <MASTER_IP>:6443 --token <TOKEN>
2. 部署應用
-
編寫 YAML 文件(例如
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:latestports:- containerPort: 80
-
應用配置:
kubectl apply -f deployment.yaml
3. 暴露服務
- 創建 Service:
apiVersion: v1 kind: Service metadata:name: nginx-service spec:selector:app: nginxports:- protocol: TCPport: 80targetPort: 80type: LoadBalancer
4. 監控與維護
- 查看資源狀態:
kubectl get pods,svc,deployments
- 日志與調試:
kubectl logs <pod-name> kubectl describe pod <pod-name>
三、注意事項
-
資源規劃
- 確保 Node 資源(CPU、內存)充足,避免 Pod 因資源不足被驅逐。
- 使用
Resource Requests/Limits
限制容器資源占用:resources:requests:cpu: "100m"memory: "256Mi"limits:cpu: "500m"memory: "1Gi"
-
高可用性
- 生產環境需部署多 Master 節點,避免單點故障。
- 使用
Horizontal Pod Autoscaler (HPA)
自動擴縮容。
-
安全實踐
- 啟用 RBAC 控制權限,避免過度授權。
- 定期更新 k8s 版本,修復安全漏洞。
- 敏感數據使用
Secret
而非 ConfigMap。
-
網絡與存儲
- 選擇適合的 CNI 插件(如 Calico、Flannel)解決網絡隔離。
- 持久化存儲使用
PersistentVolume (PV)
和PersistentVolumeClaim (PVC)
。
-
故障排查
- 常見問題:
- Pod 一直
Pending
:檢查資源或調度約束。 - CrashLoopBackOff:查看容器日志排查應用錯誤。
- Pod 一直
- 使用
kubectl events
查看集群事件。
- 常見問題:
-
備份與恢復
- 定期備份
etcd
數據:etcdctl snapshot save backup.db
- 定期備份
四、常用命令速查
功能 | 命令示例 |
---|---|
查看 Pod | kubectl get pods -A |
進入容器 | kubectl exec -it <pod> -- bash |
刪除資源 | kubectl delete -f file.yaml |
查看 Service | kubectl get svc |
滾動更新 | kubectl set image deploy/nginx nginx=nginx:1.20 |
通過理解這些原理和步驟,可以高效使用 k8s 管理容器化應用。生產環境中建議結合監控工具(Prometheus)和日志系統(ELK)完善運維體系。