Trial 및 Standard 요금제를 사용하여 Kubernetes 클러스터에서 실행되는 앱의 기밀 정보를 보호하세요

이 튜토리얼에서는 외부 시크릿 운영자 오픈 소스 도구를 사용하여 IBM Cloud® Secrets Manager 를 사용하여 IBM Cloud Kubernetes Service 클러스터를 실행하는 애플리케이션의 시크릿을 관리하는 방법을 학습합니다.

또는 Kubernetes Service CLI 플러그인을 사용하여 TLS 및 TLS 이외의 비밀 번호를 관리할 수 있습니다. 이 접근 방식에 대해 자세히 알아보려면 Kubernetes 인그레스 설정을 참조하세요.

귀하는 한 조직의 개발자이며, 귀하의 팀은 Kubernetes Service 를 사용하여 IBM Cloud 에 컨테이너화된 앱과 서비스를 배포하고 있습니다. 현재 워크플로에서는 Kubernetes Secrets를 사용하여 클러스터에서 실행되는 앱과 서비스에서 사용되는 비밀번호 및 API 키와 같은 민감한 데이터를 저장합니다. 애플리케이션 시크릿을 더 제어하기 위해 저장 데이터를 암호화하고, 활동을 모니터링하고, 쉽게 관리할 수 있는 외부 시크릿 관리 서비스의 클러스터 시크릿을 저장하는 기능을 사용하려고 합니다.

Secrets Manager를 사용하면 Kubernetes 클러스터에서 실행되는 앱에서 사용하는 시크릿을 중앙 집중화하고 보호할 수 있습니다. 배치 시 시크릿을 삽입하지 않고, 런타임 시 Secrets Manager의 시크릿을 안전하게 검색하도록 앱을 구성할 수 있습니다. 시크릿을 순환할 때 Secrets Manager에서 수행할 수 있습니다. 예를 들어, 다음 시나리오를 고려하십시오.

이 다이어그램은 Secrets Manager 과 사용자의 Kubernetes 클러스터 간의 기본 흐름 과정을 보여줍니다.
외부 시크릿 흐름

  1. 개발자로서 Secrets Manager를 사용하여 Kubernetes 클러스터에 배치할 애플리케이션의 시크릿을 저장합니다.
  2. Secrets Manager에서는 시크릿의 ID를 제공합니다. 앱의 ExternalSecrets 구성 파일에 ID를 포함시키고 구성을 클러스터에 적용합니다.
  3. 외부 시크릿 컨트롤러는 Kubernetes API를 사용하여 정의한 구성 파일에서 ExternalSecrets 오브젝트를 페치합니다.
  4. 애플리케이션 런타임 시 컨트롤러는 Secrets Manager에서 비밀 데이터를 검색하고 ExternalSecrets 오브젝트를 클러스터의 Kubernetes 시크릿으로 변환합니다.

이 시나리오는 Kubernetes 클러스터에서 실행되는 워크로드의 규제 준수 준비 상태에 영향을 줄 수 있는 써드파티 도구를 제공합니다. 커뮤니티 또는 타사 도구를 추가하는 경우, 앱의 규정 준수 상태를 유지하는 것은 사용자의 책임이며, 문제가 발생할 경우 해당 제공업체와 협력하여 문제를 해결해야 한다는 점을 유의하시기 바랍니다. 자세한 정보는 IBM Cloud Kubernetes Service 사용에 대한 책임을 참조하십시오.

시작하기 전에

시작하기 전에 계정 신임 정보 및 프로비저닝 자원을 작성할 수 있도록 관리자 플랫폼 액세스 권한이 있는지 확인하십시오. 또한 다음 전제 조건이 필요합니다.

jq을(를) 사용하여 JSON 데이터를 분할하고 필터링할 수 있습니다. 이 학습서에서는 jq을(를)사용하여 저장된 환경 변수를 가져오고 사용합니다.

환경 설정

Secrets Manager 및 Kubernetes Service에 대해 작업하려면 IBM Cloud 계정에 클러스터 및 Secrets Manager 인스턴스를 작성해야 합니다. 또한 두 서비스에 대해 오퍼레이션을 실행할 수 있도록 권한을 구성해야 합니다.

