21.云原生之ArgoCD CICD实战(部分待补充)

云原生专栏大纲

文章目录

  • 部署项目介绍
    • 项目结构介绍
    • GitLab CI/CD
    • GitLab CI/CD主要特点和功能
  • 部署测试argocd的cd过程
  • CICD工作流
    • 准备工作
      • github中工作流文件创建
      • gitlab中工作流文件创建【实操待补充】
        • GitLab CI示例
  • 数据加密之seale sealed
    • Bitnami Sealed Secrets介绍
    • Bitnami Sealed Secrets工作流程
    • 安装sealed-secrets和kubeseal
      • 安装sealed-secrets-controller
      • 安装kubeseal
      • 通过kubeseal将sealed-secrets公钥拿出来
      • 通过kubeseal加密secrets
      • 替换**kustomize下**secret为加密secret
      • 创建argocd应用测试
      • 备份公钥私钥容灾处理

部署项目介绍

项目结构介绍

回顾《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.9stages:- build- test- package- build_docker- push_docker- deployvariables:DOCKER_HOST: tcp://docker:2375  # 设置 Docker 守护进程的地址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 .  # 构建 Docker 镜像- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY  # 登录到容器注册表push_docker:stage: push_dockerscript:- docker push myregistry/myapp:$CI_COMMIT_SHORT_SHA  # 推送 Docker 镜像到容器注册表deploy:stage: deployscript:- 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: myapplabels:app: myapp
spec:replicas: 3selector:matchLabels:app: myapptemplate:metadata:labels:app: myappspec:containers:- name: myappimage: 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 kubesealmv 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-connectionnamespace: flask-demo
type: Opaque
data:DB_NAME: ZGVtbw==DB_USERNAME: cm9vdA==DB_PASSWORD: cGFzc3dvcmQ=DB_HOST: MTI3LjAuMC4xDB_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: 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
  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/651044.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

basicPython-1

元组 """ 目录: 1.创建元组 2.元组的拼接 3.元组的解压赋值 4.元组的切片 5.元组的元素的索引 6.元组的嵌套 7.统计某个元素的个数 """"""创建元组(元组不可变)""" # 1.强制:tuple() # 2.普通 tuple_0 (1,) tup…

MYSQL表的约束详解!

文章目录 前言一、空属性二、默认值三、列描述四、zerofill五、主键六、自增长七、唯一键八、外键 前言 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据…

VS生成报错:MSB8036 The Windows SDK version 8.1 was not found.找不到 Windows SDK 版本 8.1

目录 一、查看本机SDK二、 解决法一&#xff1a;适配本电脑的SDK法二&#xff1a;下载SDK 8.1 VS生成报错&#xff1a;MSB8036 找不到 Windows SDK 版本 8.1。请安装所需版本的 Windows SDK&#xff0c;或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更…

NAT地址转换协议

目录 NAT应用场景静态NAT动态NATNAPTEasy IPNAT服务器 点击跳转NAT配置&#xff08;动态nat&#xff0c;静态nat&#xff0c;Easy IP&#xff09; NAT应用场景 - 随着网络设备的数量不断增长&#xff0c;对IPv4地址的需求也不断增加&#xff0c;导致可用IPv4地址空间逐渐耗尽…

C++17中lambda表达式新增加支持的features

C17中对lambda表达式新增加了2种features&#xff1a;lambda capture of *this和constexpr lambda 1.lambda capture of *this: *this:拷贝当前对象,创建副本&#xff1a;捕获*this意味着该lambda生成的闭包将存储当前对象的一份拷贝 。 this:通过引用捕获。 当你需…

Jmeter接口测试总结

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 Jmeter介绍&测试准备 Jmeter介绍&#xff1a;Jmeter是软件…

Linux第36步_创建正点原子的TF-A工作区

创建正点原子的TF-A工作区&#xff0c;目的是想查看正点原子的设备树文件“stm32mp157d-atk.dts”和设备树头文件“stm32mp157d-atk.dtsi”&#xff0c;了解设备树是什么样子&#xff0c;为后期基于“ST公司的源码”创建自己的设备树提供参考&#xff0c;同时也是为了学习移植u…

人体组织展示可视化模型:探索生命奥秘的新窗口

