×

您可以通过配置云凭据来对集群上的 Red Hat OpenShift 的 cert-manager 运算符进行身份验证。

在 AWS 上进行身份验证

先决条件
  • 您已安装 1.11.1 或更高版本的 Red Hat OpenShift 的 cert-manager 运算符。

  • 您已将 Cloud Credential Operator 配置为在 *mint* 或 *passthrough* 模式下运行。

步骤
  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 运算符的订阅对象

    $ 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

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

先决条件
  • 您已提取并准备了 `ccoctl` 二进制文件。

  • 您已使用 Cloud Credential Operator 在手动模式下使用 AWS STS 配置了 OpenShift Container Platform 集群。

步骤
  1. 通过运行以下命令创建一个目录来存储 `CredentialsRequest` 资源 YAML 文件

    $ mkdir credentials-request
  2. 在 `credentials-request` 目录下创建一个 `CredentialsRequest` 资源 YAML 文件,例如 `sample-credential-request.yaml`,方法是应用以下 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

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

  4. 通过运行以下命令将 `eks.amazonaws.com/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 凭据将在 1 分钟内应用于新的 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

在 GCP 上进行身份验证

先决条件
  • 您已安装 1.11.1 或更高版本的 Red Hat OpenShift 的 cert-manager 运算符。

  • 您已将 Cloud Credential Operator 配置为在 *mint* 或 *passthrough* 模式下运行。

步骤
  1. 创建一个 `CredentialsRequest` 资源 YAML 文件,例如 `sample-credential-request.yaml`,方法是应用以下 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 运算符的订阅对象

    $ 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

使用 GCP 工作负载身份进行身份验证

先决条件
  • 您已提取并准备了 `ccoctl` 二进制文件。

  • 您已安装 1.11.1 或更高版本的 Red Hat OpenShift 的 cert-manager 运算符。

  • 您已使用 Cloud Credential Operator 在手动模式下使用 GCP 工作负载身份配置了 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 目录中生成的密钥

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

    $ 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