이 단계에서는 서비스 ID와 IBM Cloud API 키를 작성하여 액세스 환경을 설정합니다. 학습서가 끝나고 더 이상 필요하지 않은 경우 자원을 쉽게 제거할 수 있습니다. 또는 신뢰할 수 있는 프로파일 을 사용하여 외부 시크릿 운영자에게 권한을 부여할 수 있습니다.

서비스 ID 및 API 키 작성

Secrets Manager 및 Kubernetes Service에 대해 조작을 실행할 수 있어야 하는 계정 인증 정보를 작성하여 시작하십시오.

  1. 명령행에서 IBM Cloud CLI를 통해 IBM Cloud에 로그인하십시오.

    ibmcloud login
    

    로그인에 실패하면 ibmcloud login --sso 명령을 실행하여 다시 시도하십시오. --sso 매개변수는 연합 ID로 로그인할 때 필요합니다. 이 옵션이 사용되면 CLI 출력에 나열되는 링크로 이동하여 일회성 패스코드를 생성하십시오.

  2. 서비스 ID를 만들고 환경 변수로 설정하십시오.

    export SERVICE_ID=`ibmcloud iam service-id-create kubernetes-secrets-tutorial --description "A service ID for testing ESO integration" --output json | jq -r ".id"`; echo $SERVICE_ID
    
  3. Secrets Manager에서 시크릿을 읽을 수 있는 서비스 ID 권한을 지정하십시오.

    ibmcloud iam service-policy-create $SERVICE_ID --roles "SecretsReader" --service-name secrets-manager
    

    SecretsReader 서비스 액세스 권한을 지정하면 External Secrets 컨트롤러에는 Secrets Manager에서 시크릿을 읽고 Kubernetes 클러스터에 채우는 올바른 액세스 레벨이 있습니다.

  4. 서비스 ID에 대한 IBM Cloud API 키를 작성하십시오.

    export IBM_CLOUD_API_KEY=`ibmcloud iam service-api-key-create kubernetes-secrets-tutorial $SERVICE_ID --description "An API key for testing ESO integration." --output json | jq -r ".apikey"`
    

    나중에 이 API 키를 사용하여 클러스터 배치에 맞게 Secrets Manager를 구성합니다.

Kubernetes 클러스터와 Secrets Manager 인스턴스 작성

IBM Cloud 계정에서 Kubernetes 클러스터와 Secrets Manager 인스턴스를 생성하세요.

