在 Kubernetes 環境中,容器的 ephemeral 特性使得資料持久化成為應用程式佈署的關鍵考量。尤其在 EKS 叢集上,選擇合適的儲存方案至關重要。本文將探討如何利用 Amazon EFS 在 EKS 叢集中實作穩健的資料持久化,確保應用程式在容器重啟或遷移時資料不遺失。首先,我們會簡要介紹 Kubernetes 的儲存卷機制,並示範在沒有持久化儲存的情況下資料如何在 Pod 重啟後遺失。接著,我們會說明如何在本機 microk8s 叢集中使用 Persistent Volume 和 Persistent Volume Claim 來管理持久化儲存。最後,我們將重點放在 EKS 環境中,逐步講解如何使用 EFS 建立持久化儲存,並將其掛載到 nginx 容器,讓應用程式能夠穩定地存取資料。


title: “Kubernetes Ingress LoadBalancer 技術應用” date: 2025-06-16T00:00:00+08:00 author: “玄貓(BlackCat)” categories: [“雲端原生”,“Kubernetes”] tags: [“Ingress”, “LoadBalancer”, “Kubernetes”, “microk8s”, “EKS”, “網路”, “K9s”, “Helm”] draft: false math: true summary: “本文探討 Kubernetes 的 Ingress 和 LoadBalancer,說明如何有效管理外部流量並提升應用程式可用性。文章首先解釋為何需要 Ingress 和 LoadBalancer,並點出 NodePort 的侷限性。接著,文章闡述 Ingress 的優勢,例如路徑基礎路由、SSL/TLS 終止和負載平衡。文章也提供在 microk8s 和 AWS EKS 中設定 Ingress 的方法,包含啟用 Ingress 外掛和佈署 Ingress Controller。此外,文章還介紹了 K9s、Open Lens 和 Helm 等 Kubernetes 管理工具,並深入解析 Kubernetes 網路模型、Ingress 和 LoadBalancer 的工作原理,以及網路效能最佳化策略。”

Kubernetes 應用程式佈署中,外部流量的管理和服務的暴露至關重要。本文將探討 Ingress 和 LoadBalancer 的應用,說明如何有效地將外部流量導向叢集內部的服務。首先,我們會解釋為何需要 Ingress 和 LoadBalancer,並比較 NodePort 的不足之處。接著,我們會介紹 Ingress 的優勢以及如何在 microk8s 和 AWS EKS 環境中設定 Ingress。此外,本文也會介紹一些常用的 Kubernetes 管理工具,例如 K9s、Open Lens 和 Helm,幫助讀者更有效率地管理叢集。最後,我們會深入解析 Kubernetes 網路模型,以及 Ingress 和 LoadBalancer 的運作機制,並提供網路效能最佳化建議。

在AWS EKS上實作資料持久化

在現代雲端應用中,資料持久化是至關重要的議題。容器化的應用通常需要能夠跨容器重啟、升級和遷移而保持資料的一致性。Kubernetes 提供了多種儲存方案來滿足這些需求,而在AWS EKS環境下,我們可以利用Amazon EFS(Elastic File System)來實作高效的資料持久化。

Kubernetes中的儲存卷

Kubernetes中的儲存卷(Volumes)是一種抽象概念,用於提供容器持久化資料儲存的機制。預設情況下,容器內的資料是暫時性的,當容器重啟或終止時,資料就會遺失。透過使用儲存卷,我們可以將資料儲存在容器的外部,從而實作資料的持久化儲存。

展示Pod內資料缺乏永續性

首先,我們來展示在沒有持久化儲存的情況下,Pod內的資料是如何遺失的。我們可以建立一個簡單的Pod,並在其中寫入一些資料,然後刪除該Pod,再重新建立一個新的Pod,觀察資料是否仍然存在。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
  - name: test-container
    image: nginx
    volumeMounts:
    - name: test-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: test-volume
    emptyDir: {}
# 建立Pod
kubectl apply -f test-pod.yaml

# 進入Pod並寫入資料
kubectl exec -it test-pod -- /bin/bash
echo "Hello, Kubernetes!" > /usr/share/nginx/html/index.html
exit

# 驗證資料
kubectl exec -it test-pod -- cat /usr/share/nginx/html/index.html

# 刪除Pod
kubectl delete pod test-pod

# 重新建立Pod
kubectl apply -f test-pod.yaml

# 再次驗證資料
kubectl exec -it test-pod -- cat /usr/share/nginx/html/index.html

內容解密:

  1. 我們首先建立了一個名為test-pod的Pod,並在其中掛載了一個emptyDir型別的Volume。
  2. 進入Pod後,我們在掛載的目錄中寫入了一個index.html檔案。
  3. 刪除Pod後重新建立,我們發現之前寫入的資料已經遺失。

Persistent Volumes在microk8s Kubernetes叢集中的應用

在本地的microk8s叢集中,我們可以使用Persistent Volumes(PV)和Persistent Volume Claims(PVC)來實作資料的持久化儲存。

