搜索

9.6. 为 Red Hat OpenShift 验证 cert-manager Operator

download PDF

您可以通过配置云凭证,为集群中的 Red Hat OpenShift 验证 cert-manager Operator。

9.6.1. 在 AWS 上进行身份验证

先决条件

  • 您已为 Red Hat OpenShift 1.11.1 或更高版本安装了 cert-manager Operator。
  • 您已将 Cloud Credential Operator 配置为以 mintpassthrough 模式运行。

流程

  1. 创建一个 CredentialsRequest 资源 YAML 文件,如 sample-credential-request.yaml,如下所示:

    apiVersion: cloudcredential.openshift.io/v1
    kind: CredentialsRequest
    metadata:
      name: cert-manager
      namespace: openshift-cloud-credential-operator
    spec:
      providerSpec:
        apiVersion: cloudcredential.openshift.io/v1
        kind: AWSProviderSpec
        statementEntries:
        - action:
          - "route53:GetChange"
          effect: Allow
          resource: "arn:aws:route53:::change/*"
        - action:
          - "route53:ChangeResourceRecordSets"
          - "route53:ListResourceRecordSets"
          effect: Allow
          resource: "arn:aws:route53:::hostedzone/*"
        - action:
          - "route53:ListHostedZonesByName"
          effect: Allow
          resource: "*"
      secretRef:
        name: aws-creds
        namespace: cert-manager
      serviceAccountNames:
      - cert-manager
  2. 运行以下命令来创建 CredentialsRequest 资源:

    $ oc create -f sample-credential-request.yaml
  3. 运行以下命令,为 Red Hat OpenShift 更新 cert-manager Operator 的订阅对象:

    $ oc -n cert-manager-operator patch subscription openshift-cert-manager-operator --type=merge -p '{"spec":{"config":{"env":[{"name":"CLOUD_CREDENTIALS_SECRET_NAME","value":"aws-creds"}]}}}'

验证

  1. 运行以下命令,获取重新部署的 cert-manager 控制器 pod 的名称:

    $ oc get pods -l app.kubernetes.io/name=cert-manager -n cert-manager

    输出示例

    NAME                          READY   STATUS    RESTARTS   AGE
    cert-manager-bd7fbb9fc-wvbbt  1/1     Running   0          15m39s

  2. 运行以下命令,验证 cert-manager 控制器 pod 是否使用挂载在 mountPath 中指定的路径下的 AWS 凭证卷更新:

    $ oc get -n cert-manager pod/<cert-manager_controller_pod_name> -o yaml

    输出示例

    ...
    spec:
      containers:
      - args:
        ...
        - mountPath: /.aws
          name: cloud-credentials
      ...
      volumes:
      ...
      - name: cloud-credentials
        secret:
          ...
          secretName: aws-creds

9.6.2. 使用 AWS 安全令牌服务进行身份验证

先决条件

  • 您已提取并准备好 ccoctl 二进制文件。
  • 已使用手动模式的 Cloud Credential Operator 配置了一个带有 AWS STS 的 OpenShift Container Platform 集群。

