教學課程:在已啟用 Azure Arc 的 Kubernetes 叢集上使用 GitOps 部署設定

重要

本教學課程適用于具有 Flux v1 的 GitOps。 已啟用 Azure Arc 的 Kubernetes 和 Azure Kubernetes Service (AKS) 叢集現在可以使用具有 Flux v2 的 GitOps;移至使用 Flux v2 的 GitOps教學課程。 最後,Azure 會停止支援具有 Flux v1 的 GitOps,因此請儘快開始使用 Flux v2。

在本教學課程中,您會在已啟用 Azure Arc 的 Kubernetes 叢集上使用 GitOps 來套用設定。 您將學習如何:

  • 使用 Git 存放庫範例,在已啟用 Azure Arc 的 Kubernetes 叢集上建立組態。
  • 驗證已成功建立組態。
  • 從私人 Git 存放庫套用設定。
  • 驗證 Kubernetes 組態。

先決條件

  • 具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶

  • 現有已啟用 Azure Arc 的 Kubernetes 連線叢集。

  • 瞭解這項功能的優點和架構。 如需詳細資訊,請參閱 設定和 GitOps - 已啟用 Azure Arc 的 Kubernetes 文章

  • k8s-configuration安裝版本的 > Azure CLI 擴充功能 = 1.0.0:

    az extension add --name k8s-configuration
    

    提示

    如果已安裝擴充 k8s-configuration 功能,您可以使用下列命令將它更新為最新版本 - az extension update --name k8s-configuration

  • 如果您的 Git 存放庫位於防火牆之外,且 git 通訊協定正與設定存放庫參數搭配使用,則必須啟用埠 9418 上的 TCP () git://:9418 才能在防火牆上進行輸出存取。

建立設定

本文中使用的 範例存放庫 是以叢集操作員的角色為結構。 此存放庫中的資訊清單會布建幾個命名空間、部署工作負載,並提供一些小組特定的設定。 搭配 GitOps 使用此存放庫會在叢集上建立下列資源:

  • 命名空間: cluster-config 、、 team-ateam-b
  • 部署: arc-k8s-demo
  • ConfigMap: team-a/endpoints

config-agent 輪詢 Azure 以取得新的或更新的組態。 這項工作最多需要 5 分鐘的時間。

如果您要將私人存放庫與設定產生關聯,請完成 從私人 Git 存放庫套用組態中的下列步驟。

使用 Azure CLI

使用 的 Azure CLI 擴充功能 k8s-configuration ,將連線的叢集連結至 範例 Git 存放庫

  1. 將此組態 cluster-config 命名為 。

  2. 指示代理程式在 命名空間中 cluster-config 部署 運算子。

  3. 授與操作員 cluster-admin 許可權。

    az k8s-configuration create --name cluster-config --cluster-name AzureArcTest1 --resource-group AzureArcTest --operator-instance-name cluster-config --operator-namespace cluster-config --repository-url https://github.com/Azure/arc-k8s-demo --scope cluster --cluster-type connectedClusters
    
    {
      "complianceStatus": {
      "complianceState": "Pending",
      "lastConfigApplied": "0001-01-01T00:00:00",
      "message": "{\"OperatorMessage\":null,\"ClusterState\":null}",
      "messageLevel": "3"
      },
      "configurationProtectedSettings": {},
      "enableHelmOperator": false,
      "helmOperatorProperties": null,
      "id": "/subscriptions/<sub id>/resourceGroups/<group name>/providers/Microsoft.Kubernetes/connectedClusters/<cluster name>/providers/Microsoft.KubernetesConfiguration/sourceControlConfigurations/cluster-config",
      "name": "cluster-config",
      "operatorInstanceName": "cluster-config",
      "operatorNamespace": "cluster-config",
      "operatorParams": "--git-readonly",
      "operatorScope": "cluster",
      "operatorType": "Flux",
      "provisioningState": "Succeeded",
      "repositoryPublicKey": "",
      "repositoryUrl": "https://github.com/Azure/arc-k8s-demo",
      "resourceGroup": "MyRG",
      "sshKnownHostsContents": "",
      "systemData": {
        "createdAt": "2020-11-24T21:22:01.542801+00:00",
        "createdBy": null,
        "createdByType": null,
        "lastModifiedAt": "2020-11-24T21:22:01.542801+00:00",
        "lastModifiedBy": null,
        "lastModifiedByType": null
      },
      "type": "Microsoft.KubernetesConfiguration/sourceControlConfigurations"
    }
    

使用公用 Git 存放庫

參數 [格式]
--repository-url HTTP[s]://server/repo[.git] 或 git://server/repo[.git]

