西安公司網(wǎng)站開(kāi)發(fā)seo技術(shù)培訓(xùn)學(xué)校
云原生專欄大綱
文章目錄
- 部署項(xiàng)目介紹
- 項(xiàng)目結(jié)構(gòu)介紹
- GitLab CI/CD
- GitLab CI/CD主要特點(diǎn)和功能
- 部署測(cè)試argocd的cd過(guò)程
- CICD工作流
- 準(zhǔn)備工作
- github中工作流文件創(chuàng)建
- gitlab中工作流文件創(chuàng)建【實(shí)操待補(bǔ)充】
- GitLab CI示例
- 數(shù)據(jù)加密之seale sealed
- Bitnami Sealed Secrets介紹
- Bitnami Sealed Secrets工作流程
- 安裝sealed-secrets和kubeseal
- 安裝sealed-secrets-controller
- 安裝kubeseal
- 通過(guò)kubeseal將sealed-secrets公鑰拿出來(lái)
- 通過(guò)kubeseal加密secrets
- 替換**kustomize下**secret為加密secret
- 創(chuàng)建argocd應(yīng)用測(cè)試
- 備份公鑰私鑰容災(zāi)處理
部署項(xiàng)目介紹
項(xiàng)目結(jié)構(gòu)介紹
回顧《6.云原生之DevOps和CICD》中使用的項(xiàng)目,先看項(xiàng)目結(jié)構(gòu),在Jenkins 實(shí)現(xiàn)CICD過(guò)程中部署文件deploy.yaml是耦合在業(yè)務(wù)項(xiàng)目中的。Jenkins CI是通過(guò)webhook實(shí)現(xiàn),CD通過(guò)流水線文件Jenkinsfile來(lái)實(shí)現(xiàn)。實(shí)際有時(shí)候代碼修改后我們并不想發(fā)布,而是通過(guò)手動(dòng)觸發(fā)實(shí)現(xiàn),kubesphere中使用Jenkins可創(chuàng)建流水線項(xiàng)目來(lái)實(shí)現(xiàn)(實(shí)際原理就是在Jenkins中創(chuàng)建,只是可視化展示了)。
回顧《19.云原生CICD之ArgoCD入門》部署項(xiàng)目,我們使用到了 《argocd測(cè)試項(xiàng)目》中kustomize-guestbook目錄下資源清單,這些清單其實(shí)是部署的k8s資源清單
改造《6.云原生之DevOps和CICD》中項(xiàng)目,將kustomize資源清單加上,目錄結(jié)構(gòu)如下:
上述項(xiàng)目結(jié)構(gòu)其實(shí)是存在問(wèn)題的,業(yè)務(wù)源碼和部署清單還在耦合一個(gè)項(xiàng)目中,職能不夠清晰,如何處理?
- 需剝離分為兩個(gè)倉(cāng)庫(kù)
剝離帶來(lái)新的問(wèn)題,就是業(yè)務(wù)源碼修改發(fā)布新版本,開(kāi)發(fā)人員手動(dòng)打包鏡像,通知運(yùn)維人員更新配置清單中版本,最后發(fā)布。如何處理?上述問(wèn)題其實(shí)是解決開(kāi)發(fā)人員和運(yùn)維人員協(xié)作問(wèn)題,及CI問(wèn)題
- CI如何處理?通過(guò)gitlab的ci來(lái)實(shí)現(xiàn)
注意:若想測(cè)試自行將項(xiàng)目拆分,將kustomize拆分為單獨(dú)的代碼倉(cāng)庫(kù),代碼倉(cāng)庫(kù)如下:
https://github.com/zhouwei1996/argocd-in-action
https://github.com/zhouwei1996/flask-demo
https://github.com/zhouwei1996/flask-demo-kustomize
GitLab CI/CD
GitLab CI/CD(持續(xù)集成/持續(xù)交付)是 GitLab 提供的一套集成開(kāi)發(fā)工具,用于自動(dòng)化構(gòu)建、測(cè)試和部署應(yīng)用程序。它提供了一個(gè)強(qiáng)大的持續(xù)集成和持續(xù)交付平臺(tái),可以幫助開(kāi)發(fā)團(tuán)隊(duì)更高效地管理和交付軟件。
- 持續(xù)集成(Continuous Integration,CI):
持續(xù)集成是指將開(kāi)發(fā)人員的代碼頻繁地集成到共享的主干代碼庫(kù)中。在持續(xù)集成中,開(kāi)發(fā)人員會(huì)將代碼提交到版本控制系統(tǒng)(如 GitLab),然后自動(dòng)觸發(fā)構(gòu)建、測(cè)試和代碼質(zhì)量檢查等任務(wù)。這樣可以快速發(fā)現(xiàn)和解決代碼集成問(wèn)題,確保團(tuán)隊(duì)的代碼始終保持可工作狀態(tài)。GitLab CI 提供了強(qiáng)大的持續(xù)集成功能,可以根據(jù)您定義的規(guī)則和流程自動(dòng)運(yùn)行構(gòu)建和測(cè)試作業(yè)。 - 持續(xù)交付/持續(xù)部署(Continuous Delivery/Continuous Deployment,CD):
持續(xù)交付和持續(xù)部署是在持續(xù)集成的基礎(chǔ)上進(jìn)一步推進(jìn)的概念。它們旨在自動(dòng)化和簡(jiǎn)化軟件交付過(guò)程,以便更頻繁地將經(jīng)過(guò)測(cè)試和驗(yàn)證的代碼部署到生產(chǎn)環(huán)境中。持續(xù)交付是指在經(jīng)過(guò)測(cè)試的代碼通過(guò)各種環(huán)境(如開(kāi)發(fā)、測(cè)試、預(yù)生產(chǎn))后,準(zhǔn)備好進(jìn)行部署的過(guò)程。持續(xù)部署則更進(jìn)一步,指的是將經(jīng)過(guò)測(cè)試的代碼自動(dòng)部署到生產(chǎn)環(huán)境,實(shí)現(xiàn)快速、可靠的軟件交付。GitLab CI/CD 提供了強(qiáng)大的持續(xù)交付和持續(xù)部署功能,您可以配置自動(dòng)化的部署流程,并將代碼快速部署到目標(biāo)環(huán)境中。
GitLab CI/CD主要特點(diǎn)和功能
- 自動(dòng)化構(gòu)建和測(cè)試:GitLab CI/CD 允許您在代碼提交到 GitLab 倉(cāng)庫(kù)時(shí)自動(dòng)運(yùn)行構(gòu)建和測(cè)試作業(yè)。您可以定義多個(gè)作業(yè),并在每個(gè)作業(yè)中編寫自定義的構(gòu)建和測(cè)試腳本。
- 并行執(zhí)行:GitLab CI/CD 支持并行執(zhí)行作業(yè),從而加快構(gòu)建和測(cè)試的速度。您可以根據(jù)需要在不同的作業(yè)中并行執(zhí)行任務(wù),提高整體的開(kāi)發(fā)效率。
- 多階段流水線:GitLab CI/CD 使用階段(stages)來(lái)組織作業(yè)的執(zhí)行順序。您可以定義多個(gè)階段,并在每個(gè)階段中運(yùn)行一系列的作業(yè)。這使得您可以按照特定的流程對(duì)代碼進(jìn)行構(gòu)建、測(cè)試和部署。
- 集成容器技術(shù):GitLab CI/CD 集成了容器技術(shù),如 Docker,使得構(gòu)建和測(cè)試環(huán)境的配置更加靈活和可重復(fù)。您可以使用 Docker 容器來(lái)創(chuàng)建一致的開(kāi)發(fā)和測(cè)試環(huán)境,確保代碼在不同的環(huán)境中具有一致的行為。
- 持續(xù)交付和部署:GitLab CI/CD 支持持續(xù)交付和部署。您可以配置自動(dòng)化的部署流程,將經(jīng)過(guò)測(cè)試的代碼自動(dòng)部署到生產(chǎn)環(huán)境或其他目標(biāo)環(huán)境中,從而實(shí)現(xiàn)快速、可靠的軟件交付。
- 可視化界面和報(bào)告:GitLab CI/CD 提供了直觀的用戶界面,用于監(jiān)視和管理構(gòu)建和部署流水線。您可以查看作業(yè)的執(zhí)行狀態(tài)、日志輸出以及生成的報(bào)告,以便更好地了解整個(gè) CI/CD 流程的狀態(tài)和結(jié)果。
- 可擴(kuò)展性和定制性:GitLab CI/CD 是高度可擴(kuò)展和可定制的。您可以根據(jù)項(xiàng)目的需求配置各種不同的構(gòu)建、測(cè)試和部署策略。它還支持與其他工具和服務(wù)的集成,如監(jiān)控系統(tǒng)、通知系統(tǒng)等。
GitLab CI/CD 的靈活性和功能豐富性使得開(kāi)發(fā)團(tuán)隊(duì)能夠更好地管理和交付軟件,提高開(kāi)發(fā)效率和質(zhì)量。它是一個(gè)強(qiáng)大的工具,適用于各種規(guī)模和類型的項(xiàng)目。
部署測(cè)試argocd的cd過(guò)程
- 添加代碼倉(cāng)庫(kù)
- 創(chuàng)建應(yīng)用
- 查看不部署流水線
- 查看部署情況
CICD工作流
準(zhǔn)備工作
- 創(chuàng)建gitlab項(xiàng)目token憑證
- 創(chuàng)建CI工作流文件
github中工作流文件創(chuàng)建
.github/workflows/main.yml
name: CI # 工作流程的名稱為 "CI"on: # 觸發(fā)條件push: # 當(dāng)推送事件發(fā)生時(shí)branches: [ master ] # 且推送的分支是主分支(master)pull_request: # 當(dāng)拉取請(qǐng)求事件發(fā)生時(shí)branches: [ master ] # 且拉取請(qǐng)求的目標(biāo)分支是主分支(master)workflow_dispatch: # 可以手動(dòng)觸發(fā)工作流程inputs: # 輸入?yún)?shù)image: # Docker 鏡像名稱required: true # 必需的輸入?yún)?shù)description: 'docker image name' # 描述為 "docker image name"sha-tag: # Docker 鏡像標(biāo)簽required: true # 必需的輸入?yún)?shù)description: 'docker image tag' # 描述為 "docker image tag"jobs: # 工作build: # 名為 "build" 的作業(yè)runs-on: ubuntu-latest # 在最新版的 Ubuntu 環(huán)境上運(yùn)行steps: # 步驟- uses: actions/checkout@v2 # 使用 actions/checkout@v2 動(dòng)作if: ${{ github.event.inputs.image }} # 如果存在 image 輸入?yún)?shù)- name: kustomize edit # 名為 "kustomize edit" 的步驟if: ${{ github.event.inputs.image }} # 如果存在 image 輸入?yún)?shù)run: | # 執(zhí)行以下命令curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash # 下載并執(zhí)行 kustomize 安裝腳本kustomize edit set image ${{ github.event.inputs.image }}:${{ github.event.inputs.sha-tag }} # 使用 kustomize 編輯鏡像名稱rm -f kustomize # 刪除 kustomize 文件- name: Git Commit/Push Changes # 名為 "Git Commit/Push Changes" 的步驟uses: actions-x/commit@v2 # 使用 actions-x/commit@v2 動(dòng)作if: ${{ github.event.inputs.image }} # 如果存在 image 輸入?yún)?shù)with: # 使用以下參數(shù)message: "kustomize set image to ${{ github.event.inputs.image }}:${{ github.event.inputs.sha-tag }}" # 提交消息為 "kustomize set image to <image>:<sha-tag>"
gitlab中工作流文件創(chuàng)建【實(shí)操待補(bǔ)充】
該部分關(guān)聯(lián)《20.云原生之GitLab CICD實(shí)戰(zhàn)》 小編在實(shí)操驗(yàn)證中,驗(yàn)證完畢補(bǔ)充上。
GitLab CI示例
當(dāng)使用 GitLab CI/CD 將 Java 工程發(fā)布到 Kubernetes (K8s) 集群時(shí),你可以使用以下示例的 .gitlab-ci.yml 文件作為詳細(xì)定義:
image: docker:20.10.9stages:- build- test- package- build_docker- push_docker- deployvariables:DOCKER_HOST: tcp://docker:2375 # 設(shè)置 Docker 守護(hù)進(jìn)程的地址DOCKER_TLS_CERTDIR: ""DOCKER_DRIVER: overlay2before_script:- apk add --no-cache docker # 安裝 Docker CLIbuild:stage: buildscript:- mvn clean compiletest:stage: testscript:- mvn testpackage:stage: packagescript:- mvn packageartifacts:paths:- target/*.jarbuild_docker:stage: build_dockerscript:- docker build -t myregistry/myapp:$CI_COMMIT_SHORT_SHA . # 構(gòu)建 Docker 鏡像- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY # 登錄到容器注冊(cè)表push_docker:stage: push_dockerscript:- docker push myregistry/myapp:$CI_COMMIT_SHORT_SHA # 推送 Docker 鏡像到容器注冊(cè)表deploy:stage: deployscript:- echo "Deploying Java application to Kubernetes"- kubectl apply -f kubernetes/deployment.yaml # 應(yīng)用 Kubernetes 部署配置- kubectl rollout status deployment/myapp -n mynamespace # 等待部署完成- kubectl get pods -n mynamespace # 獲取部署的 Pod 信息after_script:- echo "Cleanup" # 在作業(yè)完成后進(jìn)行清理操作- mvn clean
這個(gè)示例中,我們添加了 build_docker 和 push_docker 兩個(gè)階段來(lái)構(gòu)建和推送 Docker 鏡像。以下是文件的詳細(xì)定義:
- image 指定了構(gòu)建時(shí)使用的 Docker 鏡像。這里我們使用了 docker:20.10.9 鏡像。
- stages 定義了流水線的階段。在這個(gè)示例中,我們添加了 build_docker 和 push_docker 兩個(gè)階段。
- variables 部分定義了一些變量。DOCKER_HOST 用于指定 Docker 守護(hù)進(jìn)程的地址,這里假設(shè)它是 docker:2375。DOCKER_TLS_CERTDIR 和 DOCKER_DRIVER 則是 Docker 相關(guān)的配置。
- before_script 部分定義了在運(yùn)行作業(yè)腳本之前要執(zhí)行的命令。在這個(gè)示例中,我們安裝了 Docker CLI。
- build 階段、test 階段和 package 階段的作業(yè)與之前的示例相同,分別用于構(gòu)建、測(cè)試和打包 Java 工程。
- build_docker 階段的作業(yè)中,我們使用 docker build 命令構(gòu)建 Docker 鏡像,并使用 $CI_COMMIT_SHORT_SHA 作為鏡像的標(biāo)簽,以確保每次構(gòu)建都有唯一的標(biāo)識(shí)。你可以根據(jù)需要修改鏡像名稱和標(biāo)簽。
- push_docker 階段的作業(yè)中,我們使用 docker push 命令將構(gòu)建的 Docker 鏡像推送到容器注冊(cè)表。這里假設(shè)你已經(jīng)在 GitLab CI/CD 配置中設(shè)置了容器注冊(cè)表的用戶名和密碼。
- 其余階段的作業(yè)與之前的示例相同,包括部署到 Kubernetes 集群和清理操作。
上述deploy過(guò)程deployment.yaml內(nèi)容中使用變量CI_COMMIT_SHORT_SHA:
要在 deployment.yaml 文件中使用變量 CI_COMMIT_SHORT_SHA,你可以在文件中使用模板語(yǔ)法,并通過(guò) GitLab CI/CD 的變量傳遞該值。下面是一個(gè)示例 deployment.yaml 文件的部分內(nèi)容,展示了如何使用 CI_COMMIT_SHORT_SHA 變量:
apiVersion: apps/v1
kind: Deployment
metadata:name: myapplabels:app: myapp
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: myregistry/myapp:$CI_COMMIT_SHORT_SHA # 使用變量作為鏡像標(biāo)簽ports:- containerPort: 8080
在上面的示例中,image 字段使用了 $CI_COMMIT_SHORT_SHA 變量作為鏡像標(biāo)簽。這將確保每次構(gòu)建都會(huì)使用唯一的標(biāo)識(shí)來(lái)部署新的鏡像。
在 GitLab CI/CD 中,你可以通過(guò)在 .gitlab-ci.yml 文件中定義變量來(lái)傳遞 CI_COMMIT_SHORT_SHA 值。例如:
variables:CI_COMMIT_SHORT_SHA: "$CI_COMMIT_SHORT_SHA"
通過(guò)這樣的定義,GitLab CI/CD 將會(huì)將當(dāng)前的 CI_COMMIT_SHORT_SHA 值傳遞給部署階段,并在 deployment.yaml 文件中替換相應(yīng)的變量。
數(shù)據(jù)加密之seale sealed
kustomize項(xiàng)目中secret.yaml中DB配置只是簡(jiǎn)單加密存在安全問(wèn)題,兩種解決方案:
- secret.yaml不要暴露到項(xiàng)目中,運(yùn)維人員提前在kubesphere中創(chuàng)建;
secret不跟項(xiàng)目綁定在k8s上不好管理,使用kubesphere中的保密字典能解決這個(gè)問(wèn)題
- 暴露出secret.yaml需加密
參考secret加密管理方案,選擇使用Bitnami Sealed Secrets
Bitnami Sealed Secrets介紹
Bitnami Sealed Secrets 是一個(gè)用于加密和管理敏感信息的工具,它是基于 Kubernetes 的 Sealed Secrets 控制器。Sealed Secrets 可以安全地存儲(chǔ)和傳輸敏感的密鑰、密碼、API 密鑰等信息,確保這些信息在存儲(chǔ)和傳輸過(guò)程中不會(huì)被泄露。
下面是 Bitnami Sealed Secrets 的一些主要特點(diǎn)和工作原理:
- 加密敏感信息:Bitnami Sealed Secrets 使用公鑰/私鑰加密方案,將敏感信息加密為 Sealed Secrets 對(duì)象。只有持有私鑰的人才能解密和讀取這些信息。
- GitOps 集成:Sealed Secrets 可以與 GitOps 工作流程集成,使敏感信息的管理更加自動(dòng)化和可追蹤。您可以將加密的 Sealed Secrets 對(duì)象存儲(chǔ)在 Git 存儲(chǔ)庫(kù)中,將其作為代碼的一部分進(jìn)行版本控制和協(xié)作。
- 密鑰管理:Bitnami Sealed Secrets 提供了密鑰管理工具,用于生成和管理公鑰/私鑰對(duì)。這些密鑰對(duì)用于加密和解密 Sealed Secrets 對(duì)象。
- 控制器和解封工具:Bitnami Sealed Secrets 包含一個(gè) Kubernetes 控制器,用于將 Sealed Secrets 對(duì)象解密為原始的 Secret 對(duì)象。解封工具可用于在非 Kubernetes 環(huán)境中解密 Sealed Secrets 對(duì)象。
使用 Bitnami Sealed Secrets,您可以更安全地管理和傳輸敏感信息,同時(shí)保持操作的自動(dòng)化和可追蹤性。它適用于需要在 Kubernetes 環(huán)境中存儲(chǔ)和使用敏感信息的場(chǎng)景,如密碼、API 密鑰、數(shù)據(jù)庫(kù)憑據(jù)等。通過(guò)加密和密鑰管理,Bitnami Sealed Secrets 提供了一種可靠的方式來(lái)保護(hù)敏感信息,并確保只有授權(quán)的人員能夠訪問(wèn)和使用這些信息。
Bitnami Sealed Secrets工作流程
Bitnami Sealed Secrets 的工作流程如下:
- 生成密鑰對(duì):首先,您需要生成公鑰/私鑰對(duì),用于加密和解密敏感信息。這可以通過(guò) Bitnami Sealed Secrets 提供的密鑰管理工具完成。生成的公鑰將用于加密敏感信息,并將其存儲(chǔ)為 Sealed Secrets 對(duì)象。
- 加密敏感信息:使用生成的公鑰,您可以將敏感信息加密為 Sealed Secrets 對(duì)象。這可以通過(guò)將敏感信息轉(zhuǎn)換為 Kubernetes Secret 對(duì)象,然后使用 Sealed Secrets 控制器將其加密為 Sealed Secrets 對(duì)象來(lái)實(shí)現(xiàn)。
- 存儲(chǔ) Sealed Secrets 對(duì)象:加密后的 Sealed Secrets 對(duì)象可以存儲(chǔ)在 Git 存儲(chǔ)庫(kù)中,作為代碼的一部分進(jìn)行版本控制和協(xié)作。在存儲(chǔ)庫(kù)中,Sealed Secrets 對(duì)象將被視為不可讀的密文。
- 部署 Sealed Secrets 控制器:在 Kubernetes 集群中部署 Sealed Secrets 控制器。該控制器將負(fù)責(zé)監(jiān)視并解密存儲(chǔ)在 Sealed Secrets 對(duì)象中的敏感信息,并將其轉(zhuǎn)換為原始的 Kubernetes Secret 對(duì)象。
- 解密敏感信息:一旦 Sealed Secrets 控制器在集群中運(yùn)行,它將自動(dòng)解密 Sealed Secrets 對(duì)象,并將其轉(zhuǎn)換為原始的 Secret 對(duì)象。這樣,其他應(yīng)用程序和服務(wù)就可以使用這些解密后的敏感信息,如密碼、API 密鑰等。
通過(guò)這個(gè)工作流程,Bitnami Sealed Secrets 提供了一種安全的方式來(lái)管理和使用敏感信息。敏感信息在存儲(chǔ)和傳輸過(guò)程中都是加密的,只有在運(yùn)行 Sealed Secrets 控制器的 Kubernetes 集群中才能被解密和使用。這樣可以保護(hù)敏感信息免受未經(jīng)授權(quán)的訪問(wèn)和泄露。同時(shí),使用 GitOps 工作流程,可以將加密的 Sealed Secrets 對(duì)象與代碼一起進(jìn)行版本控制和協(xié)作,提高開(kāi)發(fā)團(tuán)隊(duì)的效率和安全性。
安裝sealed-secrets和kubeseal
選擇版本:https://github.com/bitnami-labs/sealed-secrets/releases 下載如下文件
安裝sealed-secrets-controller
介紹兩種部署方式:
方式1:選擇版本:https://github.com/bitnami-labs/sealed-secrets/releases
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/controller.yaml# 修改文件中鏡像地址
# 將image: docker.io/bitnami/sealed-secrets-controller:0.25.0
# 修改為ghcr.io/bitnami-labs/sealed-secrets-controller:0.25.0
# 參考https://github.com/bitnami-labs/sealed-secrets/pkgs/container/sealed-secrets-controller
安裝后再kubesphere系統(tǒng)組件中會(huì)出現(xiàn)如下信息:
并生成保密字典信息:
方式2:在kubesphere中通過(guò)應(yīng)用倉(cāng)庫(kù)部署
安裝kubeseal
# -0 kubeseal將下載文件保存問(wèn)當(dāng)前目錄下kubeseal
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/kubeseal-linux-amd64 -0 kubesealmv kubeseal /usr/local/bin/kubeseal
# 驗(yàn)證
kubeseal --version
Kubeseal 是一個(gè)用于創(chuàng)建和管理 Sealed Secrets 的工具,它是 Bitnami Sealed Secrets 的一部分。Kubeseal 通過(guò)與 Kubernetes API 交互,可以生成 Sealed Secrets 對(duì)象并將其加密為密文,以便安全地存儲(chǔ)和傳輸敏感信息。
下面是 Kubeseal 的一些主要特點(diǎn)和用法:
- 生成 Sealed Secrets 對(duì)象:使用 Kubeseal,您可以從現(xiàn)有的 Kubernetes Secret 對(duì)象生成 Sealed Secrets 對(duì)象。這可以通過(guò)運(yùn)行命令行工具來(lái)完成,工具會(huì)將 Secret 對(duì)象的內(nèi)容加密并生成相應(yīng)的 Sealed Secrets 對(duì)象。
- 加密敏感信息:Kubeseal 使用 Sealed Secrets 控制器的公鑰來(lái)加密敏感信息。在生成 Sealed Secrets 對(duì)象時(shí),Kubeseal 會(huì)自動(dòng)獲取集群中的 Sealed Secrets 控制器的公鑰,并使用該公鑰對(duì)敏感信息進(jìn)行加密。
- 密鑰管理:Kubeseal 可以與密鑰管理工具集成,用于生成和管理 Sealed Secrets 控制器所需的公鑰/私鑰對(duì)。這些密鑰對(duì)用于加密和解密 Sealed Secrets 對(duì)象。
- GitOps 集成:Kubeseal 可以與 GitOps 工作流程集成,使生成的 Sealed Secrets 對(duì)象可以與代碼一起進(jìn)行版本控制和協(xié)作。您可以將生成的 Sealed Secrets 對(duì)象存儲(chǔ)在 Git 存儲(chǔ)庫(kù)中,確保敏感信息的安全性和可追蹤性。
使用 Kubeseal,您可以更方便地創(chuàng)建和管理 Sealed Secrets 對(duì)象,將敏感信息加密為密文,并確保只有在運(yùn)行 Sealed Secrets 控制器的 Kubernetes 集群中才能解密和使用這些信息。它簡(jiǎn)化了 Sealed Secrets 的生成過(guò)程,并提供了與密鑰管理和 GitOps 的集成,使敏感信息的管理更加自動(dòng)化和可靠。
通過(guò)kubeseal將sealed-secrets公鑰拿出來(lái)
可以通過(guò)kubesphere查看保密字典或者通過(guò)k8s命令查看拷貝出來(lái),手動(dòng)操作可能會(huì)出錯(cuò),推薦使用kubeseal將公鑰拿出來(lái)
# 備份公鑰
kubeseal --fetch-cert > public-cert.pem
將公鑰拷貝到argocd-in-action測(cè)試項(xiàng)目argocd-in-action下
通過(guò)kubeseal加密secrets
https://github.com/ppsite/argocd-in-action
- secret.yaml如下:
apiVersion: v1
kind: Secret
metadata:name: db-connectionnamespace: flask-demo
type: Opaque
data:DB_NAME: ZGVtbw==DB_USERNAME: cm9vdA==DB_PASSWORD: cGFzc3dvcmQ=DB_HOST: MTI3LjAuMC4xDB_PORT: OTUyNw==
DB明文內(nèi)容如下:
- 加密secret.yaml
kubeseal --format=yaml --cert ./public-cert.pem < secret.yaml > secret-sealed.yaml
這個(gè)命令使用了 kubeseal 工具,它是一個(gè)用于密鑰管理和加密 Kubernetes Secrets 的工具。讓我們逐步解釋這個(gè)命令的每個(gè)部分:
- kubeseal: 這是執(zhí)行密鑰管理和加密操作的命令。
- –format=yaml: 這個(gè)選項(xiàng)指定輸出的格式為 YAML。它告訴 kubeseal 命令將密封(sealed)的 Secret 輸出為 YAML 格式。
- –cert .public-cert.pem: 這個(gè)選項(xiàng)指定了用于密封操作的公鑰證書文件。./public-cert.pem 是公鑰證書的文件路徑。密封操作使用公鑰來(lái)加密 Secrets。
- < secret.yaml: 這個(gè)符號(hào) < 表示將 secret.yaml 文件作為輸入傳遞給 kubeseal 命令。secret.yaml 是包含要密封的 Secret 數(shù)據(jù)的文件。
-
secret-sealed.yaml: 這個(gè)符號(hào) > 表示將 kubeseal 命令的輸出重定向到 secret-sealed.yaml 文件中。secret-sealed.yaml 是生成的密封(sealed)的 Secret 數(shù)據(jù)的輸出文件。
綜合來(lái)說(shuō),這個(gè)命令的作用是將 secret.yaml 文件中的 Secret 數(shù)據(jù)進(jìn)行加密,并將加密后的結(jié)果保存到 secret-sealed.yaml 文件中。加密操作使用了 kubeseal 命令所指定的公鑰證書文件(.public-cert.pem)。密封(sealed)的 Secret 數(shù)據(jù)可以安全地存儲(chǔ)或傳輸,只有擁有相應(yīng)私鑰的人才能解密并訪問(wèn)其中的數(shù)據(jù)。這樣可以確保在 Kubernetes 集群中管理敏感信息時(shí)的安全性。
替換kustomize下secret為加密secret
- 查看secret-sealed.yaml文件,發(fā)現(xiàn)DB配置已經(jīng)加密:
---
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:creationTimestamp: nullname: db-connectionnamespace: flask-demo
spec:encryptedData:DB_HOST: AgCzkIzXN9kxF/2+hShvPr+ic7cnxt5kbMtkaPbUe+d3Hvo87y3F2/MV2s8jn/OQmw5F05YkLa9o3mU4ilVLqeyFPl6uATyrkYPm9k7Qc+0e8TwWf3/LvFayMHKdbv0cT3nd8vc43+pD/37o8sY8DWTQ1bb9ffSwsoyue9mOrs5tSXtCxcR8AubXSaC+8lzCHnObTCe4JDUMjc838fhmA8Uub6T0csBhiiBGI9DHJT+87RtgDjHYrc6A90Vx35eGfrlLuCGwlPe4gsshUB0n6BaBpBjSzBhrOiH9z5bY1yLk5NnNzKp/Pk+hdVOrsg74R3yoXF0mqmoa152jWwgR7R1rDCmBe5oN0i+EeSrbBa6jujR4M5yJXmDbNrgnC1yhrN+w/fC9w51QAwQQGxY8VWw6A8vJVvyUSPaWWSzbsw/a0lbDnUcC7AdeZ2bXAnY8/BKDNskJ17lO0ReaB2AImXpEjXq+KZPQABCEj6epxRa3zOKurpAewVcmWwbPtlgjySH4nGzc9TDrCjHy4epBPtp0niIWIfnOV3HndsE9OdETYOQtITZQu/s6wmvQbt7g5pP7d6uf6S/c7cfZW1ZXzjg9vHzea56rvp5wPs19A8kvl9ArYOvgDxUu0EKV5KDpjHJr6G5ZCpBZxDbirHN0pTcSbxVir3apQ9I8Pi8pKCZbNyejX31WGzyh1KfIoe394sjnxm+Hf4Ui4JI=DB_NAME: AgCErq9kQOue3LKVOIYrxosypAWPrN7cxrysiIgK6jVORTH/bWj06XP7MBAYaawvzX3zG4ovh52fHzXlNmyT1cwvosxSIyPRB+pKfOiD7VvzV0k1TG9Yux2rxOS3RamNLnwnChbYsUFcq/oy9ImqdHwcNlI6jTrTp/zOB4sX8SOtfKJPmXY+FwHovHgP0zY9PG/XF0G7E1PH3jQbJDTUI/aer7ZCRLT45u2H0aIGfNJ60U3xw341TyDN/stY7nJHue3eEpPcz7DI+sIwkbQN/PV+i4R2gUkO92BzP62b32pbrFuJ8ouSUyHhIUGliRRcaeNMNlIxWN8E+gB31M3OG77ULfBRQAG3jOrpHaoVDSEj1TiYiSYcyqYSVnsL5OsQdc3sVunlBqi68U3RiYJ3tiW88BW4AJAozJPzihjMDn3kJ3qmPAp+9UaWnFLuydMG55pPaN+HrWuOMtuhChqze4xs3ryU+7AYplBM7Qi/auMipq7qxiwm8gQBLIylmIHDWrEjcD+y93Nv9lAXYkA3hYKg2wKW2ntMvSd2N+rCCwrSmlpRhSX47eLFEeqIdHpjN0or4m+R7kj8zonE2rTmCxp7axZhoucHcU/XbHRcbufitwTismZw36XyC3wSpNy9urfsOkAt2KfDGZWKGUpWANO8QEuST9N7ORVvRG4Rw7sDzcdFmZUEoyFKibHgVr0GNgQLZ3GUDB_PASSWORD: AgAoeg8lSHrL7KuXXE42a0yDTHBBaSkpgrfuudnaH7V0eHiIH1bjaM+vSl8wJdMUJ+QAcqPJ/QzvYjqU8vOH7JWwz28GzzBhtOV0/nOrtGREjNKEBqvjDvUDZdxU1AtQrvwivRhROd2F1TmvU77FQkL7nzclhVuIud3DOatZAcEAZNtuhVMtrqWkOP2H9RFgt4fbTGMvwtL1lj2TLXlKPKlSywAnMhrh5JCmkilEoPN1s9GJy6bVpgN355stYIlHaURi8bLy1DvtZrinBr2Eh9yk5HZTHto2TAvYfZl9PzkjV2upX14bX21+VPHwUSfYbdU9JG/M31BDJVIYxd54ue9fWiV3n/Df9/F+/dB9qlntsaOe8lMxJHr0/HRkGg2Bcqa2U5GDyn8aF+lNxaJJefI24hPPnzdU8LhQUJYa80n7wMNZQAK+7BReeVAg3OYGhtOwldOmMbAJMEH+aQ0sRapx7xgU7yqF8afdDEDsmv5p9ZBa5KAxqVoatlsWxqkAgvpkgycZGuAeEb4KZNltBqPAPPee//yaJkVXQ3LVrDftuYAoWoiHOcKdUc2f7bnBMC8tGz+fUL8Ipsjlo+NdkV58go2fg4neG0XGuIY5vv6362ZtD8hlFPIZsjE+v3jDChZr8d2YHHgm7Rd947UVHwoOGJ/bs+Se56CEF6UQblsjk01PbXZ7NBXGMEWUHD8p/bKyDkAEB2DCLg==DB_PORT: AgBwjV6sMLMVPCXiphwIatStoYc0MeqghB3ewQ3OpnO+Q/Qzuf9dR4eWqWYmwoOgwEo9FdJTA/vRNhy087ZYA3lsCjdfFvqlcdo5JkDyWszs0rfYNsoqrr0R6AP+41M6JEtdaJN5GNWAZXfWLA6jK4/nvG8tlXW6eg7FS9egLjHlbO/6+lh2Z2tqOFwh9Ifmw4Cb6JKOHgd7NXCW5U9UV9PO9uxP44JFaJwOIeNpSzcTswn5RZqrfaCSzhvXvgnjB7XDwoM9dn0tvBg8bC2dfIoMcSHvQUBVxSqt0DLdDr+de0e1E3zUvjofZ0DAs2CSAXyyxjy6p3nglyvKo0D6GPizEEOpOVFv/9+eehp+TwcezOHjlE8WZRlC5NT9hD7qCu9xXfNRG/oDI1ayn76WjOcq0yK4Gm13NzKvZTlolwEYs+jgCF7c9lFeG3uezGdVY2tLCYe98YzXhdXEejkOcBi0NGa6IQeqjBRfRPOfPyKwIfZKJgyi9SpTfPrO+dGc9AthIh7SxOqKoTzIuQNdvG8DxoahFYWuxzFq2jOwIOcFrp5Vu8Nb1aFnf9BWeKV/3w34MpNl6TDnZSzxgLO5pDu2qnbgMDH4ZWDru2Mg9VAzPDiSBrFJwbO7cIWRihoM4NZDXFsiFsS+eV+hN1/x4xPJJdbAlAKlNOnoEqjjPIngeTkiz37ShBFgiLoWlZzlFY27ZDaaDB_USERNAME: AgAMmJwduaDQh3tVitC1qU6Cf1NvhO4mFW8b/42JlGieEeIEiqOqVXctqlZwYcTwSBt/nu2qWq+5VMA25sGfQwS1z7k5oQPKZFoWcl4KlMhnSIZiBkdinPiqneoKBmrYiCs7lFDj4hY4yGwzSpE1zepjAUUfaW+poHAWFn/WN2bGqcgqXPkQlbCcRQa/lH50k/Ddup2SrQB/YkpAfbT9Rp1ST308UnxwJbs5bki6alAar807BaoCfANrnAJRvDGel2SzLAyNb66o7k6on6Ceh9cRGG1tv4YVdQcrbnF1E1r5qxJumQtID0/FSezbFFeS6ukawopdilt8ymGvM/l/p2O8Spaa6UyGnvlSt96PPSpHH7LBX5Ji7O2bxauaTSxQadIYEfqg/uuHDWvfHMIVYCR41knV1GwKiVdyzlCshIXmW4XaqUEf3mDT3ckLm8liGDl9NS42VteEcI52n7dV5/YbksOiAkQq5JZQRwAR9mOY8USQ/SVm42ZZ8q4LMYw5PGrgGG4pZTlM+AjzfA++ebhKqjMVTt0q+Mznfo6xeXKIvnlkvcOYLmBlxEW+hz2wXNmvWrVbs9WKGshR2LSU+Ktxhv8HVXMFRxIWKVjyGxtdw58X6sef1sWSmaVzQFTrZ0yl/KFCjK0O8n5qk9CrUWB95QofOMoEz4BRcePLQYgPXnp10U+IqpSCPQVXmUqSgSjdjlj+template:metadata:creationTimestamp: nullname: db-connectionnamespace: flask-demotype: Opaque
- 替換argocd-in-action測(cè)試項(xiàng)目kustomize下的secret.yaml為secret-sealed.yaml
創(chuàng)建argocd應(yīng)用測(cè)試
發(fā)現(xiàn)SealedSecret創(chuàng)建失敗,點(diǎn)擊進(jìn)入查看具體原因,提示資源已經(jīng)存在
修改secret-sealed.yaml下db-connection名稱,刪除flask-demo名稱空間,重新同步:
提示沒(méi)有秘鑰可以解密,查看sealed-secrets-controlled日志:
Error updating flask-demo/db-connection-secret-sealed, giving up: no key could decrypt secret (DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USERNAME)E0122 09:10:20.514766 1 controller.go:277] no key could decrypt secret (DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USERNAME)Event(v1.ObjectReference{Kind:"SealedSecret", Namespace:"flask-demo", Name:"db-connection-secret-sealed", UID:"b6e760eb-8260-4e90-b2ac-56d439f59216", APIVersion:"bitnami.com/v1alpha1", ResourceVersion:"11922787", FieldPath:""}): type: 'Warning' reason: 'ErrUnsealFailed' Failed to unseal: no key could decrypt secret (DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USERNAME)
備份公鑰私鑰容災(zāi)處理
- 備份私鑰
kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > private.key
- kubectl: Kubernetes 命令行工具,用于與 Kubernetes 集群進(jìn)行交互。
- get secret: 獲取 Kubernetes 集群中的 Secret 資源。
- -n kube-system: 指定命令在 kube-system 命名空間中執(zhí)行,即獲取 kube-system 命名空間下的 Secret。
- -l sealedsecrets.bitnami.com/sealed-secrets-key: 使用標(biāo)簽選擇器,只返回具有指定標(biāo)簽的 Secret。這里的標(biāo)簽是 sealedsecrets.bitnami.com/sealed-secrets-key。
- -o yaml: 指定輸出格式為 YAML。將獲取的 Secret 資源以 YAML 格式打印到標(biāo)準(zhǔn)輸出。
-
private.key: 將標(biāo)準(zhǔn)輸出的內(nèi)容重定向到 private.key 文件中。這將把 YAML 輸出保存到名為 private.key 的文件中。
因此,該命令的作用是獲取位于 kube-system 命名空間下,具有標(biāo)簽 sealedsecrets.bitnami.com/sealed-secrets-key 的 Secret 資源,并將其以 YAML 格式保存到名為 private.key 的文件中。這個(gè)文件可能包含密鑰或其他敏感信息,用于后續(xù)操作或配置。
- 模擬災(zāi)難:卸載sealed-secrets-controller
kubectl delete -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/controller.yaml
上述操作不會(huì)刪除secrets
- 恢復(fù)
# 先導(dǎo)入私鑰
kubetl apply -f private.key
# 重建sealed-secrets-controller
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/controller.yaml