流程

  1. 运行以下命令,创建一个目录来存储 CredentialsRequest 资源 YAML 文件:

    $ mkdir credentials-request
  2. 通过应用以下 yaml,在 credentials-request 目录下创建一个 CredentialsRequest 资源 YAML 文件,如 sample-credential-request.yaml

    apiVersion: cloudcredential.openshift.io/v1
    kind: CredentialsRequest
    metadata:
      name: cert-manager
      namespace: openshift-cloud-credential-operator
    spec:
      providerSpec:
        apiVersion: cloudcredential.openshift.io/v1
        kind: AWSProviderSpec
        statementEntries:
        - action:
          - "route53:GetChange"
          effect: Allow
          resource: "arn:aws:route53:::change/*"
        - action:
          - "route53:ChangeResourceRecordSets"
          - "route53:ListResourceRecordSets"
          effect: Allow
          resource: "arn:aws:route53:::hostedzone/*"
        - action:
          - "route53:ListHostedZonesByName"
          effect: Allow
          resource: "*"
      secretRef:
        name: aws-creds
        namespace: cert-manager
      serviceAccountNames:
      - cert-manager
  3. 运行以下命令,使用 ccoctl 工具处理 CredentialsRequest 对象:

    $ ccoctl aws create-iam-roles \
        --name <user_defined_name> --region=<aws_region> \
        --credentials-requests-dir=<path_to_credrequests_dir> \
        --identity-provider-arn <oidc_provider_arn> --output-dir=<path_to_output_dir>

    输出示例

    2023/05/15 18:10:34 Role arn:aws:iam::XXXXXXXXXXXX:role/<user_defined_name>-cert-manager-aws-creds created
    2023/05/15 18:10:34 Saved credentials configuration to: <path_to_output_dir>/manifests/cert-manager-aws-creds-credentials.yaml
    2023/05/15 18:10:35 Updated Role policy for Role <user_defined_name>-cert-manager-aws-creds

    从输出中复制 <aws_role_arn> 以在下一步中使用。例如,"arn:aws:iam::XXXXXXXXXXXX:role/<user_defined_name>-cert-manager-aws-creds"

  4. 运行以下命令,将 eks.amazonaws.com/role-arn="<aws_role_arn>" 注解添加到服务帐户:

    $ oc -n cert-manager annotate serviceaccount cert-manager eks.amazonaws.com/role-arn="<aws_role_arn>"
  5. 要创建新 pod,请运行以下命令删除现有 cert-manager 控制器 pod:

    $ oc delete pods -l app.kubernetes.io/name=cert-manager -n cert-manager

    AWS 凭证在一分钟内应用到一个新的 cert-manager 控制器 pod。

验证

  1. 运行以下命令,获取更新的 cert-manager 控制器 pod 的名称:

    $ oc get pods -l app.kubernetes.io/name=cert-manager -n cert-manager

    输出示例

    NAME                          READY   STATUS    RESTARTS   AGE
    cert-manager-bd7fbb9fc-wvbbt  1/1     Running   0          39s

  2. 运行以下命令验证 AWS 凭证是否已更新:

    $ oc set env -n cert-manager po/<cert_manager_controller_pod_name> --list

    输出示例

    # pods/cert-manager-57f9555c54-vbcpg, container cert-manager-controller
    # POD_NAMESPACE from field path metadata.namespace
    AWS_ROLE_ARN=XXXXXXXXXXXX
    AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token

9.6.3. 在 GCP 上进行身份验证

先决条件

  • 您已为 Red Hat OpenShift 1.11.1 或更高版本安装了 cert-manager Operator。
  • 您已将 Cloud Credential Operator 配置为以 mintpassthrough 模式运行。

流程

  1. 通过应用以下 yaml 创建 CredentialsRequest 资源 YAML 文件,如 sample-credential-request.yaml

    apiVersion: cloudcredential.openshift.io/v1
    kind: CredentialsRequest
    metadata:
      name: cert-manager
      namespace: openshift-cloud-credential-operator
    spec:
      providerSpec:
        apiVersion: cloudcredential.openshift.io/v1
        kind: GCPProviderSpec
        predefinedRoles:
        - roles/dns.admin
      secretRef:
        name: gcp-credentials
        namespace: cert-manager
      serviceAccountNames:
      - cert-manager
    注意

    dns.admin 角色为管理 Google Cloud DNS 资源的服务帐户提供管理员特权。要确保 cert-manager 使用具有最小权限的服务帐户运行,您可以创建一个具有以下权限的自定义角色:

    • dns.resourceRecordSets.*
    • dns.changes.*
    • dns.managedZones.list
  2. 运行以下命令来创建 CredentialsRequest 资源:

    $ oc create -f sample-credential-request.yaml
  3. 运行以下命令,为 Red Hat OpenShift 更新 cert-manager Operator 的订阅对象:

    $ oc -n cert-manager-operator patch subscription openshift-cert-manager-operator --type=merge -p '{"spec":{"config":{"env":[{"name":"CLOUD_CREDENTIALS_SECRET_NAME","value":"gcp-credentials"}]}}}'

验证

  1. 运行以下命令,获取重新部署的 cert-manager 控制器 pod 的名称:

    $ oc get pods -l app.kubernetes.io/name=cert-manager -n cert-manager

    输出示例

    NAME                                       READY   STATUS    RESTARTS   AGE
    cert-manager-bd7fbb9fc-wvbbt               1/1     Running   0          15m39s

  2. 运行以下命令,验证 cert-manager 控制器 pod 是否使用挂载在 mountPath 中指定的路径下的 GCP 凭证卷更新:

    $ oc get -n cert-manager pod/<cert-manager_controller_pod_name> -o yaml

    输出示例

    spec:
      containers:
      - args:
        ...
        volumeMounts:
        ...
        - mountPath: /.config/gcloud
          name: cloud-credentials
        ....
      volumes:
      ...
      - name: cloud-credentials
        secret:
          ...
          items:
          - key: service_account.json
            path: application_default_credentials.json
          secretName: gcp-credentials

