21.云原生之ArgoCD CICD实战

发布时间:2024年01月23日

云原生专栏大纲


部署项目介绍

项目结构介绍

回顾《6.云原生之DevOps和CICD》中使用的项目,先看项目结构,在Jenkins 实现CICD过程中部署文件deploy.yaml是耦合在业务项目中的。Jenkins CI是通过webhook实现,CD通过流水线文件Jenkinsfile来实现。实际有时候代码修改后我们并不想发布,而是通过手动触发实现,kubesphere中使用Jenkins可创建流水线项目来实现(实际原理就是在Jenkins中创建,只是可视化展示了)。

回顾《19.云原生CICD之ArgoCD入门》部署项目,我们使用到了 《argocd测试项目》中kustomize-guestbook目录下资源清单,这些清单其实是部署的k8s资源清单

改造《6.云原生之DevOps和CICD》中项目,将kustomize资源清单加上,目录结构如下:

image.png
上述项目结构其实是存在问题的,业务源码和部署清单还在耦合一个项目中,职能不够清晰,如何处理?

  1. 需剥离分为两个仓库

剥离带来新的问题,就是业务源码修改发布新版本,开发人员手动打包镜像,通知运维人员更新配置清单中版本,最后发布。如何处理?上述问题其实是解决开发人员和运维人员协作问题,及CI问题

  1. CI如何处理?通过gitlab的ci来实现

注意:若想测试自行将项目拆分,将kustomize拆分为单独的代码仓库,代码仓库如下:
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(持续集成/持续交付)是 GitLab 提供的一套集成开发工具,用于自动化构建、测试和部署应用程序。它提供了一个强大的持续集成和持续交付平台,可以帮助开发团队更高效地管理和交付软件。

  1. 持续集成(Continuous Integration,CI)
    持续集成是指将开发人员的代码频繁地集成到共享的主干代码库中。在持续集成中,开发人员会将代码提交到版本控制系统(如 GitLab),然后自动触发构建、测试和代码质量检查等任务。这样可以快速发现和解决代码集成问题,确保团队的代码始终保持可工作状态。GitLab CI 提供了强大的持续集成功能,可以根据您定义的规则和流程自动运行构建和测试作业。
  2. 持续交付/持续部署(Continuous Delivery/Continuous Deployment,CD)
    持续交付和持续部署是在持续集成的基础上进一步推进的概念。它们旨在自动化和简化软件交付过程,以便更频繁地将经过测试和验证的代码部署到生产环境中。持续交付是指在经过测试的代码通过各种环境(如开发、测试、预生产)后,准备好进行部署的过程。持续部署则更进一步,指的是将经过测试的代码自动部署到生产环境,实现快速、可靠的软件交付。GitLab CI/CD 提供了强大的持续交付和持续部署功能,您可以配置自动化的部署流程,并将代码快速部署到目标环境中。

GitLab CI/CD主要特点和功能

  1. 自动化构建和测试:GitLab CI/CD 允许您在代码提交到 GitLab 仓库时自动运行构建和测试作业。您可以定义多个作业,并在每个作业中编写自定义的构建和测试脚本。
  2. 并行执行:GitLab CI/CD 支持并行执行作业,从而加快构建和测试的速度。您可以根据需要在不同的作业中并行执行任务,提高整体的开发效率。
  3. 多阶段流水线:GitLab CI/CD 使用阶段(stages)来组织作业的执行顺序。您可以定义多个阶段,并在每个阶段中运行一系列的作业。这使得您可以按照特定的流程对代码进行构建、测试和部署。
  4. 集成容器技术:GitLab CI/CD 集成了容器技术,如 Docker,使得构建和测试环境的配置更加灵活和可重复。您可以使用 Docker 容器来创建一致的开发和测试环境,确保代码在不同的环境中具有一致的行为。
  5. 持续交付和部署:GitLab CI/CD 支持持续交付和部署。您可以配置自动化的部署流程,将经过测试的代码自动部署到生产环境或其他目标环境中,从而实现快速、可靠的软件交付。
  6. 可视化界面和报告:GitLab CI/CD 提供了直观的用户界面,用于监视和管理构建和部署流水线。您可以查看作业的执行状态、日志输出以及生成的报告,以便更好地了解整个 CI/CD 流程的状态和结果。
  7. 可扩展性和定制性:GitLab CI/CD 是高度可扩展和可定制的。您可以根据项目的需求配置各种不同的构建、测试和部署策略。它还支持与其他工具和服务的集成,如监控系统、通知系统等。

