Fleet

Jeff Yen
6 min readSep 7, 2024

--

123

Fleet 是什麼?

  1. 集群引擎:Fleet 是一個容器管理和部署引擎,旨在為使用者提供更多的本地集群控制以及透過 GitOps 進行持續監控。Fleet 不僅強調可擴展性,還賦予使用者高度的控制和可見性,以精確監控集群上安裝的內容。
  2. 部署管理:Fleet 能夠從 Git 管理 Kubernetes 原生 YAML、Helm chart、Kustomize,或這三者的任意組合的部署。無論來源為何,所有資源都會被動態轉換為 Helm chart,並使用 Helm 作為引擎將所有資源部署到集群中。這使得使用者可以享有對其集群的高度控制、一致性和可審計性。

配置管理:Fleet 基本上是一組 Kubernetes 自定義資源定義(CRDs)和控制器,用於管理單個 Kubernetes 集群或大規模 Kubernetes 集群部署的 GitOps。它是一個分布式初始化系統,讓使用者可以輕鬆地從一個點自定義應用程序並管理高可用性集群。

Install

Fleet 是以 Helm chart 的形式分發的。Helm 3 是一個命令列介面(CLI),沒有伺服器端組件,使用起來相當簡單。要安裝 Helm 3 CLI,請按照官方安裝指示進行操作。

brew install helm
helm repo add fleet https://rancher.github.io/fleet-helm-charts/

要安裝 Fleet 的 Helm chart,有兩個需要安裝的 Helm chart,因為我們將 CRDs 分開來以提供最終的靈活性。

helm -n cattle-fleet-system install --create-namespace --wait fleet-crd \
fleet/fleet-crd
helm -n cattle-fleet-system install --create-namespace --wait fleet \
fleet/fleet

Add a Git Repo to Watch

要將 spec.repo 更改為你選擇的 Git 儲存庫,並確保 Kubernetes 清單文件放置在儲存庫的 /manifests 目錄下

cat > example.yaml << "EOF"
apiVersion: fleet.cattle.io/v1alpha1
kind: GitRepo
metadata:
name: sample
# This namespace is special and auto-wired to deploy to the local cluster
namespace: fleet-local
spec:
# Everything from this repo will be run in this cluster. You trust me right?
repo: "https://github.com/rancher/fleet-examples"
paths:
- simple
EOF

kubectl apply -f example.yaml

Get Status

查看 Fleet 正在執行的狀態

kubectl -n fleet-local get fleet

kubectl get deploy frontend

Fleet 與大部分的 Operator 實作方式一樣,都是透過 Kubernetes CRD 來自定義相關資源,並且搭配一個主要的 Controller 來處理這些資源的變化。

GitRepo:

Fleet 中會有一個名為 GitRepo 的物件專門用來代表各種 Git 的存取資訊,Fleet Manager 會負責去監控欲部署的 Git 專案,接者將這些專案的內容與差異性給部署到被視為 Fleet Agent 的 Kubernetes 叢集。

Bundle

Bundle 可以說是整個 Fleet 中最重要也是最基本的資源,其代表的是一個又一個要被部署的應用程式。 當 Fleet Manager 去掃描 GitRepo 時,就會針對該 GitRepo 中的各種檔案(YAML, Helm, Kustomize) 等 產生多個 Bundle 物件。 Bundle 是由一堆 Kubernetes 物件組成的。舉例來說,今天 Git 專案中透過 Helm 的方式描述了三種應用程式,Fleet Manager 掃描該 GitRepo 後就會產生出對應的三個 Bundle 物件。接者 Fleet Manager 就會將該 Bundle 給轉送到要部署該應用程式的 Fleet Agent 叢集,最後 Fleet Agent 就會將這些 Bundle 動態的轉成 Helm Chart 並且部署到 Kubernetes 叢集。

從上方的架構圖來看,可以看到中間的 Fleet Cluster 本身會連接 Git 專案,並且針對這些專案產生出一個又一個 Bundle 資源(Bundle Definition),接者這些 Bundle 就會被傳送到需要部署的 Kubernetes 叢集,該叢集上的 Fleet Agent 就會負責處理這些 Bundle,譬如補上針對自身叢集的客製化設定,最後部署到叢集內。 所以可以看到上圖左下方的 Kubernetes 叢集內使用的是 (Bundle with Cluster Specific Configuration) 的字眼,代表這些真正部署到該叢集內的 Bundle 都是由最基本的 Bundle 檔案配上每個叢集的客製化內容。

為了讓 Fleet 能夠盡可能地去管理不同架構的 Kubernetes 叢集, Fleet 跟 Rancher 本身的設計非常類似,都是採取 Agent Pull 的方式。該模式代表的是 Fleet Controller 不會主動的去跟 Fleet Agent 進行連線,而是由 Fleet Agent 主動的去建立連線。 這種架構的好處就是被管理的 Kubernetes 叢集可以將整個網路給隱藏到 NAT 後面,只要確保底層環境有 SNAT 的功能網路可以對外即可。

Ref:https://www.hwchiu.com/docs/2021/iThome_Challenge/day22

--

--