Kubernetes 容器編排平台基礎概念

前言

隨著微服務架構的普及,容器化技術已成為現代軟體開發的標準配備。而 Kubernetes(簡稱 K8s)作為目前最主流的容器編排平台,能夠幫助我們自動化部署、擴展和管理容器化應用程式。本文將介紹 Kubernetes 的基礎概念,幫助你快速入門這個強大的平台。

Kubernetes 簡介

Kubernetes 最初由 Google 開發,於 2014 年開源,目前由 Cloud Native Computing Foundation(CNCF)維護。K8s 這個縮寫來自於 Kubernetes 這個單字中間有 8 個字母(ubernete)。

為什麼需要 Kubernetes?

在沒有容器編排平台之前,我們面臨以下挑戰:

  • 手動部署容器:需要人工在每台主機上啟動和停止容器
  • 缺乏自動擴展:無法根據負載自動增減容器數量
  • 服務發現困難:容器 IP 動態變化,難以追蹤服務位置
  • 故障恢復緩慢:容器故障時需要人工介入處理

Kubernetes 解決了這些問題,提供:

  • 自動化容器部署與管理
  • 服務發現與負載平衡
  • 自動擴展與自我修復
  • 滾動更新與回滾機制

核心元件

Kubernetes 叢集由 Control Plane(控制平面)和 Worker Node(工作節點)組成。以下介紹幾個關鍵元件:

API Server

API Server 是 Kubernetes 控制平面的前端,負責處理所有 REST API 請求。它是叢集中唯一直接與 etcd 溝通的元件。

主要功能:

  • 提供 RESTful API 介面
  • 驗證和授權請求
  • 處理叢集狀態的讀寫操作
1
2
# 透過 API Server 取得叢集資訊
kubectl cluster-info

etcd

etcd 是一個分散式鍵值儲存系統,用於儲存 Kubernetes 叢集的所有配置資料和狀態資訊。

特點:

  • 高可用性:支援多節點叢集部署
  • 一致性:使用 Raft 協定確保資料一致性
  • 安全性:支援 TLS 加密傳輸

etcd 儲存的資料包括:

  • 節點資訊
  • Pod 配置
  • 密鑰和配置映射
  • 服務帳號資訊

Scheduler

Scheduler 負責監控新建立且尚未分配節點的 Pod,並為其選擇最適合的節點運行。

排程考量因素:

  • 資源需求(CPU、記憶體)
  • 硬體/軟體/策略限制
  • 親和性與反親和性規則
  • 資料本地性
1
2
3
4
# 可透過 nodeSelector 指定節點
spec:
  nodeSelector:
    disktype: ssd

基本物件

Pod

Pod 是 Kubernetes 中最小的部署單位,代表叢集中運行的一個或多個容器的組合。

特點:

  • 同一 Pod 內的容器共享網路和儲存空間
  • Pod 內的容器可透過 localhost 互相通訊
  • Pod 是短暫的,可能隨時被終止和重新建立
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 基本 Pod 定義範例
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.24
    ports:
    - containerPort: 80

Node

Node 是 Kubernetes 叢集中的工作機器,可以是實體機或虛擬機。每個 Node 都包含運行 Pod 所需的服務。

Node 上運行的元件:

  • kubelet:負責管理 Pod 和容器的生命週期
  • kube-proxy:維護網路規則,實現服務的網路代理
  • Container Runtime:負責運行容器(如 containerd、CRI-O)
1
2
3
4
5
# 查看叢集節點
kubectl get nodes

# 查看節點詳細資訊
kubectl describe node <node-name>

Namespace

Namespace 提供了一種在叢集內隔離資源群組的機制,適合用於多團隊或多專案的環境。

預設的 Namespace:

  • default:沒有指定 Namespace 時的預設空間
  • kube-system:Kubernetes 系統元件使用的空間
  • kube-public:公開資源使用的空間
  • kube-node-lease:節點心跳資訊使用的空間
1
2
3
4
5
6
7
8
# 列出所有 Namespace
kubectl get namespaces

# 建立新的 Namespace
kubectl create namespace development

# 在特定 Namespace 中操作
kubectl get pods -n kube-system

kubectl 基本指令

kubectl 是 Kubernetes 的命令列工具,用於與叢集互動。以下是一些常用指令:

資源查詢

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 取得所有 Pod
kubectl get pods

# 取得所有資源(Pod、Service、Deployment 等)
kubectl get all

# 以 YAML 格式輸出 Pod 資訊
kubectl get pod <pod-name> -o yaml

# 監控 Pod 狀態變化
kubectl get pods -w

資源建立與刪除

1
2
3
4
5
6
7
8
9
# 使用 YAML 檔案建立資源
kubectl apply -f deployment.yaml

# 建立資源(不可重複執行)
kubectl create -f pod.yaml

# 刪除資源
kubectl delete pod <pod-name>
kubectl delete -f deployment.yaml

除錯與診斷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 查看 Pod 詳細資訊
kubectl describe pod <pod-name>

# 查看 Pod 日誌
kubectl logs <pod-name>

# 即時追蹤日誌
kubectl logs -f <pod-name>

# 進入 Pod 容器執行指令
kubectl exec -it <pod-name> -- /bin/bash

資源編輯與擴展

1
2
3
4
5
6
7
8
# 直接編輯資源配置
kubectl edit deployment <deployment-name>

# 擴展 Deployment 副本數
kubectl scale deployment <deployment-name> --replicas=3

# 查看部署狀態
kubectl rollout status deployment <deployment-name>

總結

本文介紹了 Kubernetes 的基礎概念,包括:

  1. Kubernetes 簡介:了解為什麼需要容器編排平台
  2. 核心元件:API Server、etcd、Scheduler 的角色與功能
  3. 基本物件:Pod、Node、Namespace 的概念與使用
  4. kubectl 指令:常用的命令列操作

這些只是 Kubernetes 的入門知識,實際上 K8s 還有許多進階功能,如 Deployment、Service、Ingress、ConfigMap、Secret 等,都值得深入學習。建議可以透過官方文件和實際操作來加深理解。

參考資源

comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy