在 Hashicorp Vault 中轮替 Cassandra 凭据

概览

借助此功能,平台管理员可以执行以下操作:

  • 在 Hashicorp Vault 中变换 Cassandra 凭据。
  • 如果在密码变换期间出现任何问题,请回滚到 Vault 中的旧 Cassandra 凭据。
  • 一次变换一个区域的 Cassandra 密码,以确保对服务可用性的影响降到最低,并保持对变换过程的控制。
  • 跟踪单个区域的变换开始、进度和完成。

此功能适用于 Apigee Hybrid 1.13.1 及更高版本。

准备工作

在设置凭据变换之前,请执行以下操作:

  • 备份 Cassandra 数据库。此备份可确保能够恢复预先变换的凭据。
  • 确保集群处于健康状态(即所有 Apigee 资源均在运行,没有任何状态更改待处理)。

单区域设置

  1. 在 Apigee 命名空间中为新的 Cassandra 凭据创建新的 SecretProviderClass Kubernetes 资源。如需查看要使用的模板,请参阅在 Hashicorp Vault 中存储 Cassandra Secret。这可让 Vault 角色访问 Kubernetes 命名空间中的 Secret。
  2. 使用以下模板创建新的 SecretRotation 自定义资源:
    # rotation.yaml
    
    apiVersion: apigee.cloud.google.com/v1alpha1
    kind: SecretRotation
    metadata:
      name: ROTATION_PROCESS_NAME
      namespace: APIGEE_NAMESPACE
    spec:
      organizationId: ORG_NAME
      rotationId: ROTATION_ID
      timeoutMinutes: 480 # optional. overrides the default (480m == 8hr).
                          # less than or equal to 0 means infinite timeout.
      precheck: true
      cassandra:
        oldSecretProviderClass: OLD_SPC_NAME
        newSecretProviderClass: NEW_SPC_NAME
        jobType: ROTATE
    
    • ROTATION_PROCESS_NAME:变换作业的唯一名称。您需要将 metadata.name 设置为变换预检作业和变换作业的唯一值。例如,sr-1-precheck 后跟 sr-1
    • ROTATION_ID:将 spec.rotationId 设置为自定义标识符,例如 rotation-1-precheck
    • NEW_SPC_NAME:将 spec.cassandra.newSecretProviderClass 设置为您在上一步中创建的新 Secret 提供程序类名称。
    • OLD_SPC_NAME:将 spec.cassandra.oldSecretProviderClass 设置为 ApigeeDatastore 当前使用的 SPC 名称。
  3. 通过应用 rotation.yaml 文件触发变换预检作业。
    kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
  4. 检查作业状态,以验证预检作业何时完成。
    kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
  5. 变换预检作业完成后,更改 metadata.name 的值并将 spec.precheck 设置为 false。再次应用该文件以执行变换。
    kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
  6. 变换作业完成且已验证流量仍在正常流动后,请按照以下两个步骤清理该流程:
    1. 更新 metadata.name 的值,并将 spec.cassandra.jobType 设置为 CLEANUP
    2. 通过应用该文件触发清理作业。
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml

    清理作业完成后,变换过程即告完成。

  7. 备份 Cassandra 数据库。此备份可确保能够恢复变换后的凭据。
  8. 从 Vault 中删除旧的 Cassandra 凭据、角色和政策。

多区域设置

