在 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 的步驟
佈署 cert-manager 資源清單:
$ kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.16.1/cert-manager.yaml建立自簽憑證作為憑證授權單位: 在
chapter14/shell目錄下執行makeca.sh指令碼:$ cd Kubernetes-and-Docker-The-Complete-Guide/chapter14/shell/ $ sh ./makeca.sh建立 Secret 資源: 將產生的憑證和金鑰建立為 Secret:
$ cd ssl/ $ kubectl create secret tls ca-key-pair --key=./tls.key --cert=./tls.crt -n cert-manager建立 ClusterIssuer 物件:
$ cd ../../yaml/ $ kubectl create -f ./certmanager-ca.yaml匯入憑證到叢集節點: 將憑證匯入 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 公司提供了一個簡單的容器登入檔。雖然它沒有內建安全機制,不適合生產環境使用,但可以用於測試。
- 編輯
docker-registry.yaml,將 IP 地址替換為叢集的 IP 地址。 - 佈署 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 的整個流程。
- 每一步驟都與前一步驟緊密相關,確保叢集和服務的安全性和可管理性。
最終檢查
- 檢查所有步驟是否完成,確保沒有遺漏任何細節。
- 驗證叢集狀態,確認所有 Pod 和服務正常運作。
- 確認安全性組態,確保所有必要的憑證和安全設定正確無誤。
內容解密:
- 檢查和驗證: 是確保佈署成功的關鍵步驟,避免遺漏任何組態或出現執行錯誤。
佈署OpenUnison與GitLab以實作自動化與GitOps流程
準備工作與OpenUnison佈署
在開始佈署OpenUnison之前,需要先準備資料函式庫和SMTP伺服器。MariaDB作為開放原始碼的資料函式庫被佈署,而SMTP伺服器則採用「黑洞」(black hole)模式,忽略所有SMTP請求,避免企業內部郵件傳送的複雜設定。
步驟1:佈署MariaDB與SMTP黑洞服務
- 執行
chapter14/yaml/mariadb.yaml來佈署MariaDB,無需修改任何設定。 - 佈署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至5,佈署OpenUnison運算元和Kubernetes儀錶板。
- 建立一個
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 - 修改Helm values檔案,更新image、新增
trusted_certs、database和smtp設定。 - 使用Helm佈署OpenUnison:
$ helm install orchestra tremolo/openunison-k8s-saml2 --namespace openunison -f ./openunison-values.yaml
完成SSO整合與測試
- 編輯OpenUnison物件,移除
unison-ca金鑰。 - 刪除
ou-tls-certificateSecret。 - 編輯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,並將 secretName 從 gitlab-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。
- 在 GitLab 首頁,您會被提示新增 SSH 金鑰。請立即執行此操作,以便我們可以提交程式碼。
- 建立一個名為
hello-python的專案,並保持可見性為私有。 - 使用 SSH 複製專案。由於我們執行在 port 2222 上,因此需要更改 GitLab 提供給我們的 URL,以使其成為正確的 SSH URL。
- 將
chapter14/python-hello的內容複製到您的儲存函式庫中,並推播到 GitLab。
至此,我們已成功佈署 GitLab,並建立了範例專案以供後續使用。接下來,我們將繼續探索 Tekton 和 ArgoCD 的整合與應用。