概念解析
Kubernetes(簡稱K8s)是一個開源的容器編排平台,用於自動化部署、擴展和管理容器化應用程序。它由Google開發並於2014年開源,現在由Cloud Native Computing Foundation(CNCF)維護。
核心概念
- 集羣(Cluster):K8s的計算資源池,包含至少一個主節點和多個工作節點。
- 節點(Node):集羣中的工作機器,可以是物理機或虛擬機。
- Pod:K8s中最小的部署單元,包含一個或多個容器。
- 服務(Service):為一組Pod提供穩定的網絡端點。
- 控制器(Controller):管理Pod的生命週期,如Deployment、ReplicaSet等。
- 命名空間(Namespace):將集羣資源劃分為多個虛擬集羣。
核心特性
- 服務發現和負載均衡:自動為服務分配IP地址和DNS名稱,並在多個Pod間負載均衡流量。
- 存儲編排:自動掛載存儲系統,無論是本地存儲還是雲存儲。
- 自動擴縮容:根據CPU使用率或其他指標自動調整應用程序實例數量。
- 自我修復:自動重啓失敗的容器,替換和重新調度不健康的節點上的Pod。
- 密鑰和配置管理:無需重新構建鏡像即可部署和更新密鑰和應用程序配置。
- 批處理執行:除了服務,還支持批處理和CI工作負載。
實踐教程
安裝kubectl
kubectl是K8s的命令行工具,用於與集羣交互。
# 下載kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
# 安裝kubectl
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
# 驗證安裝
kubectl version --client
創建Minikube集羣
Minikube是在本地運行K8s的理想選擇。
# 安裝Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
# 啓動集羣
minikube start
# 查看集羣狀態
kubectl cluster-info
部署第一個應用
# 創建一個簡單的Nginx部署
kubectl create deployment nginx --image=nginx:1.14.2
# 查看部署狀態
kubectl get deployments
# 暴露服務
kubectl expose deployment nginx --port=80 --type=NodePort
# 獲取服務URL
minikube service nginx --url
真實案例
案例:電商網站微服務部署
某電商平台採用微服務架構,包含用户服務、商品服務、訂單服務等多個服務。使用K8s進行部署的優勢:
- 獨立部署:每個服務可以獨立部署和升級,不影響其他服務。
- 彈性伸縮:根據流量動態調整各服務實例數。
- 故障隔離:某個服務故障不會影響整個系統。
- 資源優化:根據各服務需求分配資源。
部署架構:
Internet -> LoadBalancer -> Ingress Controller -> Services -> Pods
配置詳解
Pod配置示例
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
Deployment配置示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
故障排除
常見問題及解決方案
-
Pod處於CrashLoopBackOff狀態
# 查看Pod詳細信息 kubectl describe pod <pod-name> # 查看Pod日誌 kubectl logs <pod-name> --previous -
服務無法訪問
# 檢查服務配置 kubectl get svc <service-name> -o yaml # 檢查Endpoints kubectl get endpoints <service-name> -
節點NotReady狀態
# 檢查節點狀態 kubectl describe node <node-name> # 檢查kubelet日誌 journalctl -u kubelet
最佳實踐
- 使用標籤和選擇器:為資源添加有意義的標籤,便於管理和選擇。
- 健康檢查:配置liveness和readiness探針確保應用健康。
- 資源限制:為容器設置requests和limits,防止資源爭搶。
- 命名空間隔離:使用命名空間隔離不同環境或團隊的應用。
- 配置管理:使用ConfigMap和Secret管理配置和敏感信息。
- 版本控制:將所有K8s資源配置保存在版本控制系統中。
安全考慮
- RBAC權限控制:使用Role-Based Access Control限制用户和服務賬户權限。
- 網絡安全策略:使用Network Policies限制Pod間的網絡通信。
- 鏡像安全:只使用可信的鏡像源,定期掃描漏洞。
- 密鑰管理:使用Secret存儲敏感信息,避免硬編碼。
- 審計日誌:啓用審計日誌記錄關鍵操作。
命令速查
| 命令 | 描述 |
|---|---|
kubectl get nodes |
查看集羣節點 |
kubectl get pods |
查看Pod |
kubectl get services |
查看服務 |
kubectl get deployments |
查看部署 |
kubectl describe pod <name> |
查看Pod詳細信息 |
kubectl logs <pod-name> |
查看Pod日誌 |
kubectl exec -it <pod-name> -- sh |
進入Pod執行命令 |
kubectl apply -f <file.yaml> |
應用配置文件 |
kubectl delete -f <file.yaml> |
刪除配置文件定義的資源 |
kubectl scale deployment <name> --replicas=<num> |
擴縮容部署 |
總結
Kubernetes作為容器編排的事實標準,提供了強大的容器管理能力。理解其核心概念和架構是掌握K8s的基礎。通過本文檔的學習,你應該能夠:
- 理解K8s的核心概念和架構組件
- 使用kubectl與集羣交互
- 部署簡單的應用到K8s集羣
- 排查常見的K8s問題
- 遵循K8s最佳實踐
在後續文檔中,我們將深入學習Pod管理、Deployment控制器、服務發現等更高級的主題。