建立PV

首先,我們需要建立一個PV。PV是一種叢集範圍的資源,它代表了一塊可用的儲存資源。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: local-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /mnt/data
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - <your-node-name>
建立PVC

接下來,我們需要建立一個PVC,用於請求特定的儲存資源。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: local-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: local-storage

內容解密:

  1. 我們建立了一個名為local-pv的PV,容量為1Gi,並指定了本地儲存路徑/mnt/data
  2. 建立了一個名為local-pvc的PVC,請求1Gi的儲存空間。
  3. 透過storageClassName欄位,我們將PV和PVC進行了繫結。

在AWS EKS中使用EFS實作資料持久化

在AWS EKS環境中,我們可以使用Amazon EFS來實作跨多個可用區的資料持久化儲存。

建立EFS檔案系統

首先,我們需要在AWS管理主控台中建立一個EFS檔案系統。

  1. 登入AWS管理主控台,導航至EFS服務。
  2. 點選「建立檔案系統」,並選擇適當的VPC和安全組。
  3. 記錄下建立的EFS檔案系統ID。

在EKS叢集中掛載EFS

接下來,我們需要在EKS叢集中建立一個StorageClass、PV和PVC,以便掛載EFS檔案系統。

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: efs-sc
provisioner: efs.csi.aws.com
apiVersion: v1
kind: PersistentVolume
metadata:
  name: efs-pv
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: efs-sc
  csi:
    driver: efs.csi.aws.com
    volumeHandle: <your-efs-id>
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: efs-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: efs-sc

內容解密:

  1. 我們建立了一個名為efs-sc的StorageClass,使用EFS CSI驅動程式。
  2. 建立了一個名為efs-pv的PV,並指定了EFS檔案系統ID。
  3. 建立了一個名為efs-pvc的PVC,用於請求EFS儲存資源。

使用EFS服務nginx內容

最後,我們可以使用EFS來服務nginx內容。建立一個Pod,並將EFS掛載到nginx的內容目錄。

apiVersion: v1
kind: Pod
metadata:
  name: nginx-efs
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: efs-volume
      mountPath: /usr/share/nginx/html
  volumes:
  - name: efs-volume
    persistentVolumeClaim:
      claimName: efs-pvc

內容解密:

  1. 我們建立了一個名為nginx-efs的Pod,並將EFS PVC掛載到nginx的內容目錄。
  2. 透過這種方式,我們可以實作跨多個Pod和可用區的資料分享。

EFS在EKS中的架構圖

  graph LR
    A[EKS 叢集] -->|包含|> B[Pod]
    B -->|使用|> C[EFS PVC]
    C -->|繫結|> D[EFS PV]
    D -->|掛載|> E[EFS 檔案系統]
    E -->|跨區儲存|> F[多個可用區]

圖表翻譯: 此圖示展示了在EKS叢集中,Pod如何透過EFS PVC使用EFS檔案系統,實作跨多個可用區的資料持久化儲存。

Kubernetes 網路與存取控制:Ingress 與 LoadBalancer 的應用

隨著容器化技術的發展,Kubernetes 已成為企業佈署應用程式的主要選擇。在 Kubernetes 中,如何讓外部流量順暢地存取叢集內的服務,是一個至關重要的議題。本篇文章將探討 Kubernetes 的網路架構,特別是 Ingress 與 LoadBalancer 的應用。

為什麼需要 Ingress 與 LoadBalancer?

在 Kubernetes 中,Pod 是應用程式的基本執行單元。然而,Pod 的 IP 位址是動態的,且可能會因為各種原因(如重啟或擴充套件)而改變。因此,我們需要一種機制來穩定地對外暴露服務。傳統的做法是使用 NodePortLoadBalancer 型別的 Service,但這些方法都有其侷限性。

使用 NodePort 的問題

NodePort 是 Kubernetes 提供的一種簡單的服務暴露方式。它會在每個節點上開啟一個特定的連線埠,將流量轉發到對應的 Pod。然而,這種方法有以下問題:

  1. 連線埠衝突:多個服務可能會爭用相同的連線埠,導致衝突。
  2. 安全性問題:直接暴露節點的連線埠可能會增加安全風險。
  3. 難以管理:當服務數量龐大時,管理 NodePort 成為一件困難的事。
apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  type: NodePort
  selector:
    app: example
  ports:
  - name: http
    port: 80
    targetPort: 8080
    nodePort: 30007
    protocol: TCP

內容解密:

此 YAML 組態定義了一個名為 example-service 的 Service,使用 NodePort 型別。它將連線埠 30007 對應到 Pod 的 8080 連線埠,實作外部存取。

Ingress:更靈活的流量管理

Ingress 是 Kubernetes 提供的一種更靈活的流量管理資源。它允許我們定義根據 HTTP/HTTPS 的路由規則,將外部請求導向叢集內的正確服務。

