在多雲架構下管理 Kubernetes 叢集日益普及,持續交付成為確保應用程式一致性、提高交付速度和可靠性的關鍵。FluxCD 作為專為 Kubernetes 設計的 GitOps 工具,提供自動化佈署流程、版本控制和可觀察性等功能,有效簡化多雲環境下的應用程式佈署和管理。本文將探討 FluxCD 的核心概念、GitOps 工作流程以及如何在多雲環境中實際操作,協助團隊建構穩固的持續交付流程。

FluxCD:多雲Kubernetes的持續交付工具

在多雲Kubernetes環境中,持續交付(Continuous Delivery, CD)是一項至關重要的軟體開發實踐,能夠讓團隊快速、可靠且自動地發布軟體變更。FluxCD作為一個專為Kubernetes設計的開源持續交付工具,已經演變成支援多雲環境佈署的強大工具。

多雲Kubernetes環境中的持續交付重要性

在多雲Kubernetes環境中,持續交付的重要性體現在以下幾個方面:

  • 一致性:確保應用程式在不同雲端和本地環境中的一致性,降低不一致性和意外行為的風險。
  • 速度和敏捷性:使開發團隊能夠更快地將變更推播到生產環境,縮短交付新功能、修復錯誤和回應客戶需求的時間。
  • 自動化:自動化佈署過程,減少人為干預,降低錯誤風險,提高佈署的可靠性和穩定性。
  • 可擴充套件性:支援可擴充套件的佈署過程,確保新服務能夠無縫新增。
  • 增強協作:促進開發和維運團隊之間的協作,改善溝通,加快問題解決,提高整體軟體品質。

FluxCD的演進

FluxCD經歷了多次演進,以滿足多雲Kubernetes環境中的佈署挑戰:

Flux v1

Flux v1提供了根據GitOps的方法來管理Kubernetes資源,允許團隊在Git儲存函式庫中定義所需的狀態,Flux會自動將叢集狀態與倉函式庫同步。

Helm Operator

為了支援Helm(Kubernetes的包管理器),Flux引入了Helm Operator,允許使用者直接從Git儲存函式倉管理Helm發行版。

Flux v2

Flux v2對專案進行了全面重寫,引入了更模組化的架構、自定義資源支援、改進的效能和更好的可觀察性。同時,Flux v2也支援多租戶和其他進階GitOps功能。

Flux和Flagger

Flagger是一個進步式交付工具,與FluxCD整合,提供金絲雀發布、A/B測試和藍綠佈署等進階佈署策略。

GitOps原則和工作流程

GitOps結合了Git、基礎設施即程式碼(IaC)和持續交付(CD)來管理和佈署應用程式和基礎設施。以下是GitOps的核心原則:

  • 宣告式組態:使用人類可讀的格式(如YAML或JSON)定義系統的所需狀態。
  • 版本控制:利用Git作為管理系統所需狀態的單一真相來源。
  • 自動收斂:使用自動化工具使系統的實際狀態與Git中定義的所需狀態保持一致。
  • 可觀察性和驗證:確保系統狀態的可觀察性,並驗證變更的有效性。

宣告式組態管理

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: example-app
  template:
    metadata:
      labels:
        app: example-app
    spec:
      containers:
      - name: example-app
        image: example-app:latest
        ports:
        - containerPort: 80

內容解密:

此YAML檔案定義了一個名為example-app的Deployment資源。它指定了3個副本,使用example-app:latest映像,並暴露了80埠。此組態確保了應用程式的所需狀態被明確定義,並且可以被版本控制系統追蹤。

圖表說明

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表說明

rectangle "Push Changes" as node1
rectangle "Apply Changes" as node2
rectangle "Monitor State" as node3
rectangle "Feedback" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

圖表翻譯:

此圖展示了GitOps工作流程。開發人員將變更推播到Git儲存函式庫(A),FluxCD(B)監控這些變更並將其應用到Kubernetes叢集(C)。叢集的狀態被可觀察性工具(D)監控,並將反饋提供給FluxCD,以確保系統的實際狀態與所需狀態保持一致。

GitOps 工作流程與 FluxCD 安裝組態

