概念解析

Kubernetes(簡稱K8s)是一個開源的容器編排平台,用於自動化部署、擴展和管理容器化應用程序。它由Google開發並於2014年開源,現在由Cloud Native Computing Foundation(CNCF)維護。

核心概念

  1. 集羣(Cluster):K8s的計算資源池,包含至少一個主節點和多個工作節點。
  2. 節點(Node):集羣中的工作機器,可以是物理機或虛擬機。
  3. Pod:K8s中最小的部署單元,包含一個或多個容器。
  4. 服務(Service):為一組Pod提供穩定的網絡端點。
  5. 控制器(Controller):管理Pod的生命週期,如Deployment、ReplicaSet等。
  6. 命名空間(Namespace):將集羣資源劃分為多個虛擬集羣。

核心特性

  1. 服務發現和負載均衡:自動為服務分配IP地址和DNS名稱,並在多個Pod間負載均衡流量。
  2. 存儲編排:自動掛載存儲系統,無論是本地存儲還是雲存儲。
  3. 自動擴縮容:根據CPU使用率或其他指標自動調整應用程序實例數量。
  4. 自我修復:自動重啓失敗的容器,替換和重新調度不健康的節點上的Pod。
  5. 密鑰和配置管理:無需重新構建鏡像即可部署和更新密鑰和應用程序配置。
  6. 批處理執行:除了服務,還支持批處理和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進行部署的優勢:

  1. 獨立部署:每個服務可以獨立部署和升級,不影響其他服務。
  2. 彈性伸縮:根據流量動態調整各服務實例數。
  3. 故障隔離:某個服務故障不會影響整個系統。
  4. 資源優化:根據各服務需求分配資源。

部署架構:

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

故障排除

常見問題及解決方案

  1. Pod處於CrashLoopBackOff狀態

    # 查看Pod詳細信息
    kubectl describe pod <pod-name>
    
    # 查看Pod日誌
    kubectl logs <pod-name> --previous
    
  2. 服務無法訪問

    # 檢查服務配置
    kubectl get svc <service-name> -o yaml
    
    # 檢查Endpoints
    kubectl get endpoints <service-name>
    
  3. 節點NotReady狀態

    # 檢查節點狀態
    kubectl describe node <node-name>
    
    # 檢查kubelet日誌
    journalctl -u kubelet
    

最佳實踐

  1. 使用標籤和選擇器:為資源添加有意義的標籤,便於管理和選擇。
  2. 健康檢查:配置liveness和readiness探針確保應用健康。
  3. 資源限制:為容器設置requests和limits,防止資源爭搶。
  4. 命名空間隔離:使用命名空間隔離不同環境或團隊的應用。
  5. 配置管理:使用ConfigMap和Secret管理配置和敏感信息。
  6. 版本控制:將所有K8s資源配置保存在版本控制系統中。

安全考慮

  1. RBAC權限控制:使用Role-Based Access Control限制用户和服務賬户權限。
  2. 網絡安全策略:使用Network Policies限制Pod間的網絡通信。
  3. 鏡像安全:只使用可信的鏡像源,定期掃描漏洞。
  4. 密鑰管理:使用Secret存儲敏感信息,避免硬編碼。
  5. 審計日誌:啓用審計日誌記錄關鍵操作。

命令速查

命令 描述
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控制器、服務發現等更高級的主題。