使用帶有 SSH 和 Flux 已建立金鑰的私人 Git 存放庫

將 Flux 產生的公開金鑰新增至 Git 服務提供者的使用者帳戶中。 如果金鑰新增至存放庫,而不是使用者帳戶,請使用 git@ 取代 user@ URL。

如需詳細資訊,請 跳至從私人 Git 存放庫套用組態 一節。

參數 [格式] 注意
--repository-url ssh://user@server/repo[.git] 或 user@server:repo[.git] git@ 可以取代 user@

使用帶有 SSH 和使用者已提供金鑰的私人 Git 存放庫

直接或在檔案中提供您自己的私密金鑰。 金鑰必須是 PEM 格式 ,並以分行符號 (\n) 結尾。

將關聯的公開金鑰新增至 Git 服務提供者中的使用者帳戶。 如果金鑰新增至存放庫,而不是使用者帳戶,請使用 git@ 取代 user@

如需詳細資訊,請 跳至從私人 Git 存放庫套用組態 一節。

參數 [格式] 注意
--repository-url ssh://user@server/repo[.git] 或 user@server:repo[.git] git@ 可以取代 user@
--ssh-private-key PEM 格式的 base64 編碼金鑰 直接提供金鑰
--ssh-private-key-file 本機檔案的完整路徑 提供包含 PEM 格式金鑰之本機檔案的完整路徑

使用具有 SSH 和使用者已提供已知主機的私人 Git 主機

Flux 操作員會在其已知主機檔案中維護常見 Git 主機清單,以便在建立 SSH 連線之前對 Git 存放庫進行驗證。 如果您使用 不常見的 Git 存放庫或您自己的 Git 主機,您可以提供主機金鑰,讓 Flux 能夠識別您的存放庫。

就像私密金鑰一樣,您可以直接或在檔案中提供known_hosts內容。 提供您自己的內容時,請使用 known_hosts內容格式規格,以及上述任一 SSH 金鑰案例。

參數 [格式] 注意
--repository-url ssh://user@server/repo[.git] 或 user@server:repo[.git] git@ 可以取代 user@
--ssh-known-hosts base64 編碼 直接提供已知的主機內容
--ssh-known-hosts-file 本機檔案的完整路徑 在本機檔案中提供已知的主機內容

搭配 HTTPS 使用私人 Git 存放庫

參數 [格式] 注意
--repository-url https://server/repo[.git] 具有基本驗證的 HTTPS
--https-user raw 或 base64 編碼 HTTPS 使用者名稱
--https-key raw 或 base64 編碼 HTTPS 個人存取權杖或密碼

注意

  • Helm 運算子圖表 1.2.0+ 版支援 HTTPS Helm 版本私人驗證。
  • AKS 受控叢集不支援 HTTPS Helm 版本。
  • 如果您需要 Flux 才能透過 Proxy 存取 Git 存放庫,您必須使用 Proxy 設定來更新 Azure Arc 代理程式。 如需詳細資訊,請參閱 使用輸出 Proxy 伺服器進行連線

其他參數

使用下列選擇性參數自訂群組態:

