9.6. cert-manager Operator for Red Hat OpenShift 인증
클라우드 인증 정보를 구성하여 클러스터에서 cert-manager Operator for Red Hat OpenShift를 인증할 수 있습니다.
9.6.1. AWS에서 인증
사전 요구 사항
- Red Hat OpenShift용 cert-manager Operator 버전 1.11.1 이상이 설치되어 있어야 합니다.
- mint 또는 passthrough 모드에서 작동하도록 Cloud Credential Operator를 구성했습니다.
프로세스
다음과 같이
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
다음 명령을 실행하여
CredentialsRequest
리소스를 생성합니다.$ oc create -f sample-credential-request.yaml
다음 명령을 실행하여 cert-manager Operator for Red Hat OpenShift의 서브스크립션 오브젝트를 업데이트합니다.
$ 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"}]}}}'
검증
다음 명령을 실행하여 재배포된 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
다음 명령을 실행하여 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 클러스터를 구성했습니다.
프로세스
다음 명령을 실행하여
CredentialsRequest
리소스 YAML 파일을 저장할 디렉터리를 생성합니다.$ mkdir credentials-request
다음 yaml을 적용하여
credentials-request
디렉터리(예:sample-credential-request.yaml
)에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: 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
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
>을 복사합니다. For example,"arn:aws:iam::XXXXXXXXXXXX:role/<user_defined_name>-cert-manager-aws-creds"
다음 명령을 실행하여
eks.amazonaws.com/role-arn="<aws_role_arn>"
주석을 서비스 계정에 추가합니다.$ oc -n cert-manager annotate serviceaccount cert-manager eks.amazonaws.com/role-arn="<aws_role_arn>"
새 Pod를 생성하려면 다음 명령을 실행하여 기존 cert-manager 컨트롤러 Pod를 삭제합니다.
$ oc delete pods -l app.kubernetes.io/name=cert-manager -n cert-manager
AWS 인증 정보는 1분 이내에 새 cert-manager 컨트롤러 Pod에 적용됩니다.
검증
다음 명령을 실행하여 업데이트된 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
다음 명령을 실행하여 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용 cert-manager Operator 버전 1.11.1 이상이 설치되어 있어야 합니다.
- mint 또는 passthrough 모드에서 작동하도록 Cloud Credential Operator를 구성했습니다.
프로세스
다음 yaml을 적용하여
sample-credential-request.yaml
과 같은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
-
다음 명령을 실행하여
CredentialsRequest
리소스를 생성합니다.$ oc create -f sample-credential-request.yaml
다음 명령을 실행하여 cert-manager Operator for Red Hat OpenShift의 서브스크립션 오브젝트를 업데이트합니다.
$ 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"}]}}}'
검증
다음 명령을 실행하여 재배포된 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
다음 명령을 실행하여 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 워크로드 ID로 인증
사전 요구 사항
-
ccoctl
바이너리를 추출하여 준비합니다. - Red Hat OpenShift용 cert-manager Operator 버전 1.11.1 이상이 설치되어 있어야 합니다.
- 수동 모드에서 Cloud Credential Operator를 사용하여 GCP 워크로드 ID로 OpenShift Container Platform 클러스터를 구성했습니다.
프로세스
다음 명령을 실행하여
CredentialsRequest
리소스 YAML 파일을 저장할 디렉터리를 생성합니다.$ mkdir credentials-request
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
-
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
다음 명령을 실행하여 클러스터의 매니페스트 디렉터리에 생성된 보안을 적용합니다.
$ ls <path_to_output_dir>/manifests/*-credentials.yaml | xargs -I{} oc apply -f {}
다음 명령을 실행하여 cert-manager Operator for Red Hat OpenShift의 서브스크립션 오브젝트를 업데이트합니다.
$ 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"}]}}}'
검증
다음 명령을 실행하여 재배포된 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
다음 명령을 실행하여 cert-manager 컨트롤러 Pod가
mountPath
에 지정된 경로에 마운트된 GCP 워크로드 ID 인증 정보 볼륨으로 업데이트되었는지 확인합니다.$ 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