返回文章列表

Kubernetes叢集佈署GitLab與OpenUnison整合

本文闡述如何在 Kubernetes 叢集佈署 GitLab 與 OpenUnison,並整合憑證管理、SSO 與 GitOps 流程。文章涵蓋自簽憑證設定、Docker Registry 佈署、OpenUnison 安裝與 GitLab Helm Chart 佈署等步驟,最後示範建立範例專案,驗證整合流程與

Kubernetes DevOps

在 Kubernetes 叢集中整合 GitLab 和 OpenUnison 可以實作自動化與 GitOps 流程。首先,透過 cert-manager 建立自簽憑證,確保叢集內部服務的安全性。接著,佈署 Docker Registry 作為容器映像儲存函式庫,並安裝 OpenUnison 以及 MariaDB 和 SMTP 服務,提供身份驗證和單點登入功能。最後,使用 Helm Chart 佈署 GitLab,並設定與 OpenUnison 的整合,讓開發者可以透過 SSO 登入 GitLab,並利用 GitLab 的 CI/CD 功能實作 GitOps 流程。設定過程中,需要注意憑證設定、網域名稱設定以及各服務之間的連線組態,確保整個流程的順暢運作。

準備叢集環境

在大多數企業內部佈署中,使用自簽憑證授權單位(Certificate Authority, CA)是一種常見的做法。這樣可以避免處理潛在的驗證問題,因為商業簽署的憑證在內部環境中不一定能提供太多價值。大多數企業能夠透過其 Active Directory 基礎架構分發內部憑證授權單位的憑證。

佈署 cert-manager 的步驟

  1. 佈署 cert-manager 資源清單

    $ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.16.1/cert-manager.yaml
    
  2. 建立自簽憑證作為憑證授權單位: 在 chapter14/shell 目錄下執行 makeca.sh 指令碼:

    $ cd Kubernetes-and-Docker-The-Complete-Guide/chapter14/shell/
    $ sh ./makeca.sh
    
  3. 建立 Secret 資源: 將產生的憑證和金鑰建立為 Secret:

    $ cd ssl/
    $ kubectl create secret tls ca-key-pair --key=./tls.key --cert=./tls.crt -n cert-manager
    
  4. 建立 ClusterIssuer 物件

    $ cd ../../yaml/
    $ kubectl create -f ./certmanager-ca.yaml
    
  5. 匯入憑證到叢集節點: 將憑證匯入 worker 和 control-plane 節點,以解決 KinD 不會從沒有 TLS 或使用不受信任憑證的 registry 提取映像的問題:

    $ kubectl get secret ca-key-pair -n cert-manager -o json | jq -r '.data["tls.crt"]' | base64 -d > internal-ca.crt
    $ docker cp internal-ca.crt cluster01-worker:/usr/local/share/ca-certificates/internal-ca.crt
    $ docker exec -ti cluster01-worker update-ca-certificates
    $ docker restart cluster01-worker
    $ docker cp internal-ca.crt cluster01-control-plane:/usr/local/share/ca-certificates/internal-ca.crt
    $ docker exec -ti cluster01-control-plane update-ca-certificates
    $ docker restart cluster01-control-plane
    

內容解密:

  • 步驟1: 佈署 cert-manager 至叢集中,讓叢集具備自動管理憑證的能力。
  • 步驟2: 使用 makeca.sh 指令碼產生自簽憑證,作為內部 CA。
  • 步驟3: 將產生的 CA 憑證和私鑰建立為 Kubernetes Secret。
  • 步驟4: 建立 ClusterIssuer 物件,使 Ingress 資源能夠使用 CA 簽發憑證。
  • 步驟5: 將 CA 憑證匯入叢集節點,確保節點信任由該 CA 簽發的憑證。

佈署 Docker 容器登入檔

Docker 公司提供了一個簡單的容器登入檔。雖然它沒有內建安全機制,不適合生產環境使用,但可以用於測試。

  1. 編輯 docker-registry.yaml,將 IP 地址替換為叢集的 IP 地址。
  2. 佈署 Docker 登入檔
    $ kubectl create -f ./docker-registry.yaml
    

內容解密:

  • 編輯組態: 修改 docker-registry.yaml 中的 IP 地址,以符合叢集實際組態。
  • 佈署資源: 使用 kubectl create 指令佈署 Docker 登入檔及其相關資源。

佈署 OpenUnison

OpenUnison 提供了兩種版本:一種是用於身份驗證的登入入口,另一種是自動化入口,用於整合和管理系統。

內容解密:

  • OpenUnison 的自動化入口讓使用者能夠以本地群組管理存取許可權,而無需依賴 Active Directory 的寫入許可權。
  • 即使身份驗證仍依賴中央 SAML 提供者,本地群組的管理仍提供了靈活性。

圖表翻譯:

此圖示展示瞭如何使用 cert-manager 和 OpenUnison 來準備和管理 Kubernetes 叢集。