IBM Cloud 계정당 하나의 사용 가능한 Kubernetes 클러스터와 Secrets Manager 서비스 인스턴스를 작성할 수 있습니다. 계정에 이미 두 리소스가 모두 있는 경우 기존 사용 가능 클러스터와 Secrets Manager 인스턴스를 사용하여 자습서를 완료할 수 있습니다.

  1. 명령행에서 Secrets Manager 서비스 인스턴스를 작성할 계정, 지역 및 리소스 그룹을 선택하십시오.

    이 튜토리얼에서는 댈러스 지역과 상호 작용합니다. 다른 지역에 로그인한 경우 다음 명령을 실행하여 댈러스를 대상 지역으로 설정해야 합니다.

    ibmcloud target -r us-south -g default
    
  2. Kubernetes 클러스터를 작성합니다.

    ibmcloud ks cluster create classic --zone dal10 --flavor free --name my-test-cluster
    
  3. Secrets Manager 인스턴스를 작성하십시오.

    ibmcloud resource service-instance-create my-secrets-manager secrets-manager trial us-south
    

    Secrets Manager 및 Kubernetes 클러스터 둘 다에 대한 프로비저닝은 완료하는 데 5 - 15분이 소요됩니다.

  4. 다음 단계로 진행하기 전에, 클러스터와 Secrets Manager 인스턴스가 성공적으로 프로비저닝되었는지 확인하십시오.

    1. 작업자 노드의 배치가 완료되었는지 확인하십시오.
        ibmcloud ks worker ls --cluster my-test-cluster
        ```
        작업자 노드의 프로비저닝을 완료하면 상태가 **준비됨**으로 변경됩니다.
    
        ```sh {: screen}
        ID                                                       Public IP       Private IP      Flavor   State          Status                Zone    Version
        kube-c39pf4ld0m87o3fv1utg-mytestclust-default-000000dd   169.xx.xx.xxx   10.xxx.xx.xxx   free     normal   Ready   mex01   1.20.7_1543
        ```
    2. 다음으로 Secrets Manager 인스턴스가 성공적으로 프로비저닝되었는지 확인하십시오.
    
    ```sh {: pre}
        ibmcloud resource service-instance my-secrets-manager
        ```
        인스턴스 프로비저닝이 완료되면 상태가 **활성**으로 변경됩니다.
    
        ```plaintext {: screen}
        Name:                  my-secrets-manager
        ID:                    crn:v1:bluemix:public:secrets-manager:us-south:a/f047b55a3362ac06afad8a3f2f5586ea:fe06948b-0c6b-4183-8d4b-e6c1d38ff65f::
        GUID:                  fe06948b-0c6b-4183-8d4b-e6c1d38ff65f
        Location:              us-south
        Service Name:          secrets-manager
        Service Plan Name:     trial
        Resource Group Name:   default
        State:                 active
        Type:                  service_instance
        Sub Type:
        Created at:            2021-01-06T17:11:32Z
        Created by:            zara@example.com
        Updated at:            2021-03-31T02:33:26Z
        ```
    
  5. CLI에서 Kubernetes 클러스터에 대한 컨텍스트를 설정합니다.

    ibmcloud ks cluster config --cluster my-test-cluster
    
  6. kubectl 명령이 올바르게 실행되고 Kubernetes 컨텍스트가 클러스터로 설정되었는지 확인하십시오.

    kubectl config current-context
    

    출력 예:

    my-test-cluster/<your_cluster_ID>
    

CLI에서 신뢰할 수 있는 프로필 만들기

신뢰할 수 있는 프로파일을 사용하면 외부 시크릿 운영자가 서비스 ID를 작성하거나 API키를 관리할 필요 없이 Secrets Manager에서 읽을 수 있습니다.

  1. Secrets Manager 인스턴스 및 Kubernetes 클러스터에 대한 CRN을 가져오십시오.

    CLUSTER_CRN=$(ibmcloud ks cluster get --cluster my-test-cluster --output json | jq -r '.crn')
    SECRETS_MANAGER_CRN=$(ibmcloud resource service-instance my-secrets-manager --output JSON | jq -r '.[0].crn')
    
  2. 프로파일을 작성하십시오.

    ibmcloud iam trusted-profile-create 'External Secrets'
    
  3. 신뢰할 수 있는 프로파일을 사용하도록 Kubernetes 클러스터에 권한을 부여하십시오.

    Kubernetes

    ibmcloud iam trusted-profile-rule-create 'External Secrets' --name kubernetes --type Profile-CR --conditions claim:namespace,operator:EQUALS,value:external-secrets --conditions claim:name,operator:EQUALS,value:external-secrets --conditions claim:crn,operator:EQUALS,value:$CLUSTER_CRN --cr-type IKS_SA
    

    OpenShift

    ibmcloud iam trusted-profile-rule-create 'External Secrets' --name kubernetes --type Profile-CR --conditions claim:namespace,operator:EQUALS,value:external-secrets-operator --conditions claim:name,operator:EQUALS,value:cluster-external-secrets --conditions claim:crn,operator:EQUALS,value:$CLUSTER_CRN --cr-type IKS_SA
    
  4. 신뢰할 수 있는 프로파일이 Secrets Manager 인스턴스에서 시크릿을 읽을 수 있도록 허용하는 액세스 정책을 작성하십시오.

    ibmcloud iam trusted-profile-policy-create 'External Secrets' --roles SecretsReader --service-instance $SECRETS_MANAGER_CRN --service-name secrets-manager
    

Terraform을 사용하여 신뢰할 수 있는 프로필 만들기

신뢰할 수 있는 프로파일을 사용하면 외부 시크릿 운영자가 서비스 ID를 작성하거나 API키를 관리할 필요 없이 Secrets Manager에서 읽을 수 있습니다. 신뢰할 수 있는 프로필을 만들기 위한 모든 단계를 수행하는 이 예제는 Terraform에서 확인할 수 있습니다:

```sh {: pre}
//Get your cluster details
data "ibm_container_vpc_cluster" "cluster" {
  name              = var.cluster_name
  resource_group_id = var.resource_group_id
}

