返回文章列表

OpenUnison自動化專案上線佈署流程

本文探討如何利用 OpenUnison、ArgoCD 與 GitLab CI/CD 建立自動化專案上線流程,涵蓋從開發到佈署的完整生命週期,包含工作流程圖、物件對映、程式碼範例與組態說明,以及常見問題解答。

DevOps Kubernetes

整合 OpenUnison、ArgoCD 和 GitLab,建構全自動化的專案上線流程,涵蓋開發、測試、佈署至生產環境的完整生命週期。透過 OpenUnison 作為自動化入口,開發者可自助建立名稱空間和存取許可權。ArgoCD 則負責同步 GitLab 中的程式碼與 Kubernetes 叢集的狀態,實作 GitOps 理念。文章提供詳細的設定步驟,包含 AppProject 建立、SSH 金鑰組態、GitLab 與 ArgoCD 的整合流程、OpenUnison 自定義資源設定,以及程式碼範例和圖表說明,幫助讀者快速上手自動化佈署流程。

自動化專案上線流程:整合OpenUnison實作無縫佈署

在前面的章節中,我們已經成功佈署了OpenUnison自動化入口網站。這個入口網站允許使用者請求建立新的名稱空間,並透過自助服務介面請求存取這些名稱空間。內建的工作流程非常基礎,但能夠建立名稱空間和適當的RoleBinding物件。我們的目標是建立一個整合平台的工作流程,自動建立所有先前手動建立的物件。

平台開發者工作流程

圖14.6展示了我們的開發者工作流程:

  1. 應用程式擁有者請求建立應用程式。
  2. 基礎設施管理員批准建立請求。
  3. OpenUnison佈署我們手動建立的物件。
  4. 開發者請求存取應用程式。
  5. 應用程式擁有者批准存取請求。
  6. 開發者Fork應用程式原始碼函式庫,進行開發工作,並在開發者工作區啟動應用程式。
  7. 開發者Fork建置專案以建立Pipeline,並Fork開發環境維運專案以建立應用程式的Manifests。
  8. 完成工作並測試後,開發者將程式碼推播到自己的Fork,然後請求合併請求。
  9. 應用程式擁有者批准合併請求,ArgoCD同步建置和維運專案。
  10. 應用程式專案中的Webhook觸發Tekton Pipeline,建置容器並更新開發環境維運專案的標籤。
  11. ArgoCD同步更新後的Manifest到應用程式的開發名稱空間。
  12. 測試完成後,應用程式擁有者提交合併請求,從開發環境維運工作區到生產環境維運工作區,觸發ArgoCD將應用程式佈署到生產環境。

自動化專案上線的物件對映

圖14.7展示了應用程式上線的物件對映:

在GitLab中,我們為應用程式碼、維運和建置Pipeline建立專案。我們還Fork維運專案作為開發環境維運專案。為每個專案生成佈署金鑰並註冊Webhook。我們還建立群組以符合本章前面定義的角色。

在Kubernetes中,我們為開發和生產環境建立名稱空間。我們還為Tekton Pipeline建立名稱空間。我們將金鑰新增到Secrets中。在建置名稱空間中,我們建立支援Webhook的所有基礎設施,以便自動觸發建置。

內容解密:

  • 圖14.6和圖14.7清晰地展示了自動化專案上線的工作流程和物件對映,有助於理解整個流程的運作機制。
  • 自動化流程消除了手動使用kubectl命令的需求,大大提高了效率和可靠性。

自動化佈署的優勢

透過OpenUnison和相關工具的整合,我們實作了從應用程式開發到佈署的全自動化流程。這不僅減少了人工干預的需求,還提高了佈署的速度和可靠性。

自動化佈署流程

圖表翻譯: 此圖示詳細展示了自動化佈署的整個流程,從請求建立應用程式到最終佈署到生產環境。每一步驟都清晰標示,並且突出了關鍵工具如OpenUnison、ArgoCD和Tekton的作用。

自動化專案上線流程:使用 OpenUnison 整合 GitLab 與 ArgoCD

在前一章節中,我們完成了 ArgoCD 的基本組態,接下來將探討如何利用 OpenUnison 自動化專案上線流程,並將 GitLab 與 ArgoCD 進行整合。

建立 AppProject 與組態 SSH 金鑰

