一、Kubernetes 核心原理
1. Kubernetes 設計哲學
Kubernetes(k8s)是一個開源的容器編排平臺,旨在自動化容器化應用的部署、擴展和管理。其核心設計圍繞以下目標:
- 聲明式配置:用戶描述期望狀態(如 YAML 文件),系統自動驅動實際狀態匹配期望狀態。
- 自愈能力:自動重啟故障容器、替換不可用節點、動態擴展副本等。
- 松耦合架構:組件模塊化,通過 API 交互,支持靈活擴展。
2. Kubernetes 架構概覽
Kubernetes 集群由 Master 節點(控制平面)和 Worker 節點(計算節點)組成:
二、Master 節點組件原理
1. API Server
- 功能:Kubernetes 的前端接口,接收并處理所有 REST 請求(如
kubectl
命令)。 - 原理:
- 驗證請求合法性(Authentication)。
- 鑒權(Authorization)與準入控制(Admission Control)。
- 將資源狀態持久化到 etcd。
- 高可用:多實例部署,通過負載均衡對外服務。
2. etcd
- 功能:分布式鍵值存儲,保存集群所有配置數據(如 Pod、Service 狀態)。
- 原理:
- 基于 Raft 算法實現強一致性。
- 監聽機制(Watch)支持組件實時感知狀態變更。
- 優化:定期備份數據,分離 Kubernetes 數據與其他業務數據。
3. Scheduler
- 功能:將未調度的 Pod 分配到合適的 Worker 節點。
- 調度流程:
- 過濾(Predicate):排除不滿足條件的節點(如資源不足)。
- 打分(Priority):對剩余節點評分(如 CPU 空閑率最高者優先)。
- 擴展性:支持自定義調度策略(如 GPU 親和性)。
4. Controller Manager
- 功能:運行控制器循環,確保系統實際狀態匹配期望狀態。
- 核心控制器:
- Deployment Controller:管理 ReplicaSet 的副本數。
- Node Controller:監控節點狀態,驅逐不可用節點上的 Pod。
- Service Controller:為 Service 配置負載均衡器(如 AWS ELB)。
三、Worker 節點組件原理
1. kubelet
- 功能:節點代理,管理 Pod 生命周期(創建/銷毀容器)。
- 核心職責:
- 監聽 API Server 分配的 Pod 清單。
- 調用容器運行時(如 Docker、Containerd)啟動容器。
- 定期上報節點狀態(CPU、內存使用率)到 API Server。
2. kube-proxy
- 功能:實現 Service 的負載均衡和網絡規則。
- 實現模式:
- iptables(默認):為每個 Service 生成 iptables 規則。
- IPVS:基于內核級負載均衡,性能更優。
- 原理:將訪問 Service VIP 的流量轉發到后端 Pod。
3. 容器運行時
- 功能:執行容器生命周期操作(如 Docker、Containerd、CRI-O)。
- CRI(Container Runtime Interface):Kubernetes 定義的容器運行時標準接口。
四、核心對象與資源模型
1. Pod
- 最小調度單元:包含一個或多個共享網絡/存儲的容器。
- 生命周期:Pending → Running → Succeeded/Failed。
- 設計模式:
- Sidecar:輔助容器(如日志收集)。
- Init Container:在主容器前運行初始化任務。
2. Deployment
- 功能:管理 Pod 副本集,支持滾動更新和回滾。
- 示例 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.19ports:- containerPort: 80
3. Service
- 功能:為一組 Pod 提供穩定的訪問入口(VIP 或 DNS)。
- 類型:
- ClusterIP(默認):集群內部訪問。
- NodePort:通過節點端口暴露服務。
- LoadBalancer:云平臺負載均衡器集成。
五、實踐指南:從零部署應用
1. 環境準備
安裝 Minikube(本地單節點集群)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start --driver=docker
驗證集群狀態
kubectl get nodes
kubectl cluster-info
2. 部署 Nginx 應用
創建 Deployment
kubectl create deployment nginx --image=nginx:1.19
kubectl get pods -l app=nginx
暴露 Service
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
訪問應用
minikube service nginx --url # 獲取訪問URL
curl http://<NodeIP>:<NodePort>
3. 應用擴展與更新
水平擴展副本
kubectl scale deployment nginx --replicas=5
kubectl get pods -l app=nginx
滾動更新版本
kubectl set image deployment/nginx nginx=nginx:1.21
kubectl rollout status deployment/nginx
回滾到舊版本
kubectl rollout undo deployment/nginx
六、高級實踐:持久化存儲與配置管理
1. PersistentVolume (PV) 與 PersistentVolumeClaim (PVC)
創建 PV 和 PVC
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncehostPath:path: /data/pv
---
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 3Gi
掛載到 Pod
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: appimage: nginxvolumeMounts:- name: datamountPath: /usr/share/nginx/htmlvolumes:- name: datapersistentVolumeClaim:claimName: my-pvc
2. ConfigMap 與 Secret
管理配置
# 創建 ConfigMap
kubectl create configmap app-config --from-file=config.properties# 創建 Secret
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=123456
在 Pod 中使用
apiVersion: v1
kind: Pod
metadata:name: config-demo
spec:containers:- name: appimage: busyboxcommand: ["/bin/sh", "-c", "env"]envFrom:- configMapRef:name: app-config- secretRef:name: db-secret
七、監控與日志
1. 部署 Prometheus + Grafana
安裝監控組件
kubectl create namespace monitoring
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/prometheus-operator-0servicemonitorCustomResourceDefinition.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/
訪問 Grafana
kubectl port-forward -n monitoring svc/grafana 3000:3000
訪問 http://localhost:3000
,使用默認賬號 admin/admin
。
2. 集中日志(EFK 棧)
部署 Elasticsearch、Fluentd、Kibana
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/
八、總結與最佳實踐
1. 核心原則
- 聲明式配置:所有資源通過 YAML 文件管理,納入版本控制。
- 資源限制:為 Pod 設置 CPU/內存請求與上限(
requests
/limits
)。 - 滾動更新策略:配置
maxUnavailable
和maxSurge
確保服務可用性。
2. 生產環境建議
- 集群高可用:多 Master 節點 + 負載均衡。
- 網絡策略:使用 Calico 或 Cilium 實現網絡隔離。
- 安全加固:啟用 RBAC、Pod 安全策略(PSP)。
通過掌握 Kubernetes 的核心原理與實踐技巧,您將能夠構建高效、穩定的容器化應用平臺,應對從開發到生產的全流程挑戰。
擴展閱讀:
- Kubernetes 官方文檔
- Kubernetes 網絡模型詳解
- 生產環境 Kubernetes 集群設計指南