使用自定义 cert-manager

非公开正式版:将自定义 cert-manager 与 Apigee Hybrid 搭配使用

此功能作为 Apigee Hybrid 1.13 的非公开正式版提供。

借助此功能,您可以选择使用受限权限为 Apigee Hybrid 安装具有修改后的基于角色的访问权限控制 (RBAC) 相关配置的 cert-manager。

准备工作

在继续执行安装步骤之前,请使用以下命令下载 Helm 图表:

export CHART_REPO=oci://us-docker.pkg.dev/apigee-release/apigee-hybrid-helm-charts
export CERT_MANAGER_VERSION=v1.14.5
helm pull $CHART_REPO/apigee-cert-manager --version $CERT_MANAGER_VERSION --untar

设置自定义 cert-manager

设置自定义 cert-manager 需要执行以下步骤:

  1. 全新安装自定义 cert-manager
  2. 升级到自定义 cert-manager

全新安装自定义 cert-manager

如需执行自定义 cert-manager 的全新安装以用于 Apigee Hybrid,请完成以下步骤:

  1. 使用以下命令通过 kubectl 安装 CRD:
    export CERT_MANAGER_VERSION=v1.14.5
    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.crds.yaml
    
  2. 使用 Helm 图表安装 cert-manager 组件。
    helm install CERT_MANAGER_RELEASE_NAME apigee-cert-manager/ \
      --namespace APIGEE_NAMESPACE

    之后,当有新版本的图表可用时,您可以使用 helm upgrade 进行升级:

    helm upgrade CERT_MANAGER_RELEASE_NAME apigee-cert-manager/ \
      --namespace APIGEE_NAMESPACE

升级到自定义 cert-manager

如需从现有的非自定义 cert-manager 迁移到自定义版本,请按以下步骤操作。在给定的时间点,集群中只能运行一个 cert-manager。

  1. 停用现有网络钩子,并将部署更新为没有副本,以实现无缝迁移:
      kubectl delete validatingwebhookconfiguration cert-manager-webhook
      kubectl delete mutatingwebhookconfiguration cert-manager-webhook
    
        # set the replicas to 0
    
      kubectl scale deployment cert-manager -n cert-manager --replicas=0
      kubectl scale deployment cert-manager-cainjector -n cert-manager --replicas=0
      kubectl scale deployment cert-manager-webhook -n cert-manager --replicas=0
  2. 安装 CRD:
    kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/${CERT_MANAGER_VERION}/cert-manager.crds.yaml
  3. 安装自定义 cert-manager:
    helm install CERT_MANAGER_RELEASE_NAME apigee-cert-manager/ \
      --namespace APIGEE_NAMESPACE
  4. 安装完成后,您可以删除之前安装的 cert-manager。

使用自定义 cert-manager 安装或升级 Apigee Hybrid

使用自定义 cert-manager 安装或升级 Hybrid 需要对安装或升级过程进行以下更改。

Apigee Hybrid 安装的更改

使用自定义 cert-manager 安装 Apigee Hybrid v1.13 或更高版本时,请在第 10 步:使用 Helm 安装 Apigee Hybrid 中安装 Apigee Hybrid 组件之前,在 overrides.yaml 文件中进行以下更改。

更新 overrides.yaml 文件,以通知操作符在何处查找与 cert-manager 相关的资源,并使操作符能够使用自定义 cert-manager 的签发者。

certManager:
  namespace: APIGEE_NAMESPACE

ao:
  certManagerCAIssuerEnabled: true

Apigee Hybrid 升级流程的变化

使用自定义 cert-manager 将 Apigee Hybrid 升级到 v1.13 或更高版本时,请在为 Helm 图表升级做好准备中的步骤之后安装 Apigee Hybrid Helm 图表之前进行以下更改:

  1. overrides.yaml 文件中进行以下更改,以通知操作符在哪里可以找到与 cert-manager 相关的资源,并使操作符能够使用自定义 cert-manager 的 ClusterIssuer。
    certManager:
      namespace: APIGEE_NAMESPACE
    
    ao:
      certManagerCAIssuerEnabled: true
    
  2. 将现有的 apigee-ca Secret 从 cert-manager 命名空间复制到 apigee 命名空间:
    kubectl -n cert-manager get secret apigee-ca -o yaml > apigee-ca.yaml
    
  3. 修改 apigee-ca.yaml 文件,移除将命名空间标识为 cert-manager 的命名空间参数。
  4. 使用 kubectl applyapigee-ca Secret 应用于 Apigee 命名空间:
    kubectl -n APIGEE_NAMESPACE apply -f apigee-ca.yaml

