返回文章列表

FluxCD Kubernetes 叢集管理

本涵蓋使用 FluxCD 管理 Kubernetes 叢集的完整流程,包含設定應用程式整合、管理 Secrets 和 ConfigMaps、設定監控和警示,以及進階功能介紹,讓您能透過 GitOps 最佳實踐,自動化佈署和管理應用程式。

Kubernetes DevOps

FluxCD 是一個根據 GitOps 理念的 Kubernetes 叢集管理工具,讓開發者能以 Git 儲存函式庫作為單一事實來源,自動化應用程式的佈署和管理。透過 Kubernetes 資訊清單(manifests)定義應用程式狀態,FluxCD 會監控儲存函式庫的變更,並自動將這些變更應用到叢集。本將逐步說明如何使用 FluxCD 佈署和管理應用程式,包含設定應用程式整合、管理敏感資料和組態、設定監控和警示,以及介紹 FluxCD 的一些進階功能,讓您能更有效率地管理 Kubernetes 叢集。

使用 FluxCD 管理 Kubernetes 叢集的完整

設定 FluxCD 與應用程式整合

要將應用程式與 FluxCD 整合,需要建立一個資料夾來存放應用程式的 Kubernetes 資訊清單(manifests)。假設我們將這個資料夾命名為 my-app

建立應用程式的 Kubernetes 資訊清單

my-app 資料夾中,建立一個名為 deployment.yaml 的檔案,內容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-container
        image: my-image:latest

將應用程式新增到 FluxCD 設定

在之前建立的 kustomization.yaml 檔案中,新增對 my-app 資料夾的參考:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- flux-system
- my-app

提交並推播變更

將變更提交到 Git 儲存函式庫並推播到遠端。FluxCD 將偵測到這些變更並將其應用到連線的 Kubernetes 叢集。

使用 FluxCD 管理 Secrets 和 ConfigMaps

建立新的資料夾存放應用程式的組態

在 Git 儲存函式庫中建立一個名為 config 的資料夾,用於存放 Secrets 和 ConfigMaps。

建立 ConfigMap YAML 檔案

config 資料夾中建立一個名為 configmap.yaml 的檔案,內容如下:

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  my-key: my-value
  another-key: another-value

建立 Secret YAML 檔案

如果需要管理敏感資料,可以在 config 資料夾中建立一個名為 secret.yaml 的檔案。由於敏感資料不能以明文儲存,因此需要使用 base64 編碼。可以使用以下命令進行編碼:

echo -n 'your-secret-value' | base64

範例 secret.yaml 檔案內容如下:

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: my-secret
data:
  secret-key: c2VjcmV0LXZhbHVl

建立 Kustomization 檔案

config 資料夾中建立一個名為 kustomization.yaml 的檔案,內容如下:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- configmap.yaml
- secret.yaml

如果沒有 Secrets 需要管理,可以移除 - secret.yaml 這一行。

更新主 Kustomization 檔案

在之前的 kustomization.yaml 檔案中,新增對 config 資料夾的參考:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- flux-system
- my-app
- config

在應用程式中使用 ConfigMaps 和 Secrets

在應用程式的 Kubernetes 資訊清單中,可以參照所建立的 ConfigMaps 和 Secrets。例如,在 Deployment 資訊清單中,可以將 ConfigMap 或 Secret 掛載為磁碟區或用作環境變數。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  template:
    spec:
      containers:
      - name: my-container
        image: my-image
        env:
        - name: MY_CONFIG_KEY
          valueFrom:
            configMapKeyRef:
              name: my-configmap
              key: my-key
        - name: MY_SECRET_KEY
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: secret-key
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
        - name: secret-volume
          mountPath: /etc/secret
      
      volumes:
      - name: config-volume
        configMap:
          name: my-configmap
      - name: secret-volume
        secret:
          secretName: my-secret

使用 FluxCD 設定監控和警示

安裝 Prometheus 和 Alertmanager

如果叢集中尚未安裝 Prometheus 和 Alertmanager,可以使用 kube-prometheus-stack Helm chart 進行安裝。

設定 Prometheus 以擷取 FluxCD 指標

FluxCD 元件(source-controller、kustomize-controller、helm-controller 和 notification-controller)會在 /metrics 端點上公開指標。需要建立一個 ServiceMonitor 資源,以告知 Prometheus 從這些元件中擷取指標。

建立一個名為 service-monitor.yaml 的檔案,內容如下:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: fluxcd
  namespace: flux-system
  labels:
    release: prometheus
