5.10.3. Microsoft Entra Workload ID가 있는 OLM 관리 Operator의 CCO 기반 워크플로


Azure에서 실행되는 OpenShift Container Platform 클러스터가 Workload Identity / Federated Identity 모드에 있는 경우 클러스터가 Azure 및 OpenShift Container Platform의 기능을 활용하여 애플리케이션 수준에서 사용자가 할당한 관리 ID 또는 앱 등록을 적용합니다.

CCO(Cloud Credential Operator)는 기본적으로 클라우드 공급자에서 실행되는 OpenShift Container Platform 클러스터에 설치된 클러스터 Operator입니다. OpenShift Container Platform 4.14.8부터 CCO는 워크로드 ID가 있는 OLM 관리 Operator의 워크플로우를 지원합니다.

Workload ID의 목적을 위해 CCO는 다음 기능을 제공합니다.

  • 워크로드 ID 지원 클러스터에서 실행 중인 시기 감지
  • Azure 리소스에 대한 Operator 액세스 권한을 부여하는 데 필요한 정보를 제공하는 CredentialsRequest 오브젝트에 필드가 있는지 확인합니다.

CCO는 워크로드 ID 워크플로에 필요한 정보가 포함된 시크릿 생성을 요청할 수 있는 CredentialsRequest 오브젝트의 확장된 사용을 통해 이 프로세스를 반자동화할 수 있습니다.

참고

자동 업데이트 승인이 있는 서브스크립션은 업데이트하기 전에 권한을 변경할 수 있으므로 권장되지 않습니다. 수동 업데이트 승인이 있는 서브스크립션을 통해 관리자는 최신 버전의 권한을 확인하고 업데이트 전에 필요한 단계를 수행할 수 있습니다.

OpenShift Container Platform 4.14 이상에서 업데이트된 CCO와 함께 Operator를 사용할 수 있도록 Operator 작성자로서 Workload ID 토큰 인증(Operator가 아직 활성화되지 않은 경우)을 처리하는 것 외에도 사용자와 이전 CCO 버전의 차이점을 처리하도록 코드를 추가해야 합니다. 권장 방법은 Workload ID 관련 필드가 올바르게 채워진 CredentialsRequest 오브젝트를 제공하고 CCO가 Secret 오브젝트를 생성하도록 하는 것입니다.

중요

버전 4.14 이전의 OpenShift Container Platform 클러스터를 지원하려는 경우 CCO 유틸리티(ccoctl)를 사용하여 워크로드 ID를 사용하여 시크릿을 수동으로 생성하는 방법에 대한 지침을 사용자에게 제공하는 것이 좋습니다. 이전 CCO 버전은 클러스터에서 Workload ID 모드를 인식하지 못하며 시크릿을 생성할 수 없습니다.

코드는 나타나지 않는 시크릿을 확인하고 사용자가 제공한 대체 지침을 따르도록 경고해야 합니다.

Workload ID를 사용한 인증에는 다음 정보가 필요합니다.

  • azure_client_id
  • azure_tenant_id
  • azure_region
  • azure_subscription_id
  • azure_federated_token_file

클러스터 관리자는 웹 콘솔의 Operator 설치 페이지를 통해 설치 시 이 정보를 제공할 수 있습니다. 그런 다음 이 정보는 Subscription 오브젝트에 Operator Pod의 환경 변수로 전파됩니다.

OLM(Operator Lifecycle Manager)에서 프로젝트를 실행하도록 프로젝트를 설계하는 Operator 작성자는 CCO(Cloud Credential Operator)를 지원하도록 프로젝트를 사용자 정의하여 Operator에서 Microsoft Entra Workload ID 지원 OpenShift Container Platform 클러스터에 대해 인증할 수 있습니다.

이 방법을 사용하면 Operator에서 CredentialsRequest 오브젝트를 생성합니다. 즉 Operator에 이러한 오브젝트를 생성하려면 RBAC 권한이 필요합니다. 그런 다음 Operator에서 결과 Secret 오브젝트를 읽을 수 있어야 합니다.

참고

기본적으로 Operator 배포와 관련된 Pod는 serviceAccountToken 볼륨을 마운트하여 결과 Secret 오브젝트에서 서비스 계정 토큰을 참조할 수 있습니다.

사전 요구 사항

  • OpenShift Container Platform 4.14 이상
  • 워크로드 ID 모드의 클러스터
  • OLM 기반 Operator 프로젝트