GitOps 是一種強大的方法,用於管理和佈署雲原生環境中的應用程式和基礎設施。透過利用宣告式組態、Git 作為唯一的真實來源,以及自動化使系統的實際狀態與期望狀態保持一致,GitOps 工作流程提供了更高的穩定性、可追溯性和可靠性。

GitOps 工作流程

定義期望狀態

首先,使用宣告式組態檔案定義系統的期望狀態。這些檔案通常包括 Kubernetes 清單、Helm 圖表或其他基礎設施即程式碼(IaC)工具,如 Terraform 或 CloudFormation 範本。這些組態檔案儲存在 Git 倉函式庫中,作為系統期望狀態的唯一真實來源。

實施變更

當需要對系統進行變更時,例如佈署新版本的應用程式或修改基礎設施設定,開發人員會在本地 Git 工作副本中更新組態檔案。然後,他們將這些變更提交並推播到遠端 Git 倉函式庫。

提取請求和程式碼審查

在將變更合併到主分支之前,會建立提取請求以啟用同行審查,並確保提議的變更符合團隊的品質標準。這一步驟有助於在流程早期捕捉潛在問題,並促進團隊成員之間的協作。

合併和持續整合(CI)

一旦變更獲得批准,就會將其合併到主分支。此時,會觸發持續整合(CI)管道來構建、測試和驗證更新的組態檔案。這有助於確保變更不會引入任何錯誤、安全漏洞或其他可能對系統產生負面影響的問題。

持續交付(CD)和收斂

在變更透過 CI 檢查後,持續交付(CD)過程開始。在 GitOps 工作流程中,這通常涉及一個 Kubernetes 運算子或控制器,它監視 Git 倉函式庫中的變更。當它檢測到主分支的更新時,它會自動將變更應用於系統,確保實際狀態與 Git 中定義的期望狀態保持一致。這一步驟還可能涉及額外的驗證,例如監控已佈署應用程式或基礎設施元件的健康狀況。

監控和可觀察性

佈署變更後,系統的實際狀態會持續被監控,並與 Git 中的期望狀態進行比較。GitOps 工具通常包括內建的可觀察性功能,例如日誌記錄、指標和跟蹤,以提供對系統效能和行為的洞察。如果檢測到實際狀態和期望狀態之間的任何差異,GitOps 工具會提醒團隊,並可能自動啟動糾正措施,以使系統還原到期望狀態。

回復和還原

GitOps 的關鍵優勢之一是能夠在出現問題或故障時輕鬆回復變更。由於所有變更都在 Git 中進行版本控制,回復到先前的狀態就像還原到較早的提交,並允許 GitOps 工具自動將系統收斂到該狀態一樣簡單。這有助於最小化停機時間,並確保從事件中快速還原。

安全性和合規性

GitOps 工作流程透過提供對系統所做的所有變更的清晰稽核跟蹤,實作了更好的安全性和合規性。這使得跟蹤誰做了變更、何時做的變更以及為什麼做變更變得更加容易。此外,GitOps 工具通常與現有的安全性和合規性工具(如策略引擎或漏洞掃描器)整合,以確保佈署的組態符合組織的安全性和合規性要求。

縮放和多租戶

GitOps 的設計旨在隨著現代雲原生應用程式和基礎設施的複雜性而擴充套件。隨著服務、環境和團隊數量的增長,GitOps 工作流程可以適應支援多租戶,並確保每個團隊可以獨立管理其自己的組態,同時保持一致和統一的方法來管理系統的期望狀態。

安裝和組態 FluxCD

安裝 Flux CLI

第一步是在本地機器上安裝 Flux 命令列介面(CLI)。您可以從 FluxCD GitHub 倉函式庫下載最新版本的 CLI。要安裝 Flux CLI,請按照 https://fluxcd.io/install/ 上針對您的作業系統的說明進行操作。

設定 Git 倉函式庫

FluxCD 使用 Git 倉函式庫儲存您的 Kubernetes 清單、Helm 圖表或其他基礎設施組態檔案。對於多雲 Kubernetes,您可以選擇為每個雲提供商設定單獨的 Git 倉函式庫,或使用單個倉函式庫中的目錄組織您的清單。