spec:
  selector:
    matchLabels:
      app.kubernetes.io/part-of: flux
  endpoints:
  - port: http-metrics

圖表翻譯:

此圖示說明瞭使用 FluxCD 管理 Kubernetes 叢集的流程。首先,使用者將應用程式的 Kubernetes 資訊清單存放在 Git 儲存函式庫中。FluxCD 會監控儲存函式庫中的變更,並自動將變更應用到叢集。接著,使用者可以使用 FluxCD 管理 Secrets 和 ConfigMaps,將敏感資料和組態存放在 Git 儲存函式庫中。最後,使用者可以使用 Prometheus 和 Alertmanager 設定監控和警示,以監視叢集的健康狀態和效能。

詳細解說:

  1. 設定 FluxCD 與應用程式整合:將應用程式的 Kubernetes 資訊清單存放在 Git 儲存函式庫中,並設定 FluxCD 以監控儲存函式庫中的變更。
  2. 使用 FluxCD 管理 Secrets 和 ConfigMaps:將敏感資料和組態存放在 Git 儲存函式庫中,並使用 FluxCD 管理 Secrets 和 ConfigMaps。
  3. 在應用程式中使用 ConfigMaps 和 Secrets:在應用程式的 Kubernetes 資訊清單中參照所建立的 ConfigMaps 和 Secrets。
  4. 使用 FluxCD 設定監控和警示:使用 Prometheus 和 Alertmanager 設定監控和警示,以監視叢集的健康狀態和效能。

透過遵循這些步驟,您可以使用 FluxCD 管理 Kubernetes 叢集,並確保您的應用程式組態和敏感資料是版本控制、安全且易於管理的。

FluxCD 監控與警示設定

前言

在 Kubernetes 環境中使用 FluxCD 進行 GitOps 操作時,監控與警示機制至關重要。本篇文章將深入介紹如何設定 Prometheus 與 Alertmanager 來監控 FluxCD 的運作狀態,並根據自定義規則傳送警示通知。

組態 ServiceMonitor 資源

首先,需要建立一個 service-monitor.yaml 檔案,以定義 Prometheus 如何抓取 FluxCD 的指標資料。

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: fluxcd-servicemonitor
  namespace: flux-system
spec:
  selector:
    matchLabels:
      app.kubernetes.io/part-of: flux
  namespaceSelector:
    matchNames:
      - flux-system
  endpoints:
    - port: http-metrics
      interval: 30s

內容解密:

  • apiVersionkind 定義了該資源的型別為 ServiceMonitor,屬於 monitoring.coreos.com/v1 API 版本。
  • metadata 部分定義了該資源的名稱和名稱空間。
  • spec.selector.matchLabels 指定了需要監控的服務標籤,這裡匹配具有 app.kubernetes.io/part-of: flux 標籤的服務。
  • namespaceSelector.matchNames 指定了需要監控的名稱空間,這裡限定為 flux-system
  • endpoints 部分定義了抓取指標的埠和頻率,這裡指定每 30 秒從 http-metrics 埠抓取一次資料。

將該組態檔案應用到 Kubernetes 叢集中:

kubectl apply -f service-monitor.yaml

設定自定義警示規則

接下來,建立一個名為 flux-alerts.yaml 的檔案,用於定義根據 FluxCD 指標的警示規則。

apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: fluxcd-alerts
  namespace: flux-system
spec:
  groups:
    - name: FluxCD
      rules:
        - alert: FluxCDReconciliationFailure
          expr: rate(flux_reconcile_failure_count{namespace="flux-system"}[5m]) > 0
          for: 10m
          labels:
            severity: warning
          annotations:
            summary: "FluxCD reconciliation failure"
            description: "FluxCD has been failing to reconcile resources for the last 10 minutes."

內容解密:

  • apiVersionkind 定義了該資源的型別為 PrometheusRule,屬於 monitoring.coreos.com/v1 API 版本。
  • spec.groups 定義了一個名為 FluxCD 的規則組,其中包含一個名為 FluxCDReconciliationFailure 的警示規則。
  • expr 指定了觸發警示的 PromQL 表示式,這裡監控過去 5 分鐘內 flux_reconcile_failure_count 指標的變化率是否大於 0。
  • for 指定了警示觸發的持續時間,這裡設定為 10 分鐘。
  • labels.severity 定義了警示的嚴重級別,這裡設定為 warning
  • annotations.summaryannotations.description 提供了警示的摘要和詳細描述。