//Get details of Secret Manager Instance
data "ibm_resource_instance" "secrets_manager" {
  name              = var.sm_name
  resource_group_id = var.resource_group_id
  service           = "secrets-manager"
}

//Create Trusted Profile
resource "ibm_iam_trusted_profile" "eso_profile" {
  name        = var.profile_name
  description = var.profile_description
}

//Attach IAM Policy for Secrets Manager Access
resource "ibm_iam_trusted_profile_policy" "secrets_policy" {
  iam_id = ibm_iam_trusted_profile.eso_profile.id

  roles = ["SecretsReader"]

  resources {
    service = "secrets-manager"
    resource_instance_id = data.ibm_resource_instance.secrets_manager.guid
  }
}

//Add Claim Rule for Kubernetes Service Account
resource "ibm_iam_trusted_profile_claim_rule" "eso_claim_rule" {
  profile_id = ibm_iam_trusted_profile.eso_profile.id
  type       = "Profile-CR"
  cr_type    = "IKS_SA"

  conditions {
    claim    = "name"
    operator = "EQUALS"
    value    = var.service_account_name
  }

  conditions {
    claim    = "namespace"
    operator = "EQUALS"
    value    = var.namespace
  }

  conditions {
    claim    = "crn"
    operator = "EQUALS"
    value    = data.ibm_container_vpc_cluster.cluster.crn
  }
}

//Variables
variable "resource_group_id" {
  description = "Resource Group ID"
  type        = string
}

variable "sm_name" {
  description = "Secret Manager Instance ID"
  type        = string
}

variable "cluster_name" {
  description = "IKS Cluster name"
  type        = string
}

variable "profile_name" {
  type        = string
  description = "Name of the trusted profile"
}

variable "profile_description" {
  type        = string
  description = "Description of the trusted profile"
}

variable "service_account_name" {
  description = "Kubernetes service account name for claim rule"
  type        = string
}