GitLab CI/CD 的灵活性和功能丰富性使得开发团队能够更好地管理和交付软件,提高开发效率和质量。它是一个强大的工具,适用于各种规模和类型的项目。

部署测试argocd的cd过程

  1. 添加代码仓库

image.png image.png

  1. 创建应用

image.pngimage.pngimage.png

  1. 查看不部署流水线

image.png

  1. 查看部署情况

image.png

CICD工作流

image.png

准备工作

  1. 创建gitlab项目token凭证
  2. 创建CI工作流文件

github中工作流文件创建

.github/workflows/main.yml

name: CI  # 工作流程的名称为 "CI"

on:  # 触发条件
  push:  # 当推送事件发生时
    branches: [ master ]  # 且推送的分支是主分支(master)
  pull_request:  # 当拉取请求事件发生时
    branches: [ master ]  # 且拉取请求的目标分支是主分支(master)
  workflow_dispatch:  # 可以手动触发工作流程
    inputs:  # 输入参数
      image:  # Docker 镜像名称
        required: true  # 必需的输入参数
        description: 'docker image name'  # 描述为 "docker image name"
      sha-tag:  # Docker 镜像标签
        required: true  # 必需的输入参数
        description: 'docker image tag'  # 描述为 "docker image tag"

jobs:  # 工作
  build:  # 名为 "build" 的作业
    runs-on: ubuntu-latest  # 在最新版的 Ubuntu 环境上运行

    steps:  # 步骤
      - uses: actions/checkout@v2  # 使用 actions/checkout@v2 动作
        if: ${{ github.event.inputs.image }}  # 如果存在 image 输入参数

      - name: kustomize edit  # 名为 "kustomize edit" 的步骤
        if: ${{ github.event.inputs.image }}  # 如果存在 image 输入参数
        run: |  # 执行以下命令
          curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"  | bash  # 下载并执行 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 动作
        if: ${{ github.event.inputs.image }}  # 如果存在 image 输入参数
        with:  # 使用以下参数
          message: "kustomize set image to ${{ github.event.inputs.image }}:${{ github.event.inputs.sha-tag }}"  # 提交消息为 "kustomize set image to <image>:<sha-tag>"

gitlab中工作流文件创建【实操待补充】

该部分关联《20.云原生之GitLab CICD实战》 小编在实操验证中,验证完毕补充上。

GitLab CI示例

当使用 GitLab CI/CD 将 Java 工程发布到 Kubernetes (K8s) 集群时,你可以使用以下示例的 .gitlab-ci.yml 文件作为详细定义:

image: docker:20.10.9

stages:
  - build
  - test
  - package
  - build_docker
  - push_docker
  - deploy

variables:
  DOCKER_HOST: tcp://docker:2375  # 设置 Docker 守护进程的地址
  DOCKER_TLS_CERTDIR: ""
  DOCKER_DRIVER: overlay2

before_script:
  - apk add --no-cache docker  # 安装 Docker CLI

build:
  stage: build
  script:
    - mvn clean compile

test:
  stage: test
  script:
    - mvn test

package:
  stage: package
  script:
    - mvn package
  artifacts:
    paths:
      - target/*.jar

build_docker:
  stage: build_docker
  script:
    - docker build -t myregistry/myapp:$CI_COMMIT_SHORT_SHA .  # 构建 Docker 镜像
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY  # 登录到容器注册表

push_docker:
  stage: push_docker
  script:
    - docker push myregistry/myapp:$CI_COMMIT_SHORT_SHA  # 推送 Docker 镜像到容器注册表

deploy:
  stage: deploy
  script:
    - echo "Deploying Java application to Kubernetes"
    - kubectl apply -f kubernetes/deployment.yaml  # 应用 Kubernetes 部署配置
    - kubectl rollout status deployment/myapp -n mynamespace  # 等待部署完成
    - kubectl get pods -n mynamespace  # 获取部署的 Pod 信息

after_script:
  - echo "Cleanup"  # 在作业完成后进行清理操作
  - mvn clean

这个示例中,我们添加了 build_docker 和 push_docker 两个阶段来构建和推送 Docker 镜像。以下是文件的详细定义:

  • image 指定了构建时使用的 Docker 镜像。这里我们使用了 docker:20.10.9 镜像。
  • stages 定义了流水线的阶段。在这个示例中,我们添加了 build_docker 和 push_docker 两个阶段。
  • variables 部分定义了一些变量。DOCKER_HOST 用于指定 Docker 守护进程的地址,这里假设它是 docker:2375。DOCKER_TLS_CERTDIR 和 DOCKER_DRIVER 则是 Docker 相关的配置。
  • before_script 部分定义了在运行作业脚本之前要执行的命令。在这个示例中,我们安装了 Docker CLI。
  • build 阶段、test 阶段和 package 阶段的作业与之前的示例相同,分别用于构建、测试和打包 Java 工程。
  • build_docker 阶段的作业中,我们使用 docker build 命令构建 Docker 镜像,并使用 $CI_COMMIT_SHORT_SHA 作为镜像的标签,以确保每次构建都有唯一的标识。你可以根据需要修改镜像名称和标签。
  • push_docker 阶段的作业中,我们使用 docker push 命令将构建的 Docker 镜像推送到容器注册表。这里假设你已经在 GitLab CI/CD 配置中设置了容器注册表的用户名和密码。
  • 其余阶段的作业与之前的示例相同,包括部署到 Kubernetes 集群和清理操作。

上述deploy过程deployment.yaml内容中使用变量CI_COMMIT_SHORT_SHA:
要在 deployment.yaml 文件中使用变量 CI_COMMIT_SHORT_SHA,你可以在文件中使用模板语法,并通过 GitLab CI/CD 的变量传递该值。下面是一个示例 deployment.yaml 文件的部分内容,展示了如何使用 CI_COMMIT_SHORT_SHA 变量:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
        - name: myapp
          image: myregistry/myapp:$CI_COMMIT_SHORT_SHA  # 使用变量作为镜像标签
          ports:
            - containerPort: 8080

在上面的示例中,image 字段使用了 $CI_COMMIT_SHORT_SHA 变量作为镜像标签。这将确保每次构建都会使用唯一的标识来部署新的镜像。
在 GitLab CI/CD 中,你可以通过在 .gitlab-ci.yml 文件中定义变量来传递 CI_COMMIT_SHORT_SHA 值。例如:

variables:
  CI_COMMIT_SHORT_SHA: "$CI_COMMIT_SHORT_SHA"

通过这样的定义,GitLab CI/CD 将会将当前的 CI_COMMIT_SHORT_SHA 值传递给部署阶段,并在 deployment.yaml 文件中替换相应的变量。

数据加密之seale sealed

kustomize项目中secret.yaml中DB配置只是简单加密存在安全问题,两种解决方案:

  1. secret.yaml不要暴露到项目中,运维人员提前在kubesphere中创建;

secret不跟项目绑定在k8s上不好管理,使用kubesphere中的保密字典能解决这个问题

  1. 暴露出secret.yaml需加密

image.png
参考secret加密管理方案,选择使用Bitnami Sealed Secrets

Bitnami Sealed Secrets介绍

Bitnami Sealed Secrets 是一个用于加密和管理敏感信息的工具,它是基于 Kubernetes 的 Sealed Secrets 控制器。Sealed Secrets 可以安全地存储和传输敏感的密钥、密码、API 密钥等信息,确保这些信息在存储和传输过程中不会被泄露。
下面是 Bitnami Sealed Secrets 的一些主要特点和工作原理:

  1. 加密敏感信息:Bitnami Sealed Secrets 使用公钥/私钥加密方案,将敏感信息加密为 Sealed Secrets 对象。只有持有私钥的人才能解密和读取这些信息。
  2. GitOps 集成:Sealed Secrets 可以与 GitOps 工作流程集成,使敏感信息的管理更加自动化和可追踪。您可以将加密的 Sealed Secrets 对象存储在 Git 存储库中,将其作为代码的一部分进行版本控制和协作。
  3. 密钥管理:Bitnami Sealed Secrets 提供了密钥管理工具,用于生成和管理公钥/私钥对。这些密钥对用于加密和解密 Sealed Secrets 对象。
  4. 控制器和解封工具:Bitnami Sealed Secrets 包含一个 Kubernetes 控制器,用于将 Sealed Secrets 对象解密为原始的 Secret 对象。解封工具可用于在非 Kubernetes 环境中解密 Sealed Secrets 对象。

使用 Bitnami Sealed Secrets,您可以更安全地管理和传输敏感信息,同时保持操作的自动化和可追踪性。它适用于需要在 Kubernetes 环境中存储和使用敏感信息的场景,如密码、API 密钥、数据库凭据等。通过加密和密钥管理,Bitnami Sealed Secrets 提供了一种可靠的方式来保护敏感信息,并确保只有授权的人员能够访问和使用这些信息。

Bitnami Sealed Secrets工作流程

image.png
Bitnami Sealed Secrets 的工作流程如下:

  1. 生成密钥对:首先,您需要生成公钥/私钥对,用于加密和解密敏感信息。这可以通过 Bitnami Sealed Secrets 提供的密钥管理工具完成。生成的公钥将用于加密敏感信息,并将其存储为 Sealed Secrets 对象。
  2. 加密敏感信息:使用生成的公钥,您可以将敏感信息加密为 Sealed Secrets 对象。这可以通过将敏感信息转换为 Kubernetes Secret 对象,然后使用 Sealed Secrets 控制器将其加密为 Sealed Secrets 对象来实现。
  3. 存储 Sealed Secrets 对象:加密后的 Sealed Secrets 对象可以存储在 Git 存储库中,作为代码的一部分进行版本控制和协作。在存储库中,Sealed Secrets 对象将被视为不可读的密文。
  4. 部署 Sealed Secrets 控制器:在 Kubernetes 集群中部署 Sealed Secrets 控制器。该控制器将负责监视并解密存储在 Sealed Secrets 对象中的敏感信息,并将其转换为原始的 Kubernetes Secret 对象。
  5. 解密敏感信息:一旦 Sealed Secrets 控制器在集群中运行,它将自动解密 Sealed Secrets 对象,并将其转换为原始的 Secret 对象。这样,其他应用程序和服务就可以使用这些解密后的敏感信息,如密码、API 密钥等。

通过这个工作流程,Bitnami Sealed Secrets 提供了一种安全的方式来管理和使用敏感信息。敏感信息在存储和传输过程中都是加密的,只有在运行 Sealed Secrets 控制器的 Kubernetes 集群中才能被解密和使用。这样可以保护敏感信息免受未经授权的访问和泄露。同时,使用 GitOps 工作流程,可以将加密的 Sealed Secrets 对象与代码一起进行版本控制和协作,提高开发团队的效率和安全性。

安装sealed-secrets和kubeseal

选择版本:https://github.com/bitnami-labs/sealed-secrets/releases 下载如下文件
image.png

安装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系统组件中会出现如下信息:
image.png
并生成保密字典信息:
image.png
方式2:在kubesphere中通过应用仓库部署
image.png
image.png
image.png

安装kubeseal

# -0 kubeseal将下载文件保存问当前目录下kubeseal
wget https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/kubeseal-linux-amd64 -0 kubeseal

mv kubeseal /usr/local/bin/kubeseal
# 验证
kubeseal --version

Kubeseal 是一个用于创建和管理 Sealed Secrets 的工具,它是 Bitnami Sealed Secrets 的一部分。Kubeseal 通过与 Kubernetes API 交互,可以生成 Sealed Secrets 对象并将其加密为密文,以便安全地存储和传输敏感信息。
下面是 Kubeseal 的一些主要特点和用法:

  1. 生成 Sealed Secrets 对象:使用 Kubeseal,您可以从现有的 Kubernetes Secret 对象生成 Sealed Secrets 对象。这可以通过运行命令行工具来完成,工具会将 Secret 对象的内容加密并生成相应的 Sealed Secrets 对象。
  2. 加密敏感信息:Kubeseal 使用 Sealed Secrets 控制器的公钥来加密敏感信息。在生成 Sealed Secrets 对象时,Kubeseal 会自动获取集群中的 Sealed Secrets 控制器的公钥,并使用该公钥对敏感信息进行加密。
  3. 密钥管理:Kubeseal 可以与密钥管理工具集成,用于生成和管理 Sealed Secrets 控制器所需的公钥/私钥对。这些密钥对用于加密和解密 Sealed Secrets 对象。
  4. GitOps 集成:Kubeseal 可以与 GitOps 工作流程集成,使生成的 Sealed Secrets 对象可以与代码一起进行版本控制和协作。您可以将生成的 Sealed Secrets 对象存储在 Git 存储库中,确保敏感信息的安全性和可追踪性。

使用 Kubeseal,您可以更方便地创建和管理 Sealed Secrets 对象,将敏感信息加密为密文,并确保只有在运行 Sealed Secrets 控制器的 Kubernetes 集群中才能解密和使用这些信息。它简化了 Sealed Secrets 的生成过程,并提供了与密钥管理和 GitOps 的集成,使敏感信息的管理更加自动化和可靠。

通过kubeseal将sealed-secrets公钥拿出来

可以通过kubesphere查看保密字典或者通过k8s命令查看拷贝出来,手动操作可能会出错,推荐使用kubeseal将公钥拿出来

# 备份公钥
kubeseal --fetch-cert > public-cert.pem

将公钥拷贝到argocd-in-action测试项目argocd-in-action下

通过kubeseal加密secrets

https://github.com/ppsite/argocd-in-action

  1. secret.yaml如下:
apiVersion: v1
kind: Secret
metadata:
  name: db-connection
  namespace: flask-demo
type: Opaque
data:
  DB_NAME: ZGVtbw==
  DB_USERNAME: cm9vdA==
  DB_PASSWORD: cGFzc3dvcmQ=
  DB_HOST: MTI3LjAuMC4x
  DB_PORT: OTUyNw==

DB明文内容如下:
image.png

  1. 加密secret.yaml
kubeseal --format=yaml --cert ./public-cert.pem < secret.yaml > secret-sealed.yaml

这个命令使用了 kubeseal 工具,它是一个用于密钥管理和加密 Kubernetes Secrets 的工具。让我们逐步解释这个命令的每个部分:

  • kubeseal: 这是执行密钥管理和加密操作的命令。
  • –format=yaml: 这个选项指定输出的格式为 YAML。它告诉 kubeseal 命令将密封(sealed)的 Secret 输出为 YAML 格式。
  • –cert .public-cert.pem: 这个选项指定了用于密封操作的公钥证书文件。./public-cert.pem 是公钥证书的文件路径。密封操作使用公钥来加密 Secrets。
  • < secret.yaml: 这个符号 < 表示将 secret.yaml 文件作为输入传递给 kubeseal 命令。secret.yaml 是包含要密封的 Secret 数据的文件。
  • secret-sealed.yaml: 这个符号 > 表示将 kubeseal 命令的输出重定向到 secret-sealed.yaml 文件中。secret-sealed.yaml 是生成的密封(sealed)的 Secret 数据的输出文件。

综合来说,这个命令的作用是将 secret.yaml 文件中的 Secret 数据进行加密,并将加密后的结果保存到 secret-sealed.yaml 文件中。加密操作使用了 kubeseal 命令所指定的公钥证书文件(.public-cert.pem)。密封(sealed)的 Secret 数据可以安全地存储或传输,只有拥有相应私钥的人才能解密并访问其中的数据。这样可以确保在 Kubernetes 集群中管理敏感信息时的安全性。

替换kustomize下secret为加密secret

  1. 查看secret-sealed.yaml文件,发现DB配置已经加密:
---
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  creationTimestamp: null
  name: db-connection
  namespace: 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/XbHRcbufitwTismZw36XyC3wSpNy9urfsOkAt2KfDGZWKGUpWANO8QEuST9N7ORVvRG4Rw7sDzcdFmZUEoyFKibHgVr0GNgQLZ3GU
    DB_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/x4xPJJdbAlAKlNOnoEqjjPIngeTkiz37ShBFgiLoWlZzlFY27ZDaa
    DB_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: null
      name: db-connection
      namespace: flask-demo
    type: Opaque
  1. 替换argocd-in-action测试项目kustomize下的secret.yaml为secret-sealed.yaml

image.png

创建argocd应用测试

image.png
发现SealedSecret创建失败,点击进入查看具体原因,提示资源已经存在
image.png
修改secret-sealed.yaml下db-connection名称,删除flask-demo名称空间,重新同步:
image.png
提示没有秘钥可以解密,查看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)

备份公钥私钥容灾处理

  1. 备份私钥
kubectl get secret -n kube-system -l sealedsecrets.bitnami.com/sealed-secrets-key -o yaml > private.key
  • kubectl: Kubernetes 命令行工具,用于与 Kubernetes 集群进行交互。
  • get secret: 获取 Kubernetes 集群中的 Secret 资源。
  • -n kube-system: 指定命令在 kube-system 命名空间中执行,即获取 kube-system 命名空间下的 Secret。
  • -l sealedsecrets.bitnami.com/sealed-secrets-key: 使用标签选择器,只返回具有指定标签的 Secret。这里的标签是 sealedsecrets.bitnami.com/sealed-secrets-key。
  • -o yaml: 指定输出格式为 YAML。将获取的 Secret 资源以 YAML 格式打印到标准输出。
  • private.key: 将标准输出的内容重定向到 private.key 文件中。这将把 YAML 输出保存到名为 private.key 的文件中。

因此,该命令的作用是获取位于 kube-system 命名空间下,具有标签 sealedsecrets.bitnami.com/sealed-secrets-key 的 Secret 资源,并将其以 YAML 格式保存到名为 private.key 的文件中。这个文件可能包含密钥或其他敏感信息,用于后续操作或配置。

  1. 模拟灾难:卸载sealed-secrets-controller
kubectl delete -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.25.0/controller.yaml

上述操作不会删除secrets

  1. 恢复
# 先导入私钥
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
文章来源:https://blog.csdn.net/weixin_45690643/article/details/135761060
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。