圖表翻譯:

  • 圖中描述了從佈署 cert-manager 到匯入 CA 憑證,再到佈署 Docker 登入檔和 OpenUnison 的整個流程。
  • 每一步驟都與前一步驟緊密相關,確保叢集和服務的安全性和可管理性。

最終檢查

  1. 檢查所有步驟是否完成,確保沒有遺漏任何細節。
  2. 驗證叢集狀態,確認所有 Pod 和服務正常運作。
  3. 確認安全性組態,確保所有必要的憑證和安全設定正確無誤。

內容解密:

  • 檢查和驗證: 是確保佈署成功的關鍵步驟,避免遺漏任何組態或出現執行錯誤。

佈署OpenUnison與GitLab以實作自動化與GitOps流程

準備工作與OpenUnison佈署

在開始佈署OpenUnison之前,需要先準備資料函式庫和SMTP伺服器。MariaDB作為開放原始碼的資料函式庫被佈署,而SMTP伺服器則採用「黑洞」(black hole)模式,忽略所有SMTP請求,避免企業內部郵件傳送的複雜設定。

步驟1:佈署MariaDB與SMTP黑洞服務

  1. 執行chapter14/yaml/mariadb.yaml來佈署MariaDB,無需修改任何設定。
  2. 佈署SMTP黑洞服務:
    $ kubectl create ns blackhole
    namespace/blackhole created
    $ kubectl create deployment blackhole --image=tremolosecurity/smtp-blackhole -n blackhole
    deployment.apps/blackhole created
    $ kubectl expose deployment/blackhole --type=ClusterIP --port 1025 --target-port=1025 -n blackhole
    service/blackhole exposed
    

步驟2:佈署OpenUnison

  1. 依照第七章「整合身分驗證到叢集」中的步驟1至5,佈署OpenUnison運算元和Kubernetes儀錶板。
  2. 建立一個Secret來儲存存取MariaDB和SMTP服務的憑證:
    apiVersion: v1
    type: Opaque
    metadata:
      name: orchestra-secrets-source
      namespace: openunison
    data:
      K8S_DB_SECRET: aW0gYSBzZWNyZXQ=
      SMTP_PASSWORD: ""
      OU_JDBC_PASSWORD: c3RhcnR0MTIz
      unisonKeystorePassword: aW0gYSBzZWNyZXQ=
    kind: Secret
    
  3. 修改Helm values檔案,更新image、新增trusted_certsdatabasesmtp設定。
  4. 使用Helm佈署OpenUnison:
    $ helm install orchestra tremolo/openunison-k8s-saml2 --namespace openunison -f ./openunison-values.yaml
    

完成SSO整合與測試

  • 編輯OpenUnison物件,移除unison-ca金鑰。
  • 刪除ou-tls-certificate Secret。
  • 編輯Ingress物件,新增cert-manager.io/cluster-issuer: ca-issuer註解。
  • 完成與測試身分提供者的SSO整合。

#### 內容解密:

此步驟主要涉及OpenUnison的組態和佈署。透過建立Secret和使用Helm Chart,能夠實作對叢集的遠端管理和自動化操作。SSO整合使得使用者能夠單一登入並存取多個服務。

佈署GitLab以實作GitOps流程

GitLab不僅提供Git儲存函式倉管理,還包含UI導航、網頁版IDE和多租戶身分管理等功能,是實作GitOps流程的理想選擇。

為什麼選擇GitLab?

  • GitLab提供了完整的DevOps工具鏈,能夠支援從程式碼管理到CI/CD的整個流程。
  • 能夠將企業內的「角色」對應到GitLab群組,實作精細的許可權控制。

#### 內容解密:

GitLab的強大功能使其成為實作GitOps的關鍵元件。透過將角色對映到GitLab群組,能夠有效管理專案存取許可權,為開發團隊提供安全且高效的工作環境。

圖表翻譯:

此處可插入Plantuml圖表來說明OpenUnison和GitLab在整個系統架構中的角色和互動流程。

@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

node1 --> node2
node2 --> node3

@enduml

圖表翻譯:

上圖展示了OpenUnison負責身份驗證和存取控制,而GitLab則提供程式碼管理和CI/CD功能。兩者協同工作,共同實作自動化的DevOps流程。

透過上述步驟,能夠成功佈署OpenUnison和GitLab,為實作自動化和GitOps流程奠定基礎。這不僅提升了叢集管理的效率,也為開發團隊提供了強大的工具支援。

在 Kubernetes 叢集上佈署 GitLab

在這一部分,我們將 GitLab 佈署到我們的叢集中,並建立兩個簡單的儲存函式庫,稍後在佈署 Tekton 和 ArgoCD 時會用到這些儲存函式庫。我們將重點放在自動化步驟上,當我們重新造訪 OpenUnison 以自動化我們的 pipeline 佈署時。

使用 Helm Chart 佈署 GitLab