多区域设置过程分为两个部分:设置第一个区域和设置其余区域。

  1. 在开始设置后续区域之前,请在第一个区域完成以下步骤。
    1. APIGEE_NAMESPACE 命名空间中为新的 Cassandra 凭据创建新的 SecretProviderClass Kubernetes 资源。如需查看要使用的模板,请参阅在 Hashicorp Vault 中存储 Cassandra Secret。这可让 Vault 角色访问 Kubernetes 命名空间中的 Secret。
    2. 使用以下模板创建新的 SecretRotation 自定义资源:
      # rotation.yaml
      
      apiVersion: apigee.cloud.google.com/v1alpha1
      kind: SecretRotation
      metadata:
        name: ROTATION_PROCESS_NAME
        namespace: APIGEE_NAMESPACE
      spec:
        organizationId: ORG_NAME
        rotationId: ROTATION_ID
        timeoutMinutes: -1 # this value is required and should not be changed.
        precheck: true
        cassandra:
          oldSecretProviderClass: OLD_SPC_NAME
          newSecretProviderClass: NEW_SPC_NAME
          jobType: ROTATE
      
      • ROTATION_PROCESS_NAME:变换作业的唯一名称。您需要将 metadata.name 设置为变换预检作业和变换作业的唯一值。例如,sr-1-precheck 后跟 sr-1
      • ROTATION_ID:将 spec.rotationId 设置为自定义标识符,例如 rotation-1-precheck
      • NEW_SPC_NAME:将 spec.cassandra.newSecretProviderClass 设置为您在上一步中创建的新 Secret 提供程序类名称。
      • OLD_SPC_NAME:将 spec.cassandra.oldSecretProviderClass 设置为 ApigeeDatastore 当前使用的 SPC 名称。
    3. 通过应用 rotation.yaml 文件触发变换预检作业。
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    4. 检查作业状态,以验证预检作业何时完成。
      kubectl -n APIGEE_NAMESPACE get job sr-(rotationId)-(rotate|rollback|cleanup)-job
    5. 变换预检作业完成后:请执行以下操作:
      • 更改 metadata.name 的值,例如从 sr-1-precheck 更改为 sr-1
      • spec.precheck 设置为 false 以关闭预检并执行变换。
      • spec.rotationId 设置为新标识符,例如 rotation-1
    6. 再次应用该文件以执行变换。
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    7. 检查 SecretRotation 的状态,并等待状态变为 complete
      kubectl -n APIGEE_NAMESPACE get sr SR_NAME
  2. 在每个后续区域中,完成以下步骤:
    1. 在 Apigee 命名空间中为新的 Cassandra 凭据创建新的 SecretProviderClass Kubernetes 资源。如需查看要使用的模板,请参阅在 Hashicorp Vault 中存储 Cassandra Secret。此定义应与第 1a 步中的定义相同。
    2. 更新 overrides.yaml 并将 cassandra.auth.secretProviderClass 设置为与 rotation.yaml 文件中的 spec.cassandra.newSecretProviderClass 的值匹配。
      cassandra:
        auth:
          secretProviderClass: NEW_SPC_NAME
    3. 应用 Operator 图表:
      helm upgrade operator apigee-operator/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f OVERRIDES_FILE
    4. 系统会创建一个新的 ReplicaSet。检查新的 controller-manager Pod 是否使用了新的 SPC:
      export POD=NEW_CONTROLLER_MANAGER_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      结果应与您在 rotation.yaml 中为 spec.cassandra.newSecretProviderClass 设置的值一致,例如:

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
    5. 应用数据存储区图表:
      helm upgrade datastore apigee-datastore/ \
        --namespace APIGEE_NAMESPACE \
        --atomic \
        -f OVERRIDES_FILE
    6. 数据存储区将进入发布状态。等待数据存储区完成发布并处于运行状态。
      kubectl -n APIGEE_NAMESPACE get apigeedatastore DATASTORE_NAME

      在大多数安装中,DATASTORE_NAMEdefault

    7. 检查新的数据存储区 Pod 是否使用了新的 SPC:
      export POD=NEW_DATASTORE_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      结果应与您在 rotation.yaml 中为 spec.cassandra.newSecretProviderClass 设置的值一致,例如:

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
    8. 等待组织和环境完成发布并恢复为运行状态。
      kubectl -n APIGEE_NAMESPACE get apigeeorg ORG_NAME
      kubectl -n APIGEE_NAMESPACE get apigeeenv ENV_NAME
    9. 检查新的 MART、运行时和同步器 Pod 是否使用了新的 SPC:
      export POD=NEW_MART_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      export POD=NEW_RUNTIME_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      export POD=NEW_SYNCHRONIZER_POD_NAME
      kubectl -n APIGEE_NAMESPACE get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      

      结果应与您在 rotation.yaml 中为 spec.cassandra.newSecretProviderClass 设置的值一致,例如:

      kubectl -n apigee get pods $POD -o jsonpath='{.spec.volumes[?(@.name=="apigee-external-secrets")].csi.volumeAttributes.secretProviderClass}'
      
      my-new-spc
  3. 在每个区域完成相应步骤并验证流量仍在正常流动后,请按照以下两个步骤清理第一个区域中的流程:
    1. 在第一个区域中,更新 metadata.name 的值,并将 spec.cassandra.jobType 设置为 CLEANUP
    2. 通过应用该文件触发清理作业。
      kubectl -n APIGEE_NAMESPACE apply -f rotation.yaml
    3. 检查作业状态并查看作业日志,以验证清理作业何时完成。

    清理作业完成后,变换过程即告完成。

  4. 备份 Cassandra 数据库。此备份可确保能够恢复变换后的凭据。
  5. 从 Vault 中删除旧的 Cassandra 凭据、角色和政策。