Ingress 的優勢

  1. 路徑基礎的路由:可以根據 URL 路徑將請求路由到不同的服務。
  2. SSL/TLS 終止:支援 HTTPS,提供安全的連線。
  3. 負載平衡:內建負載平衡功能,提升應用程式的可用性。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              number: 80

內容解密:

此 Ingress 組態定義了一個名為 example-ingress 的資源,將 example.com 的根路徑 / 的請求轉發到 example-service80 連線埠。

在 microk8s 中啟用 Ingress

在 microk8s 中啟用 Ingress 非常簡單,只需執行以下命令:

microk8s enable ingress

內容解密:

此命令啟用了 microk8s 的 Ingress 外掛,允許我們建立 Ingress 資源來管理外部流量。

在 AWS EKS 中佈署 Ingress Controller

在 AWS EKS 中,我們需要佈署一個 Ingress Controller(如 AWS ALB Controller)來管理 Ingress 資源。以下是佈署步驟:

  1. 安裝 AWS Load Balancer Controller:使用 Helm Chart 安裝。
  2. 建立 Ingress 資源:定義 Ingress YAML 檔案,指定 ALB 組態。
helm install aws-load-balancer-controller eks/aws-load-balancer-controller --set clusterName=<CLUSTER_NAME> --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller

內容解密:

此命令使用 Helm 安裝 AWS Load Balancer Controller,指定叢集名稱並使用預先建立的 ServiceAccount。

Kubernetes 工具:提升管理效率

除了 Ingress,Kubernetes 還有許多工具可以提升我們的管理效率。以下是一些常用的工具:

K9S

K9S 是一個根據終端的 Kubernetes 管理工具,提供了一個直觀的介面來管理叢集資源。

kubectl k9s

內容解密:

此命令啟動 K9S,提供了一個互動式的介面來管理 Kubernetes 資源。

Open Lens

Open Lens 是另一個 Kubernetes 管理工具,提供了一個圖形化的介面,方便我們監控和管理叢集。

HELM

HELM 是 Kubernetes 的套件管理器,簡化了應用程式的佈署和管理。

helm install postgresql bitnami/postgresql

內容解密:

此命令使用 Helm 安裝 PostgreSQL 資料函式庫,簡化了佈署過程。

CNCF 與 Kubernetes 生態系統

Kubernetes 是 Cloud Native Computing Foundation(CNCF)的重要專案之一。CNCF 促進了雲原生技術的發展,提供了豐富的資源和工具來支援 Kubernetes 生態系統。

更多工具

除了上述工具,還有許多其他工具可以幫助我們更好地管理 Kubernetes 叢集,例如:

  1. Prometheus:監控叢集資源的使用情況。
  2. Grafana:視覺化監控資料,提供直觀的儀錶板。
  3. Istio:服務網格,提供流量管理、安全性和可觀察性。

Kubernetes 網路架構深入解析

Kubernetes 的網路架構是其核心功能之一。本章將探討 Kubernetes 的網路模型、Ingress 與 LoadBalancer 的工作原理,以及如何最佳化網路效能。

Kubernetes 網路模型

Kubernetes 的網路模型根據以下原則:

  1. 每個 Pod 都有唯一的 IP 位址
  2. Pod 之間可以直接通訊,無需 NAT
  3. 服務(Service)提供了一種抽象,允許我們存取 Pod

Ingress 與 LoadBalancer 的工作原理

Ingress 與 LoadBalancer 是 Kubernetes 中兩種重要的網路資源。它們的工作原理如下:

  1. Ingress:Ingress 控制器根據 Ingress 資源的定義,將外部請求路由到正確的服務。
  2. LoadBalancer:LoadBalancer 型別的服務會建立一個外部負載平衡器,將流量分發到後端的 Pod。

最佳化網路效能

最佳化 Kubernetes 網路效能可以從以下幾個方面入手:

  1. 選擇合適的網路外掛:如 Calico、Flannel 等。
  2. 組態 Ingress 控制器:調整 Ingress 控制器的引數,最佳化流量管理。
  3. 使用負載平衡器:合理組態 LoadBalancer,提升流量分發效率。

隨著 Kubernetes 的不斷發展,網路架構也在不斷演進。未來,我們可以期待更多創新性的網路解決方案,提升 Kubernetes 的效能和可用性。

總字數:6,012字

參考資料

  1. Kubernetes 官方檔案:https://kubernetes.io/docs/
  2. AWS EKS 檔案:https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html
  3. CNCF 官方網站:https://www.cncf.io/

圖表翻譯:

  graph LR
    A[外部請求] -->|HTTP/HTTPS| B[Ingress 控制器]
    B -->|路由規則| C[服務]
    C -->|負載平衡| D[Pod]
    D -->|處理請求| E[應用程式]

此圖表展示了外部請求如何透過 Ingress 控制器被路由到正確的服務,並最終由 Pod 處理。

圖表翻譯: 此圖表描述了 Kubernetes 中外部請求的處理流程,從 Ingress 控制器到最終的 Pod 處理請求,展現了 Kubernetes 網路架構的工作原理。