參數 描述
--enable-helm-operator 切換以啟用 Helm 圖表部署的支援。
--helm-operator-params 如果啟用) ,Helm 運算子的圖表值 (。 例如: --set helm.versions=v3
--helm-operator-chart-version 如果啟用) ,Helm 運算子的圖表版本 (。 使用 1.2.0+版。 預設值:'1.2.0'。
--operator-namespace 運算子命名空間的名稱。 預設值:'default'。 最大值:23 個字元。
--operator-params 運算子的參數。 必須在單引號中提供。 例如, --operator-params='--git-readonly --sync-garbage-collection --git-branch=main'

支援 --operator-params 的選項:

選項 描述
--git-branch 要用於 Kubernetes 資訊清單的 Git 存放庫分支。 預設值是 'master'。 較新的存放庫具有名為 的 main 根分支,在此情況下,您必須設定 --git-branch=main
--git-path 適用于 Flux 的 Git 存放庫中的相對路徑,以找出 Kubernetes 資訊清單。
--git-readonly Git 存放庫會被視為唯讀。 Flux 不會嘗試寫入它。
--manifest-generation 啟用時,Flux 將會尋找 .flux.yaml,並執行 Kustomize 或其他資訊清單產生器。
--git-poll-interval 輪詢 Git 存放庫以進行新認可的期間。 預設值為 5m (5 分鐘)。
--sync-garbage-collection 啟用時,Flux 將刪除其已建立但不再出現於 Git 中的資源。
--git-label 要追蹤同步進度的標籤。 用來標記 Git 分支。 預設為 flux-sync
--git-user Git 認可的使用者名稱。
--git-email 要用於 Git 認可的Email。

如果您不想要 Flux 寫入存放庫, --git-user--git-email 未設定, --git-readonly 則會自動設定。

如需詳細資訊,請參閱 Flux 檔

注意

Flux 預設會從 master git 存放庫的分支進行同步處理。 不過,較新的 Git 存放庫具有名為 的 main 根分支,在此情況下,您必須在 --operator-params 中設定 --git-branch=main

提示

您可以在已啟用 Azure Arc 的 Kubernetes 資源的[GitOps] 索引標籤的 [Azure 入口網站] 中建立組態。

驗證組態

使用 Azure CLI 來驗證已成功建立組態。

az k8s-configuration show --name cluster-config --cluster-name AzureArcTest1 --resource-group AzureArcTest --cluster-type connectedClusters

設定資源將使用合規性狀態、訊息和偵錯資訊進行更新。

{
  "complianceStatus": {
    "complianceState": "Installed",
    "lastConfigApplied": "2020-12-10T18:26:52.801000+00:00",
    "message": "...",
    "messageLevel": "Information"
  },
  "configurationProtectedSettings": {},
  "enableHelmOperator": false,
  "helmOperatorProperties": {
    "chartValues": "",
    "chartVersion": ""
  },
  "id": "/subscriptions/<sub id>/resourceGroups/AzureArcTest/providers/Microsoft.Kubernetes/connectedClusters/AzureArcTest1/providers/Microsoft.KubernetesConfiguration/sourceControlConfigurations/cluster-config",
  "name": "cluster-config",
  "operatorInstanceName": "cluster-config",
  "operatorNamespace": "cluster-config",
  "operatorParams": "--git-readonly",
  "operatorScope": "cluster",
  "operatorType": "Flux",
  "provisioningState": "Succeeded",
  "repositoryPublicKey": "...",
  "repositoryUrl": "git://github.com/Azure/arc-k8s-demo.git",
  "resourceGroup": "AzureArcTest",
  "sshKnownHostsContents": null,
  "systemData": {
    "createdAt": "2020-12-01T03:58:56.175674+00:00",
    "createdBy": null,
    "createdByType": null,
    "lastModifiedAt": "2020-12-10T18:30:56.881219+00:00",
    "lastModifiedBy": null,
    "lastModifiedByType": null
},
  "type": "Microsoft.KubernetesConfiguration/sourceControlConfigurations"
}

建立或更新組態時,會發生一些情況:

  1. Azure Arc config-agent 會 () 監視 Azure Resource Manager是否有新的或更新 Microsoft.KubernetesConfiguration/sourceControlConfigurations 的設定,並注意新的 Pending 設定。
  2. config-agent 讀取組態屬性並建立目的地命名空間。
  3. Azure Arc controller-manager 會建立 Kubernetes 服務帳戶,並將其對應至 ClusterRoleBinding 或 RoleBinding ,以取得適當的許可權 (clusternamespace 範圍) 。 然後,它會部署 的 flux 實例。
  4. 如果使用 SSH 選項搭配 Flux 產生的金鑰, flux 則會產生 SSH 金鑰並記錄公開金鑰。
  5. 報告 config-agent 狀態回到 Azure 中的設定資源。

當布建程式發生時,設定資源將會經歷一些狀態變更。 使用上述 az k8s-configuration show ... 命令來監視進度:

階段變更 描述
complianceStatus->Pending 表示初始和進行中狀態。
complianceStatus ->Installed config-agent 已成功設定叢集並部署 flux ,而不會發生錯誤。
complianceStatus ->Failed config-agent 部署 時發生錯誤 flux 。 回應本文中 complianceStatus.message 會提供詳細資料。

套用來自私人 Git 存放庫的設定

如果您使用私人 Git 存放庫,則必須在存放庫中設定 SSH 公開金鑰。 您提供 或 Flux 會產生 SSH 公開金鑰。 您可以在特定的 Git 存放庫或有權存取存放庫的 Git 使用者上設定公開金鑰。

取得您自己的公開金鑰

如果已產生您自己的 SSH 金鑰,則您已經擁有私人和公開金鑰。

使用 Azure CLI 取得公開金鑰

如果 Flux 正在產生金鑰,請在 Azure CLI 中使用下列內容。

az k8s-configuration show --resource-group <resource group name> --cluster-name <connected cluster name> --name <configuration name> --cluster-type connectedClusters --query 'repositoryPublicKey' 
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAREDACTED"

從 Azure 入口網站取得公開金鑰

如果 Flux 正在產生金鑰,請逐步解說Azure 入口網站中的下列內容。

  1. 在 Azure 入口網站中,瀏覽至連線的叢集資源。
  2. 在資源頁面中,選取 [GitOps],並查看此叢集的組態清單。
  3. 選取使用私人 Git 存放庫的設定。
  4. 在開啟的內容視窗中,複製視窗底部的存放庫公開金鑰

使用 GitHub 新增公開金鑰

使用下列其中一個選項:

  • 選項 1:將公開金鑰新增至使用者帳戶 (適用於帳戶中的所有存放庫):

    1. 開啟 GitHub,然後按一下頁面右上角的設定檔圖示。
    2. 按一下 [設定] 。
    3. 按一下 [SSH] 和 [GPG 金鑰]。
    4. 按一下 [ 新增 SSH 金鑰]。
    5. 提供標題。
    6. 貼上周圍不含任何引號的公開金鑰。
    7. 按一下 [ 新增 SSH 金鑰]。
  • 選項 2:將公開金鑰作為部署金鑰新增至 Git 存放庫 (僅適用於此存放庫):

    1. 開啟 GitHub 並瀏覽至您的存放庫。
    2. 按一下 [設定] 。
    3. 按一下 [部署金鑰]。
    4. 按一下 [ 新增部署金鑰]。
    5. 提供標題。
    6. 檢查 [允許寫入權限]。
    7. 貼上周圍不含任何引號的公開金鑰。
    8. 按一下 [ 新增金鑰]。

使用 Azure DevOps 存放庫新增公開金鑰

使用下列步驟將金鑰新增至 SSH 金鑰:

  1. 在設定檔映射) 右上方 (的 [ 使用者設定 ] 底下,按一下 [SSH 公開金鑰]。
  2. 選取 [+ 新增金鑰]。
  3. 提供名稱。
  4. 貼上周圍不含任何引號的公開金鑰。
  5. 按一下 [新增] 。

驗證 Kubernetes 設定

安裝 flux 實例之後 config-agent ,Git 存放庫中保留的資源應該會開始流向叢集。 檢查是否已使用下列命令建立命名空間、部署和資源:

kubectl get ns --show-labels
NAME              STATUS   AGE    LABELS
azure-arc         Active   24h    <none>
cluster-config    Active   177m   <none>
default           Active   29h    <none>
itops             Active   177m   fluxcd.io/sync-gc-mark=sha256.9oYk8yEsRwWkR09n8eJCRNafckASgghAsUWgXWEQ9es,name=itops
kube-node-lease   Active   29h    <none>
kube-public       Active   29h    <none>
kube-system       Active   29h    <none>
team-a            Active   177m   fluxcd.io/sync-gc-mark=sha256.CS5boSi8kg_vyxfAeu7Das5harSy1i0gc2fodD7YDqA,name=team-a
team-b            Active   177m   fluxcd.io/sync-gc-mark=sha256.vF36thDIFnDDI2VEttBp5jgdxvEuaLmm7yT_cuA2UEw,name=team-b

我們可以看到已建立 team-ateam-bitopscluster-config 命名空間。

flux運算子已部署至 cluster-config 命名空間,如組態資源所指示:

kubectl -n cluster-config get deploy  -o wide
NAME             READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                         SELECTOR
cluster-config   1/1     1            1           3h    flux         docker.io/fluxcd/flux:1.16.0   instanceName=cluster-config,name=flux
memcached        1/1     1            1           3h    memcached    memcached:1.5.15               name=memcached

進一步探索

您可以使用下列專案探索部署為組態存放庫一部分的其他資源:

kubectl -n team-a get cm -o yaml
kubectl -n itops get all

清除資源

使用 Azure CLI 或Azure 入口網站刪除組態。 執行 delete 命令之後,將會立即在 Azure 中刪除設定資源。 從叢集完整刪除相關聯的物件應該會在 10 分鐘內發生。 如果設定在移除時處於失敗狀態,則相關聯的物件完整刪除最多可能需要一小時的時間。

刪除具有 namespace 範圍的設定時,Azure Arc 不會刪除命名空間,以避免中斷現有的工作負載。 如有需要,您可以使用 手動 kubectl 刪除此命名空間。

az k8s-configuration delete --name cluster-config --cluster-name AzureArcTest1 --resource-group AzureArcTest --cluster-type connectedClusters

注意

刪除設定時,不會刪除來自追蹤 Git 存放庫之部署結果叢集的任何變更。

下一步

請前進到下一個教學課程,以瞭解如何使用 GitOps 實作 CI/CD。