프로세스

  1. Operator 프로젝트의 CSV( ClusterServiceVersion ) 오브젝트를 업데이트합니다.

    1. Operator에 CredentialsRequests 오브젝트를 생성할 수 있는 RBAC 권한이 있는지 확인합니다.

      예 5.23. clusterPermissions 목록의 예

      # ...
      install:
        spec:
          clusterPermissions:
          - rules:
            - apiGroups:
              - "cloudcredential.openshift.io"
              resources:
              - credentialsrequests
              verbs:
              - create
              - delete
              - get
              - list
              - patch
              - update
              - watch
    2. Workload ID를 사용하여 CCO 기반 워크플로우 방법에 대한 지원을 요청하려면 다음 주석을 추가합니다.

      # ...
      metadata:
       annotations:
         features.operators.openshift.io/token-auth-azure: "true"
  2. Operator 프로젝트 코드를 업데이트합니다.

    1. Subscription 오브젝트를 통해 포드에 설정된 환경 변수에서 클라이언트 ID, 테넌트 ID, 서브스크립션 ID를 가져옵니다. 예를 들면 다음과 같습니다.

      // Get ENV var
      clientID := os.Getenv("CLIENTID")
      tenantID := os.Getenv("TENANTID")
      subscriptionID := os.Getenv("SUBSCRIPTIONID")
      azureFederatedTokenFile := "/var/run/secrets/openshift/serviceaccount/token"
    2. CredentialsRequest 개체를 패치하고 적용할 준비가 되었는지 확인합니다.

      참고

      Operator 번들에 CredentialsRequest 오브젝트를 추가하는 것은 현재 지원되지 않습니다.

    3. 인증 정보 및 웹 ID 토큰 경로를 인증 정보 요청에 추가하고 Operator 초기화 중에 적용합니다.

      예 5.24. Operator 초기화 중 CredentialsRequest 오브젝트 적용 예

      // apply credentialsRequest on install
      credReqTemplate.Spec.AzureProviderSpec.AzureClientID = clientID
      credReqTemplate.Spec.AzureProviderSpec.AzureTenantID = tenantID
      credReqTemplate.Spec.AzureProviderSpec.AzureRegion = "centralus"
      credReqTemplate.Spec.AzureProviderSpec.AzureSubscriptionID = subscriptionID
      credReqTemplate.CloudTokenPath = azureFederatedTokenFile
      
      c := mgr.GetClient()
      if err := c.Create(context.TODO(), credReq); err != nil {
          if !errors.IsAlreadyExists(err) {
              setupLog.Error(err, "unable to create CredRequest")
              os.Exit(1)
          }
      }
    4. Operator에서 조정 중인 다른 항목과 함께 호출되는 다음 예와 같이 Operator가 CCO에서 Secret 오브젝트가 표시될 때까지 기다릴 수 있습니다.

      예 5.25. Secret 오브젝트 대기의 예

      // WaitForSecret is a function that takes a Kubernetes client, a namespace, and a v1 "k8s.io/api/core/v1" name as arguments
      // It waits until the secret object with the given name exists in the given namespace
      // It returns the secret object or an error if the timeout is exceeded
      func WaitForSecret(client kubernetes.Interface, namespace, name string) (*v1.Secret, error) {
        // set a timeout of 10 minutes
        timeout := time.After(10 * time.Minute) 
      1
      
      
        // set a polling interval of 10 seconds
        ticker := time.NewTicker(10 * time.Second)
      
        // loop until the timeout or the secret is found
        for {
           select {
           case <-timeout:
              // timeout is exceeded, return an error
              return nil, fmt.Errorf("timed out waiting for secret %s in namespace %s", name, namespace)
                 // add to this error with a pointer to instructions for following a manual path to a Secret that will work on STS
           case <-ticker.C:
              // polling interval is reached, try to get the secret
              secret, err := client.CoreV1().Secrets(namespace).Get(context.Background(), name, metav1.GetOptions{})
              if err != nil {
                 if errors.IsNotFound(err) {
                    // secret does not exist yet, continue waiting
                    continue
                 } else {
                    // some other error occurred, return it
                    return nil, err
                 }
              } else {
                 // secret is found, return it
                 return secret, nil
              }
           }
        }
      }
      1
      시간 초과 값은 CCO에서 추가된 CredentialsRequest 오브젝트를 감지하고 Secret 오브젝트를 생성하는 속도의 추정치를 기반으로 합니다. Operator가 아직 클라우드 리소스에 액세스하지 않는 이유를 확인할 수 있는 클러스터 관리자에게 시간을 낮추거나 사용자 정의 피드백을 생성하는 것을 고려할 수 있습니다.
    5. Azure로 인증하고 필요한 인증 정보를 수신하기 위해 CredentialsRequest 오브젝트에서 CCO에서 생성한 시크릿을 읽습니다.
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 문서 정보

Legal Notice

Theme

© 2026 Red Hat
맨 위로 이동