將該組態檔案應用到 Kubernetes 叢集中:

kubectl apply -f flux-alerts.yaml

組態 Alertmanager 傳送通知

為了讓 Alertmanager 傳送警示通知,需要編輯 Alertmanager 的組態檔案,通常位於一個 ConfigMap 或 Secret 中。具體組態方法請參考 Alertmanager 的官方檔案。

驗證監控與警示設定

  1. 存取 Prometheus Web UI: 使用埠轉發或 Ingress 資源暴露 Prometheus 服務,然後存取其 Web UI,檢查 FluxCD 相關指標是否被正確抓取。

    kubectl -n <PROMETHEUS_NAMESPACE> port-forward svc/prometheus-kube-prometheus-prometheus 9090:9090
    
  2. 驗證自定義警示: 在 Alertmanager Web UI 中檢查自定義警示是否被正確載入和評估。

    kubectl -n <PROMETHEUS_NAMESPACE> port-forward svc/prometheus-kube-prometheus-alertmanager 9093:9093
    

透過上述步驟,您可以成功設定 FluxCD 的監控與警示機制,從而及時發現並回應叢集中的問題,確保 Kubernetes 環境的穩定性和可靠性。

FluxCD 高階功能介紹

FluxCD 提供了一系列高階功能,以進一步自定義和增強 GitOps 工作流程。主要功能包括:

影像自動化更新

FluxCD 可以自動更新 Kubernetes 清單,當容器登入檔中出現新的容器映像時。這可以透過使用 ImageRepositoryImagePolicyImageUpdateAutomation 自定義資源來實作。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title FluxCD Kubernetes 叢集管理

package "Kubernetes Cluster" {
    package "Control Plane" {
        component [API Server] as api
        component [Controller Manager] as cm
        component [Scheduler] as sched
        database [etcd] as etcd
    }

    package "Worker Nodes" {
        component [Kubelet] as kubelet
        component [Kube-proxy] as proxy
        package "Pods" {
            component [Container 1] as c1
            component [Container 2] as c2
        }
    }
}

api --> etcd : 儲存狀態
api --> cm : 控制迴圈
api --> sched : 調度決策
api --> kubelet : 指令下達
kubelet --> c1
kubelet --> c2
proxy --> c1 : 網路代理
proxy --> c2

note right of api
  核心 API 入口
  所有操作經由此處
end note

@enduml

圖表翻譯: 此圖示展示了 FluxCD 影像自動化更新的工作流程。當容器登入檔中有新的映像時,ImageRepository 將檢測到這一變化,並根據 ImagePolicy 的定義觸發 ImageUpdateAutomation,後者負責更新 Git 儲存函式庫中的清單。

通知與事件轉發

FluxCD 的通知控制器可以向多種通路(如 Slack、Microsoft Teams、Discord 等)傳送通知,當特定事件發生時。您可以使用 AlertProvider 自定義資源組態通知控制器。此外,還可以使用 EventReceiver 自定義資源將事件轉發到外部系統,如 Elasticsearch、Sentry 或自定義 API。

多租戶支援

FluxCD 支援多租戶,允許您在單個 Kubernetes 叢集中管理多個租戶。每個租戶可以擁有自己的 Git 儲存函式庫、FluxCD 例項,並限制對特定名稱空間或叢集的存取。

健康檢查與依賴管理

FluxCD 可以在調解後對應用程式執行健康檢查。它使用 Kubernetes 的內建健康檢查(活躍度和就緒探針)來確定應用程式在更新後是否健康。此外,您還可以定義應用程式之間的依賴關係,確保它們按正確的順序更新。

垃圾收集

FluxCD 可以自動刪除不再存在於 Git 儲存函式庫中的 Kubernetes 資源。這一功能稱為垃圾收集,有助於保持叢集乾淨,防止孤立資源佔用資源並引起衝突。

Cluster API 支援

FluxCD 對 Cluster API(CAPI)提供了內建支援。使用這一整合,您可以使用 GitOps 管理 Kubernetes 叢集的生命週期,包括組態、擴充套件和升級。這使您能夠將叢集基礎設施視為程式碼,確保基礎設施是版本化、可稽核且易於還原的。

這些高階功能與 FluxCD 的核心功能相結合,提供了一個全面且靈活的 GitOps 解決方案,用於管理 Kubernetes 應用程式和基礎設施。透過利用這些功能,您可以進一步最佳化開發和佈署工作流程,增強安全性和合規性,並更好地將 FluxCD 與現有工具鏈整合。