# 為每個叢集或環境建立一個 Git 倉函式庫
git init my-cluster-config
cd my-cluster-config
# 新增您的組態檔案
git add .
git commit -m "Initial commit"
git remote add origin https://github.com/your-username/my-cluster-config.git
git push -u origin master

與 Kubernetes 叢集進行身份驗證

要將 FluxCD 佈署到您的多雲 Kubernetes 叢集,您需要與每個叢集進行身份驗證。使用您的 Kubernetes 組態檔案(通常位於 ~/.kube/config)中每個叢集的適當憑據和上下文。您可以使用 kubectl config use-context 在叢集上下文之間切換。

# 切換到目標叢集上下文
kubectl config use-context your-cluster-context

在多雲 Kubernetes 叢集上安裝 FluxCD

安裝 Flux CLI 並設定您的倉函式庫後,您現在可以在每個 Kubernetes 叢集上安裝 FluxCD。要執行此操作,請執行:

# 為目標叢集安裝 FluxCD
flux bootstrap github --owner=your-username --repository=my-cluster-config --branch=master --path=clusters/my-cluster

詳細組態與管理

在安裝 FluxCD 之後,您需要根據您的具體需求進行詳細組態和管理,包括但不限於設定同步間隔、管理 Kustomization 和 HelmRelease 物件等。

# 示例:Kustomization 組態檔案
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: my-app
  namespace: flux-system
spec:
  interval: 10m0s
  path: "./my-app"
  prune: true
  sourceRef:
    kind: GitRepository
    name: my-cluster-config

在多雲環境中安裝和組態FluxCD

在多雲Kubernetes環境中,FluxCD提供了一個強大的工具來實作持續交付和GitOps工作流程。本文將指導您如何在多個Kubernetes叢集上安裝和組態FluxCD,以實作自動化的組態同步和佈署管理。

準備Git儲存函式庫

首先,為每個Kubernetes叢集建立一個Git儲存函式庫,用於儲存叢集特定的組態檔案。您可以使用單獨的倉函式庫或在單一倉函式庫中使用不同的子目錄來組織組態檔案。

安裝FluxCD

要在每個叢集上安裝FluxCD,請使用以下命令,將<YOUR-GIT-REPOSITORY>替換為相應Git儲存函式庫的URL:

flux bootstrap git --url <YOUR-GIT-REPOSITORY> --path=<PATH-TO-CLUSTER-CONFIGURATION> [--token-auth] [--network-policy] [--private] [--version=<VERSION>]

確保在執行此命令之前切換到適當的叢集上下文。--path標誌是可選的,用於指定倉函式庫中包含叢集特定組態檔案的子目錄。其他可選標誌可用於額外組態,例如使用個人存取令牌進行身份驗證、設定網路策略或指定特定的Flux版本。

命令解析:

  • flux bootstrap git:使用Git儲存函式庫初始化FluxCD。
  • --url <YOUR-GIT-REPOSITORY>:指定Git儲存函式庫的URL。
  • --path=<PATH-TO-CLUSTER-CONFIGURATION>:指定倉函式庫中組態檔案的路徑。
  • [--token-auth]:可選,使用令牌進行身份驗證。
  • [--network-policy]:可選,設定網路策略。
  • [--private]:可選,用於私有倉函式庫。
  • [--version=<VERSION>]:可選,指定FluxCD的版本。

組態FluxCD

安裝FluxCD後,為每個叢集建立一個Kustomization資源,以定義叢集的期望狀態。以下是一個示例Kustomization資源:

apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
kind: Kustomization
metadata:
  name: my-cluster
  namespace: flux-system
spec:
  interval: 1m
  path: ./path/to/cluster/configuration
  prune: true
  sourceRef:
    kind: GitRepository
    name: my-git-repository
  validation: client

path替換為您的叢集特定組態檔案在Git儲存函式庫中的路徑。為每個叢集建立類別似的Kustomization資源,並將這些檔案提交到您的Git儲存函式庫。

Kustomization資源解說:

  • apiVersionkind:定義資源型別為Kustomization。
  • metadata:包含資源的後設資料,如名稱和名稱空間。
  • spec:定義Kustomization的規格,包括同步間隔、路徑、修剪策略等。
  • interval:定義同步間隔。
  • path:指定組態檔案的路徑。
  • prune:是否啟用資源修剪。
  • sourceRef:參照GitRepository資源。
  • validation:定義驗證策略。