在医学领域&#xff0c;人体组织是研究疾病、生理机制和药物作用的关键。然而&#xff0c;传统的组织学研究方法往往局限于切片观察&#xff0c;难以全面、直观地展示组织结构和功能。随着科技的发展&#xff0c;人体组织展示可视化模型为医学研究带来了革命性的变革。 使用山海…

Mysql第一天

数据库概述 1. 为什么要使用数据库 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。(可掉电:内存 使用高电压和低电压来区别0和1进行数据的一个存储但是一旦断电了电压都没了 0和1也就没有了)大多数情况下&#xff0c;特别是企 业级应用&#…

计算机毕业设计 | SpringBoot 求职招聘管理系统(附源码)

1&#xff0c;绪论 1.1 开发背景 高学历人群是网络求职者的主体&#xff0c;且结构趋向固定。而在疫情肆虐的今日&#xff0c;线上招聘成了越来越多企业和个人选择的方式。在疫情期间线下招聘转为线上招聘&#xff0c;是疫情防控的需要。不能否定的是新的招聘模式的出现一定会…

大创项目推荐 行人重识别(person reid) - 机器视觉 深度学习 opencv python

文章目录 0 前言1 技术背景2 技术介绍3 重识别技术实现3.1 数据集3.2 Person REID3.2.1 算法原理3.2.2 算法流程图 4 实现效果5 部分代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习行人重识别(person reid)系统 该项目…

机器学习 | 利用Pandas进入高级数据分析领域

目录 初识Pandas Pandas数据结构 基本数据操作 DataFrame运算 文件读取与存储 高级数据处理 初识Pandas Pandas是2008年WesMcKinney开发出的库&#xff0c;专门用于数据挖掘的开源python库&#xff0c;以Numpy为基础&#xff0c;借力Numpy模块在计算方面性能高的优势&am…

Android如何通过按钮实现页面跳转方法

Hello大家好&#xff01;我是咕噜铁蛋&#xff01;在Android应用开发中&#xff0c;页面跳转是一项基本且常见的功能。通过按钮实现页面跳转可以为用户提供更好的交互体验&#xff0c;使应用更加灵活和易用。本文将介绍Android Studio中如何通过按钮实现页面跳转的方法&#xf…

JVM简介

一、什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组…

vivado 放置I/O端口

放置I/O端口 I/O规划视图布局提供了几种将I/O端口分配给封装引脚的方法。你可以在“I/O端口”窗口中选择单个I/O端口、I/O端口组或接口&#xff0c;然后分配将它们封装到封装窗口中的封装引脚或设备窗口中的I/O焊盘。在“程序包”窗口中&#xff0c;您可以&#xff1a; •将端…

飞机发动机和飞机压缩机的关系是什么?各自的作用是什么?飞机压缩机类似于汽车涡轮增压器吗?

问题描述&#xff1a;飞机发动机和飞机压缩机的关系是什么&#xff1f;各自的作用是什么&#xff1f;飞机压缩机类似于汽车涡轮增压器吗&#xff1f; 问题解答&#xff1a; 飞机发动机和飞机压缩机是飞机涡轮引擎中的两个主要组成部分&#xff0c;它们共同协作以产生推力&…

基于springboot+vue的明星周边产品销售网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

redis哨兵机制

1)哨兵机制本质上是通过独立的进程来体现的&#xff0c;和之前的redis-server进程是完全不同的进程&#xff0c;redis-sentinel不负责存储数据&#xff0c;只是针对于其他的redis-server进程起到监控的效果&#xff0c;但是通常来说哨兵节点&#xff0c;也会搞一个集合&#xf…

Kotlin快速入门系列2

Kotlin的基本数据类型 Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是&#xff0c;字符不属于数值类型&#xff0c;是一个独立的数据类型。 Java和kotlin数据类型对照如下&#xff1a; Java基本数据类型 Kotlin对象数据类型 数据类…

goland课程管理(6)

项目目录结构如下图所示&#xff1a; core包下面&#xff1a; class.go package coreimport "github.com/gin-gonic/gin"func Class1(ctx *gin.Context) {}course.go package coreimport (. "cookie/database". "cookie/model""fmt"…