variable "namespace" {
  description = "Kubernetes namespace for claim rule"
  type        = string
}
```

Secrets Manager 인스턴스 준비

마지막으로 시크릿에 대한 작업을 시작하도록 Secrets Manager 인스턴스를 구성하십시오.

  1. 명령행에서 Secrets Manager CLI 플러그인에 액세스할 수 있는지 확인하십시오.

    ibmcloud secrets-manager --help
    

    아직 플러그인이 없으신가요? Secrets Manager CLI 플러그인을 설치하려면 ibmcloud plugin install secrets-manager을(를) 실행하십시오.

  2. 고유 Secrets Manager API 엔드포인트 URL을 사용하여 환경 변수를 내보내십시오.

    export SECRETS_MANAGER_URL=`ibmcloud resource service-instance my-secrets-manager --output json | jq -r '.[].dashboard_url | .[0:-3]'`; echo $SECRETS_MANAGER_URL
    
  3. 인스턴스에 대한 시크릿 그룹을 작성하십시오.

    시크릿 그룹은 인스턴스에 있는 특정 시크릿에 대한 액세스 권한이 있는 팀의 구성원을 구성하고 제어하는 방법입니다. IBM Cloud CLI에서 시크릿 그룹을 작성하려면 ibmcloud secrets-manager secret-group-create 명령을 사용하십시오. 다음 명령을 실행하여 시크릿 그룹을 작성하고 해당 ID를 환경 변수로 저장합니다.

    export SECRET_GROUP_ID=`ibmcloud secrets-manager secret-group-create --name my-test-secret-group --description "Read and write to my test app" --output json --service-url $SECRETS_MANAGER_URL | jq -r '.id'`; echo $SECRET_GROUP_ID
    

    Windows™ 명령 프롬프트(cmd.exe) 또는 PowerShell을 사용하십니까? 명령행에서 JSON 컨텐츠를 전달할 때 오류가 발생하면 운영 체제에 특정한 따옴표 이스케이프 요구사항에 맞게 문자열을 조정해야 할 수 있습니다. 자세한 정보는 IBM Cloud CLI에서 문자열과 함께 따옴표 사용을 참조하십시오.

    성공! 이제 Kubernetes 클러스터에 채우려는 시크릿을 Secrets Manager에 저장할 수 있습니다. 다음 단계를 계속하십시오.

Secrets Manager에서 시크릿을 작성하십시오.

시크릿은 애플리케이션에 따라 다르며 이를 필요로 하는 개별 애플리케이션 또는 서비스에 따라 달라질 수 있습니다. 시크릿은 사용자 이름, 비밀번호, API 키 또는 기타 유형의 신임 정보로 구성될 수 있습니다.

Secrets Manager에서는 서비스에서 작성하고 관리할 수 있는 다양한 시크릿 유형을 지원합니다. 예를 들어, IBM Cloud IAM 인증으로 보호되는 앱의 API 키를 관리해야 하는 경우 IAM 인증 정보를 작성할 수 있습니다. 또는 구조화되거나 구조화되지 않은 데이터의 유형을 보유할 수 있는 시크릿을 관리해야 하는 경우 임의의 시크릿을 작성할 수 있습니다.

이 학습서에서는 사용자 이름 및 비밀번호를 예제로 작성합니다. IBM Cloud CLI에서 시크릿을 작성하려면 ibmcloud secrets-manager secret-create 명령을 사용하십시오. 다음 명령을 실행하여 시크릿을 작성하고 해당 ID를 환경 변수로 저장합니다.

export SECRET_ID=`ibmcloud secrets-manager secret-create --secret-type=username_password --secret-name example_username_password --username-password-username user123 --username-password-password cloudy-rainy-coffee-book --secret-labels "my-test-cluster, tutorial" --secret-group-id $SECRET_GROUP_ID --output json $SECRETS_MANAGER_URL | jq -r '.id'`; echo $SECRET_ID

instance_idregion 를 사용자의 것으로 업데이트해야 합니다.

이 출력에 새로 작성된 시크릿의 ID가 표시됩니다. 예를 들어, 다음과 같습니다.

e0246cea-d668-aba7-eef2-58ca11ad3707

External Secrets Operator 설정

이제 애플리케이션에 사용할 시크릿이 준비되었으므로, 클러스터에 External Secrets Operator 도구를 설정할 수 있습니다. 이 패키지는 애플리케이션의 Kubernetes 시크릿으로 변환되는 ExternalSecrets 오브젝트를 작성하여 Secrets Manager 및 클러스터 간의 연결을 구성합니다.

External Secrets Operator는 IBM에 의해 유지보수되지 않는 오픈 소스 도구입니다. 이 도구에 대한 자세한 내용을 확인하거나 문제를 해결하려면 프로젝트 설명서를 참조하십시오.

클러스터에 대한 External Secrets Operator 구성

Kubernetes

먼저 공식 Helm 차트를 설치하여 external-secrets 자원을 클러스터에 추가하십시오. 자세한 설치 옵션은 시작하기 안내서를 참조하십시오.

  1. 다음 명령을 실행하여 외부 시크릿 오퍼레이터 helm 저장소를 설치하십시오.

    helm repo add external-secrets https://charts.external-secrets.io
    
  2. 외부 시크릿 운영자와 Secrets Manager간의 인증을 구성하십시오.

    서비스 ID를 사용하여 인증하는 경우 다음을 수행하십시오.

    kubectl -n default create secret generic secret-api-key --from-literal=apikey=$IBM_CLOUD_API_KEY
    helm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace --set installCRDs=true
    

    신뢰할 수 있는 프로파일을 사용하여 인증하는 경우 다음을 수행하십시오.

    echo '
    installCRDs: true
    extraVolumes:
    - name: sa-token
      projected:
        defaultMode: 420
        sources:
        - serviceAccountToken:
            path: sa-token
            expirationSeconds: 3600
            audience: iam
    extraVolumeMounts:
    - mountPath: /var/run/secrets/tokens
      name: sa-token
    webhook:
      extraVolumes:
      - name: sa-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              path: sa-token
              expirationSeconds: 3600
              audience: iam
      extraVolumeMounts:
      - mountPath: /var/run/secrets/tokens
        name: sa-token' >values.yml
    helm install external-secrets external-secrets/external-secrets -n external-secrets --create-namespace -f values.yml
    

OpenShift

  1. 다음 리소스를 작성하여 외부 시크릿 운영자를 설치하십시오.

    echo '
    apiVersion: v1
    kind: Namespace
    metadata:
      name: external-secrets-operator
    ---
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: external-secrets-operator
      namespace: external-secrets-operator
    spec:
      targetNamespaces:
        - external-secrets-operator
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: external-secrets-operator
      namespace: external-secrets-operator
    spec:
      channel: stable
      installPlanApproval: Automatic
      name: external-secrets-operator
      source: community-operators
      sourceNamespace: openshift-marketplace
    ' | oc create -f-
    
  2. 외부 시크릿 운영자와 Secrets Manager간의 인증을 구성하십시오.

    서비스 ID를 사용하여 인증하는 경우 다음을 수행하십시오.

    echo "
    apiVersion: operator.external-secrets.io/v1alpha1
    kind: OperatorConfig
    metadata:
      name: cluster
      namespace: external-secrets-operator
    spec: {}
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: secret-api-key
      namespace: default
    type: Opaque
    stringData:
      apikey: $IBM_CLOUD_API_KEY
    " | oc create -f-
    

    신뢰할 수 있는 프로파일을 사용하여 인증하는 경우 다음을 수행하십시오.

    echo '
    apiVersion: operator.external-secrets.io/v1alpha1
    kind: OperatorConfig
    metadata:
      name: cluster
      namespace: external-secrets-operator
    spec:
      extraVolumeMounts:
      - mountPath: /var/run/secrets/tokens
        name: sa-token
      extraVolumes:
      - name: sa-token
        projected:
          defaultMode: 420
          sources:
          - serviceAccountToken:
              audience: iam
              expirationSeconds: 3600
              path: sa-token
      webhook:
        extraVolumeMounts:
        - mountPath: /var/run/secrets/tokens
          name: sa-token
        extraVolumes:
        - name: sa-token
          projected:
            defaultMode: 420
            sources:
            - serviceAccountToken:
                audience: iam
                expirationSeconds: 3600
                path: sa-token
    ' | oc create -f-
    

앱 구성 업데이트

클러스터에 External Secrets Operator를 설치한 후 Secrets Manager를 애플리케이션의 시크릿 백엔드로 정의할 수 있습니다. 사용하려는 Secrets Manager의 시크릿을 대상으로 하는 구성 파일을 작성하여 시작하십시오.

  1. 애플리케이션의 루트 디렉토리에서 external-secrets-example.yml 파일을 작성하십시오.

    touch external-secrets-example.yml
    
  2. Secrets Manager 인스턴스에서 페치하려는 시크릿에 대한 정보를 포함하도록 파일을 수정하십시오.

    apiVersion: external-secrets.io/v1beta1
    kind: SecretStore
    metadata:
      name: ibmcloud-secrets-manager-example
    spec:
      provider:
        ibm:
          serviceUrl: <endpoint_url>
          auth:
            secretRef:
              secretApiKeySecretRef:
                name: secret-api-key
                key: apikey
    ---
    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
      name: ibmcloud-secrets-manager-example
    spec:
      secretStoreRef:
        name: ibmcloud-secrets-manager-example
        kind: SecretStore
      target:
        name: ibmcloud-secrets-manager-example
      data:
      - secretKey: username
        remoteRef:
          property: username
          key: username_password/<SECRET_ID>
      - secretKey: password
        remoteRef:
          property: password
          key: username_password/<SECRET_ID>
    

    작업하기 위해 선택하는 두 가지 모드 (시크릿 ID 또는 시크릿 이름) 가 있습니다. 시크릿 이름을 선택하면 형식이 secret_type/secret_id 에서 secret_group/secret_type/secret_name 로 변경됩니다.

    <endpoint_url>을(를) 이전에 검색한 Secrets Manager 엔드포인트 URL로 바꾸십시오. <SECRET_ID>을(를) 이전 단계에서 작성한 시크릿의 고유 ID로 바꾸십시오.

    신뢰할 수 있는 프로파일을 사용하여 인증하는 경우 auth 블록을 다음 스니펫으로 대체하십시오.

          auth:
            containerAuth:
              profile: "External Secrets"
              iamEndpoint: https://iam.cloud.ibm.com
              tokenLocation: /var/run/secrets/tokens/sa-token
    
  3. 클러스터에 구성을 적용합니다.

    kubectl apply -f external-secrets-example.yml
    
  4. External Secrets Operator가 Secrets Manager 인스턴스에 저장된 시크릿을 페치할 수 있는지 확인하십시오.

    kubectl get secret ibmcloud-secrets-manager-example -o json | jq '.data | map_values(@base64d)'
    

    출력 예:

    {
        "password": "cloudy-rainy-coffee-book",
        "username": "user123"
    }
    

    성공! 이제 Secrets Manager 인스턴스에 저장된 시크릿 데이터를 페치할 수 있습니다. 다음 단계를 계속하십시오.

클러스터에 앱 배치

마지막으로 external-secret-example.yml 파일에서 정의한 Secrets Manager 시크릿을 사용하는 클러스터에 애플리케이션을 배치할 수 있습니다. 애플리케이션 런타임 시, Secrets Manager에서 페치하는 시크릿 데이터는 클러스터에서 사용할 수 있는 Kubernetes 시크릿으로 변환됩니다.

앱을 배치하는 방법에 대한 예제를 찾으십니까? 클러스터에 Kubernetes네이티브 앱 배치 를 확인하여 앱의 단일 인스턴스 배치에 대한 자세한 정보를 확인하십시오.

(선택사항) 리소스 정리

이 튜토리얼에서 만든 리소스가 더 이상 필요하지 않은 경우 다음 단계를 완료하여 제거할 수 있습니다.

  1. 테스트 Kubernetes 클러스터를 삭제합니다.

    ibmcloud ks cluster rm --cluster my-test-cluster
    
  2. 테스트 Secrets Manager 인스턴스를 삭제하십시오.

    ibmcloud resource service-instance-delete my-secrets-manager
    
  3. 권한을 삭제하십시오.

    서비스 ID를 사용 중인 경우.

    ibmcloud iam service-id-delete $SERVICE_ID
    

    신뢰할 수 있는 프로파일로 작업하는 경우.

    ibmcloud iam trusted-profile-delete 'External Secrets'
    

관심 사항

YAML 문서를 작성할 때, ‘data’ 섹션에 포함된 각 키는 Secrets Manager 인스턴스에서 REST를 통해 주기적으로 조회된다는 점을 유의하십시오. 다음 항목에 유의하십시오.

  1. 기본적으로 폴링 간격은 1시간으로 설정되어 있으며 이 값을 기본값으로 설정하는 것이 좋습니다. ‘외부 시크릿(External Secrets)’ 템플릿에서 spec.refreshInterval 을 사용하여 이 값을 변경할 수 있습니다. 간격은 s, m 또는 h 단위로 표시할 수 있습니다.
  2. Secrets Manager 시크릿을 ID (keyByName: true) 가 아닌 이름으로 페치하도록 YAML을 설정하는 경우, ESO가 관련 시크릿 ID를 페치하기 위해 추가 호출을 수행합니다. 자세한 정보는 External Secrets 문서를 참조하십시오.

다음 단계

수고하셨습니다! 이 자습서에서는 애플리케이션 시크릿을 클러스터에 안전하게 채우기 위해 Secrets Manager를 설정하는 방법에 대해 알아보았습니다. Secrets Manager를 시작하는 데 도움이 되는 추가 리소스를 확인하십시오.

Vault Dedicated 및 Kubernetes Service 를 사용하려면, IBM Cloud 계정에서 클러스터를 생성하고 Vault Dedicated 인스턴스에 대한 액세스 권한을 설정해야 합니다.