監控和管理多雲佈署

安裝和組態FluxCD後,它將自動將Git儲存函式庫中的期望狀態同步到Kubernetes叢集。您可以使用Flux CLI監控同步狀態和管理佈署。

檢查佈署狀態:

flux get kustomizations

管理佈署只需更新Git儲存函式庫中的組態檔案並提交更改,即可觸發與FluxCD的新同步。您還可以使用Flux CLI自動化佈署、監控健康檢查和管理滾動更新。

最佳實踐

以下是一些在多雲環境中安裝和組態FluxCD的最佳實踐:

  • 使用Git子模組或子目錄組織組態檔案,以便於管理大量叢集或環境。
  • 使用Git分支管理不同版本的組態,例如使用prod分支進行生產環境,使用dev分支進行開發環境。
  • 使用Git標籤標記特定版本的組態檔案,例如特定版本或關鍵熱修復。
  • 使用FluxCD的GitOps工具包功能自動管理Kubernetes資源,例如建立名稱空間、RBAC規則或金鑰。
  • 使用FluxCD的高階功能,例如金絲雀發布或漸進式交付,以受控和安全的方式佈署新功能或更新。
  • 使用Prometheus、Grafana或Kibana等工具監控FluxCD安裝和Git儲存函式庫,以深入瞭解佈署的健康狀態和效能。

使用FluxCD實作持續交付

FluxCD透過自動化軟體交付流程的各個階段來實作持續交付。當新程式碼合併到主分支時,FluxCD自動檢測更改並觸發佈署流程。新版本的應用程式以可重複和可預測的方式構建、測試和佈署到生產環境。

組態Git儲存函式庫

首先,組態一個Git儲存函式庫作為Kubernetes叢集期望狀態的“單一真相來源”。您可以建立一個新的Git儲存函式庫或使用現有的倉函式庫來儲存Kubernetes清單和FluxCD組態。

連線FluxCD到Kubernetes叢集

使用以下命令將FluxCD連線到您的Kubernetes叢集,將佔位符替換為您的資訊:

flux bootstrap <GIT_PROVIDER> --repository=<USERNAME>/<REPO_NAME> --path=<PATH_IN_REPO> --personal

GIT_PROVIDER替換為您使用的Git提供者名稱,將USERNAME替換為您的使用者名稱,將REPO_NAME替換為您建立的倉函式庫名稱,將PATH_IN_REPO替換為您將儲存FluxCD組態的倉函式庫路徑。--personal標誌表示您正在使用個人倉函式庫。

建立FluxCD組態

連線FluxCD到您的Kubernetes叢集後,在您的Git儲存函式庫中建立一個新的資料夾來儲存FluxCD組態。在此資料夾中,新增一個kustomization.yaml檔案,內容如下:

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

此檔案將包含flux-system目錄在組態中。

定義應用程式的Kubernetes清單

在您的Git儲存函式庫中建立另一個新的資料夾來儲存應用程式的Kubernetes清單。將應用程式的Kubernetes YAML檔案(如佈署、服務和入口資源)新增到此資料夾。

同步應用程式的清單

要將應用程式的清單與FluxCD同步,在應用程式的資料夾中新增一個新的kustomization.yaml檔案,內容如下:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
  # 列出應用程式的Kubernetes資源

此檔案定義了應用程式的Kubernetes資源,並將其與FluxCD同步。

圖表翻譯:

此圖示呈現了使用FluxCD實作持續交付的流程。首先,開發人員將程式碼變更推播到Git儲存函式庫。然後,FluxCD自動檢測變更並觸發佈署流程。新版本的應用程式被構建、測試並佈署到生產環境。整個過程是自動化的、可重複的和可預測的。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表翻譯:

rectangle "觸發" as node1
rectangle "自動" as node2
rectangle "佈署" as node3
rectangle "監控" as node4

node1 --> node2
node2 --> node3
node3 --> node4

@enduml

圖表翻譯: 此圖表展示了從開發人員推播程式碼變更到新版本佈署到生產環境的整個流程。過程中涉及自動檢測變更、構建和測試新版本,以及最終的佈署和監控。