GitLab 可以使用 Helm Chart 進行佈署。在本文中,我們建立了一個自定義的 values 檔案來執行最小安裝。雖然 GitLab 具有與 ArgoCD 和 Tekton 相似的功能,但我們不會使用它們。我們也不想擔心高用性。

步驟1:建立新的名稱空間

首先,建立一個名為 gitlab 的新名稱空間:

$ kubectl create ns gitlab
namespace/gitlab created

步驟2:新增憑證授權單位(CA)作為 secret

我們需要將憑證授權單位新增為 secret,以便 GitLab 在與 OpenUnison 和稍後為 Tekton 建立的 webhook 進行通訊時能夠信任它們:

$ kubectl get secret ca-key-pair -n cert-manager -o json | jq -r '.data["tls.crt"]' | base64 -d > tls.crt
$ kubectl create secret generic internal-ca --from-file=. -n gitlab

步驟3:建立 GitLab 與 OpenUnison 整合的 secret

編輯 chapter14/gitlab/secret/provider 檔案,將 local.tremolo.dev 替換為您的叢集的完整網域名稱字尾。例如,如果您的叢集執行在 192.168.2.114 上,您可能會使用 apps.192-168-2-114.nip.io 字尾。以下是更新後的 Secret:

name: openid_connect
label: OpenUnison
args:
  name: openid_connect
  scope:
    - openid
    - profile
  response_type: code
  issuer: https://k8sou.apps.192-168-2-114.nip.io/auth/idp/k8sIdp
  discovery: true
  client_auth_method: query
  uid_field: sub
  send_scope_to_token_endpoint: false
  client_options:
    identifier: gitlab
    secret: secret
    redirect_uri: https://gitlab.apps.192-168-2-114.nip.io/users/auth/openid_connect/callback

重要注意事項:在生產環境中,請務必更改客戶端秘密(secret)。

步驟4:建立 secret

建立 GitLab 與 OpenUnison 整合的 secret:

$ kubectl create secret generic gitlab-oidc --from-file=. -n gitlab
secret/gitlab-oidc created

步驟5:編輯 GitLab values 檔案

編輯 chapter14/yaml/gitlab-values.yaml 檔案,將 local.tremolo.dev 替換為您的叢集的完整網域名稱字尾。

步驟6:建立快照(可選)

如果您的叢集執行在單一虛擬機器上,現在是建立快照的好時機。如果在 GitLab 佈署過程中出現問題,回復到快照會比較容易。

步驟7:新增 Helm Chart 並佈署 GitLab

新增 Helm Chart 到本地儲存函式庫並佈署 GitLab:

$ helm repo add gitlab https://charts.gitlab.io
$ "gitlab" has been added to your repositories
$ helm install gitlab gitlab/gitlab -n gitlab -f chapter14/yaml/gitlab-values.yaml
NAME: gitlab
LAST DEPLOYED: Sat Aug 8 14:50:13 2020
NAMESPACE: gitlab
STATUS: deployed
REVISION: 1
WARNING: Automatic TLS certificate generation with cert-manager is disabled and no TLS certificates were provided. Self-signed certificates were generated.

更新 GitLab Ingress 設定

GitLab 初始化完成後,我們需要更新 web 前端的 Ingress 物件以使用由我們的憑證授權單位簽署的憑證。編輯 gitlab-webservice Ingress 物件,將 kubernetes.io/ingress.class 註解從 gitlab-nginx 更新為 nginx,並將 secretNamegitlab-wildcard-tls 更新為 gitlab-web-tls

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: ca-issuer
    kubernetes.io/ingress.class: nginx
    kubernetes.io/ingress.provider: nginx
...
tls:
- hosts:
  - gitlab.apps.192-168-2-114.nip.io
  secretName: gitlab-web-tls
status:
  loadBalancer: {}

設定 GitLab Shell

更新 GitLab shell 以接受 SSH 連線在 port 2222 上。這樣,我們就可以提交程式碼而不必擔心阻塞 SSH 存取到您的 KinD server。編輯 gitlab-gitlab-shell Deployment,在 containerPort: 2222 下方新增 hostPort: 2222

建立範例專案

為了探索 Tekton 和 ArgoCD,我們將建立兩個專案。一個用於儲存簡單的 Python 網路服務,另一個用於儲存執行該服務的 manifest。

  1. 在 GitLab 首頁,您會被提示新增 SSH 金鑰。請立即執行此操作,以便我們可以提交程式碼。
  2. 建立一個名為 hello-python 的專案,並保持可見性為私有。
  3. 使用 SSH 複製專案。由於我們執行在 port 2222 上,因此需要更改 GitLab 提供給我們的 URL,以使其成為正確的 SSH URL。
  4. chapter14/python-hello 的內容複製到您的儲存函式庫中,並推播到 GitLab。

至此,我們已成功佈署 GitLab,並建立了範例專案以供後續使用。接下來,我們將繼續探索 Tekton 和 ArgoCD 的整合與應用。