首先,在 ArgoCD 中建立一個 AppProject,用於託管我們的建置與營運名稱空間。同時,我們需要加入在建立 GitLab 專案時產生的 SSH 金鑰。每個專案都會在 AppProject 中對應一個 Application 物件,用於指示 ArgoCD 如何從 GitLab 同步資料。最後,我們會為 ArgoCD 新增 RBAC 規則,以確保開發人員能夠檢視應用程式的同步狀態,而擁有者和營運人員則能夠進行更新和變更。

範例程式碼:建立 AppProject

apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
  name: example-project
spec:
  destinations:
  - namespace: '*'
    server: https://kubernetes.default.svc
  sourceRepos:
  - 'https://gitlab.example.com/*'

內容解密:

此 YAML 組態檔案定義了一個名為 example-project 的 AppProject。其中,destinations 指定了允許佈署的目標名稱空間和 Kubernetes 叢集,而 sourceRepos 則指定了允許同步的 Git 倉函式庫地址。

整合 GitLab

首先,我們需要在 OpenUnison 中組態與 GitLab 的 SSO(單一登入)連線。這可以透過自定義資源的方式動態新增。

  1. 編輯 chapter14/yaml/gitlab-trust.yaml,將其中的 IP 地址替換為您的叢集 IP 地址,然後將其套用到叢集中。
  2. 編輯 chapter14/yaml/gitlab-url.yaml,同樣替換 IP 地址後套用到叢集中。
  3. 在 GitLab 中為 OpenUnison 建立一個個人存取權杖。
  4. 將存取權杖以 Base64 編碼後加入到 orchestra-secrets-source Secret 中。

範例程式碼:更新 orchestra-secrets-source Secret

apiVersion: v1
data:
  GITLAB_TOKEN: <Base64 encoded token>
kind: Secret
metadata:
  name: orchestra-secrets-source

內容解密:

此步驟將 GitLab 的存取權杖儲存於 Secret 中,供 OpenUnison 使用以與 GitLab 互動。

整合 ArgoCD

ArgoCD 內建支援 OpenID Connect,但需要在 ConfigMap 中進行組態。

  1. 編輯 argocd-cm ConfigMap,新增 urloidc.config 鍵值。
  2. 編輯 chapter14/yaml/argocd-trust.yamlchapter14/yaml/argocd-url.yaml,替換 IP 地址後套用到叢集中。
  3. 為 ArgoCD 建立一個服務帳戶並生成金鑰。
  4. 將金鑰以 Base64 編碼後加入到 orchestra-secrets-source Secret 中。
  5. 組態 ArgoCD 的 RBAC 規則,以控制對 Web UI 和 CLI 的存取許可權。

範例程式碼:更新 argocd-cm ConfigMap

apiVersion: v1
data:
  url: https://argocd.apps.192-168-2-114.nip.io
  oidc.config: |-
    name: OpenUnison
    issuer: https://k8sou.apps.192-168-2-114.nip.io/auth/idp/k8sIdp
    clientID: argocd
    requestedScopes: ["openid", "profile", "email", "groups"]
kind: ConfigMap
metadata:
  name: argocd-cm

內容解密:

此組態啟用了 ArgoCD 的 OpenID Connect 功能,並指定了相關的身份提供者(OpenUnison)和客戶端 ID(argocd)。

佈建一個平台

在整合了 ArgoCD 之後,實作全面自動化的最後一步是更新我們的 OpenUnison 自定義資源!

更新 OpenUnison

OpenUnison 已經佈署完畢。啟動包含開發者工作流程的自動化門戶的最後一步是更新 orchestra OpenUnison 自定義資源。按照以下程式碼區塊更新映像檔,並新增 non_secret_data,將 hosts 替換為與叢集 IP 相符的內容。最後,將我們建立的新金鑰新增到操作員需要匯入的金鑰列表中:

image: docker.io/tremolosecurity/openunison-k8s-definitive-guide:latest

non_secret_data:
  - name: GITLAB_URL
    value: https://gitlab.apps.192-168-2-140.nip.io
  - name: GITLAB_SSH_HOST
    value: gitlab-gitlab-shell.gitlab.svc.cluster.local
  - name: GITLAB_WEBHOOK_SUFFIX
    value: gitlab.192-168-2-140.nip.io
  - name: ARGOCD_URL
    value: https://argocd.apps.192-168-2-140.nip.io
  - name: GITLAB_WRITE_SSH_HOST
    value: gitlab-write-shell.gitlab.svc.cluster.local

secret_data:
  - K8S_DB_SECRET
  - unisonKeystorePassword
  - SMTP_PASSWORD
  - OU_JDBC_PASSWORD
  - GITLAB_TOKEN
  - ARGOCD_TOKEN