9.6.4. 使用 GCP Workload Identity 进行身份验证

先决条件

  • 已提取并准备好 ccoctl 二进制文件。
  • 安装了 Red Hat OpenShift 1.11.1 或更高版本的 cert-manager Operator。
  • 您已在手动模式中使用 Cloud Credential Operator 配置了一个带有 GCP Workload Identity 的 OpenShift Container Platform 集群。

流程

  1. 运行以下命令,创建一个目录来存储 CredentialsRequest 资源 YAML 文件:

    $ mkdir credentials-request
  2. credentials-request 目录中,创建一个包含以下 CredentialsRequest 清单的 YAML 文件:

    apiVersion: cloudcredential.openshift.io/v1
    kind: CredentialsRequest
    metadata:
      name: cert-manager
      namespace: openshift-cloud-credential-operator
    spec:
      providerSpec:
        apiVersion: cloudcredential.openshift.io/v1
        kind: GCPProviderSpec
        predefinedRoles:
        - roles/dns.admin
      secretRef:
        name: gcp-credentials
        namespace: cert-manager
      serviceAccountNames:
      - cert-manager
    注意

    dns.admin 角色为管理 Google Cloud DNS 资源的服务帐户提供管理员特权。要确保 cert-manager 使用具有最小权限的服务帐户运行,您可以创建一个具有以下权限的自定义角色:

    • dns.resourceRecordSets.*
    • dns.changes.*
    • dns.managedZones.list
  3. 运行以下命令,使用 ccoctl 工具处理 CredentialsRequest 对象:

    $ ccoctl gcp create-service-accounts \
        --name <user_defined_name> --output-dir=<path_to_output_dir> \
        --credentials-requests-dir=<path_to_credrequests_dir> \
        --workload-identity-pool <workload_identity_pool> \
        --workload-identity-provider <workload_identity_provider> \
        --project <gcp_project_id>

    示例命令

    $ ccoctl gcp create-service-accounts \
        --name abcde-20230525-4bac2781 --output-dir=/home/outputdir \
        --credentials-requests-dir=/home/credentials-requests \
        --workload-identity-pool abcde-20230525-4bac2781 \
        --workload-identity-provider abcde-20230525-4bac2781 \
        --project openshift-gcp-devel

  4. 运行以下命令应用在集群 manifests 目录中生成的 secret:

    $ ls <path_to_output_dir>/manifests/*-credentials.yaml | xargs -I{} oc apply -f {}
  5. 运行以下命令,为 Red Hat OpenShift 更新 cert-manager Operator 的订阅对象:

    $ oc -n cert-manager-operator patch subscription openshift-cert-manager-operator --type=merge -p '{"spec":{"config":{"env":[{"name":"CLOUD_CREDENTIALS_SECRET_NAME","value":"gcp-credentials"}]}}}'

验证

  1. 运行以下命令,获取重新部署的 cert-manager 控制器 pod 的名称:

    $ oc get pods -l app.kubernetes.io/name=cert-manager -n cert-manager

    输出示例

    NAME                          READY   STATUS    RESTARTS   AGE
    cert-manager-bd7fbb9fc-wvbbt  1/1     Running   0          15m39s

  2. 运行以下命令,验证 cert-manager 控制器 pod 是否已使用挂载到 mountPath 中指定的路径下的 GCP 工作负载身份凭证卷更新:

    $ oc get -n cert-manager pod/<cert-manager_controller_pod_name> -o yaml

    输出示例

    spec:
      containers:
      - args:
        ...
        volumeMounts:
        - mountPath: /var/run/secrets/openshift/serviceaccount
          name: bound-sa-token
          ...
        - mountPath: /.config/gcloud
          name: cloud-credentials
      ...
      volumes:
      - name: bound-sa-token
        projected:
          ...
          sources:
          - serviceAccountToken:
              audience: openshift
              ...
              path: token
      - name: cloud-credentials
        secret:
          ...
          items:
          - key: service_account.json
            path: application_default_credentials.json
          secretName: gcp-credentials

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.