回滚 Apigee Hybrid 升级

如果您需要回滚到先前版本的 Apigee Hybrid,请按照回滚到先前版本中的说明操作。

回滚和卸载自定义 cert-manager

回滚自定义 cert-manager

如需回滚自定义 cert-manager,按照以下步骤操作:

  1. 使用以下命令卸载 Helm 版本:
    helm uninstall CERT_MANAGER_RELEASE_NAME
  2. 使用您偏好的方法安装常规(非自定义)cert-manager。请务必使用相应的 CRD 版本。 例如,如果您使用 kubectl 方法安装 cert-manager,它会将 CRD 更新为相应的版本,因为载荷也将包含 CRD。确保您使用的安装方法包含 CRD。

卸载自定义 cert-manager

如需卸载自定义 cert-manager,请按照以下步骤操作:

  1. 使用以下命令卸载 Helm 版本:
    helm uninstall CERT_MANAGER_RELEASE_NAME
  2. 使用以下命令删除 CRD:
    export CERT_MANAGER_VERSION=v1.14.5
    kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/${CERT_MANAGER_VERSION}/cert-manager.crds.yaml

基础架构即代码 (overrides.yaml)

Helm 图表支持根据需要进行替换,让您可以在安装或升级过程中根据需要使用替换文件。为避免混淆,我们建议使用类似 cert-manager-overrides.yaml 的文件名。

如需了解所有支持的 cert-manager 替换配置,请参阅 cert-manager 文档

常见 cert-manager 配置

以下示例展示了如何在 Apigee Hybrid 中完成一些常见的 cert-manager 配置。

替换映像

如果您需要以私密方式托管映像,下面的示例演示如何替换映像以及 imagepullsecrets

# cert-manager-overrides.yaml

global:
  # Reference to one or more secrets to be used when pulling images
  # ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/
  #
  # For example:
  #  imagePullSecrets:
  #    - name: "image-pull-secret"
  imagePullSecrets: []


image:
  # Override the image tag to deploy by setting this variable.
  # If no value is set, the chart's appVersion will be used.
  repository: quay.io/jetstack/cert-manager-controller

webhook:
  image:
    # without a tag
    repository: quay.io/jetstack/cert-manager-webhook

cainjector:
  image:
    # without a tag
    repository: quay.io/jetstack/cert-manager-cainjector

startupapicheck:
  image:
    # without a tag
    repository: quay.io/jetstack/cert-manager-startupapicheck

NodeSelector 和节点亲和性

在 Apigee Hybrid 安装中,您必须为 Cassandra Pod 和其他 Pod 使用单独的节点。 如果您想在与 Cassandra 无关的节点池中运行 cert-manager,可以使用节点亲和性:

# A Kubernetes Affinity, if required; see https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#affinity-v1-core
#
# For example:
#   affinity:
#     nodeAffinity:
#      requiredDuringSchedulingIgnoredDuringExecution:
#        nodeSelectorTerms:
#        - matchExpressions:
#          - key: cloud.google.com/gke-nodepool
#            operator: In
#            values:
#            - master
affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: KEY
          operator: In
          values:
          - value for the non-C* node pool

webhook:
  affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: KEY
          operator: In
          values:
          - value for the non-C* node pool

cainjector:
  affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: KEY
          operator: In
          values:
          - value for the non C* node pool

容忍

您还可以提供容忍,如以下示例所示:

# A list of Kubernetes Tolerations, if required; see https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.27/#toleration-v1-core
#
# For example:
#   tolerations:
#   - key: node.kubernetes.io/not-ready
#     operator: Equal
#     value: master
#     effect: NoSchedule
tolerations: []

webhook:
  tolerations: []

cainjector:
  tolerations: []

startupapicheck:
  tolerations: []