內容解密:

此段落設定了 OpenUnison 的自定義資源。首先,我們指定了使用的映像檔,接著定義了非金鑰資料和金鑰資料。非金鑰資料包括 GitLab 和 ArgoCD 的 URL 及相關主機組態,而金鑰資料則列出了需要被操作員匯入的各種金鑰。

問題

  1. 正確或錯誤:必須實施Pipeline才能使 Kubernetes 運作。

    • A. 正確
    • B. 錯誤
  2. Pipeline的最低步驟是什麼?

    • A. 建置、掃描、測試和佈署
    • B. 建置和佈署
    • C. 掃描、測試、佈署和建置
    • D. 以上皆非
  3. 什麼是 GitOps?

    • A. 在 Kubernetes 上執行 GitLab
    • B. 使用 Git 作為營運組態的權威來源
    • C. 一個愚蠢的行銷術語
    • D. 一家新創公司的產品
  4. 編寫Pipeline的標準是什麼?

    • A. 所有Pipeline都應該用 YAML 編寫。
    • B. 沒有標準;每個專案和供應商都有自己的實作。
    • C. JSON 結合 Go。
    • D. Rust。
  5. 如何在 GitOps 模型中佈署新容器例項?

    • A. 使用 kubectl 更新名稱空間中的 Deployment 或 StatefulSet。
    • B. 更新 Git 中的 Deployment 或 StatefulSet 清單,讓 GitOps 控制器更新 Kubernetes 中的物件。
    • C. 提交工單讓維運人員處理。
    • D. 以上皆非。
  6. 正確或錯誤:在 GitOps 中,所有物件都需要儲存在您的 Git 儲存函式庫中。

    • A. 正確
    • B. 錯誤
  7. 正確或錯誤:您的方式是自動化流程的正確方式。

    • A. 正確
    • B. 錯誤

評估

第1章

  1. 正確答案:(B) 錯誤。 根據某種架構的容器無法在不同的架構上執行。例如,使用 x86 架構建立的映像檔無法在根據 ARM 的架構上執行。

  2. 正確答案:(D) Union filesystem。 Docker 使用 Union filesystem 管理多個映像層。這些層從上到下讀取,以提供單一檔案系統的外觀。

  3. 正確答案:(D) Overlay2。 執行核心版本為 4.0 或以上的系統將使用 Overlay2 儲存驅動程式。

  4. 正確答案:(C) Container layer。 對執行中的容器檔案系統所做的任何更改都儲存在最上層,稱為容器層。

  5. 正確答案:(C) docker exec -it <container> /bin/bash docker exec 命令用於在容器中執行程式。使用 -it 選項告訴 exec 命令使用互動式終端進行執行。要執行的程式是最後一個引數,由於我們想要存取容器的 Bash shell,因此我們正在執行 /bin/bash

  6. 正確答案:(B) 錯誤。 當您停止執行中的容器時,daemon 只會停止執行的映像檔。容器層將保留在主機的檔案系統上。如果您想要刪除容器,則必須使用 docker rm 命令從 daemon 中移除容器。

  7. 正確答案:(B) docker ps -a 要檢視正在執行和已停止的所有容器的列表,請使用 docker ps -a 命令。如果使用 --all-list,daemon 將把該選項解釋為 -l,這只會列出最新的容器。列出最新的容器將排除已停止一段較長時間的容器。

圖表翻譯:

本圖表呈現了 Docker 如何管理容器的生命週期,包括建立、執行、停止和刪除容器的過程。每一步驟都與 Docker 命令相對應,例如 docker run 用於建立和執行容器,docker stop 用於停止容器,而 docker rm 用於刪除容器。

@startuml
skinparam backgroundColor #FEFEFE

title OpenUnison自動化專案上線佈署流程

|開發者|
start
:提交程式碼;
:推送到 Git;

|CI 系統|
:觸發建置;
:執行單元測試;
:程式碼品質檢查;

if (測試通過?) then (是)
    :建置容器映像;
    :推送到 Registry;
else (否)
    :通知開發者;
    stop
endif

|CD 系統|
:部署到測試環境;
:執行整合測試;

if (驗證通過?) then (是)
    :部署到生產環境;
    :健康檢查;
    :完成部署;
else (否)
    :回滾變更;
endif

stop

@enduml

圖表翻譯: 此圖示展示了 Docker 中容器的生命週期管理,從建立到刪除容器的過程。每個步驟都與特定的 Docker 命令相關聯,例如 docker rundocker stopdocker rm