External Secrets로 SecretManager로 GKE의 secret을 관리해 봤습니다.

4337 단어 GCPKubernetestech
GKE에서 시크릿을 사용하고 싶을 때 이 관리 방법에 고민하는 사람들이 많다고 생각해요.
ExternalSecrets의 시크릿을 사용하는 관리 방법을 소개합니다.

External Secrets 소개


External Secrets는 kubernetes cluster의 secret을 외부에서 관리할 수 있는 소프트웨어 도구입니다.
구체적으로 말하면, cluster에 External Secrets 컨트롤러를 설정하여 외부 공급자로부터 secret 데이터를 얻어 cluster에서 upsert를 진행한다.
이로써 cluster의pod는 시크릿에 자유롭게 접근할 수 있습니다.

External Secrets의 이점 사용


외부 관리 시크릿을 통해 안전을 고려한 토대에서 횡적 조정을 할 수 있다.
GiitHub로 관리하면 시크릿이 유출될 수 있으므로 피해야 한다.
또 클라우드 서비스 관리를 통해 콘솔에서 자유롭게 추가 또는 삭제할 수 있어 편의성도 좋다.

실제로 사용해볼게요.


필자는 실제적으로 GKE의 cluster에 External Secrets 컨트롤러를 설치하고 같은 GCP 서비스의 Secret Manager를 이용하여 secret을 관리하는 방법을 시도했다.
필요한 설정은 다음과 같습니다.

1. Workload Identity의 유효성


cluster 내의 node에서 Secret Manager에 접근해야 하기 때문에kubernetes 서비스 계정을 GCP 서비스 계정과 연결해야 합니다.
이때 필요한 것은 Workload Identity 기능입니다.
cluster의 Workload Identity를 유효하게 만들기 위해 다음 명령을 사용합니다.
또 노드 풀에 대해서도 수정이 필요하다.
gcloud container clusters update $CLUSTER_NAME --workload-pool $PROJECT_NAME.svc.id.goog

terraform 사용 시


GKE의 리소스에 workload_identity_config.idnetity_namespacenode_pool.node_config.workload_metadata_config를 더하면 유효하다.
gcloud container node-pools update $NODEPOOL_NAME --cluster=$CLUSTER_NAME --workload-metadata=GKE_METADATA

2. manfest 파일 생성


clonekubernetes-external-secrets.
clone 창고로 이동하고 helm으로kubernetes의 manfest 파일을 생성하는template를 사용합니다.
resource "google_container_cluster" "CLUSTER_NAME" {  
  workload_identity_config {
    identity_namespace = "<PROJECT_NAME>.svc.id.goog"
  }

  node_pool {
    node_config {
      workload_metadata_config {
        node_metadata = "GKE_METADATA_SERVER"
      }
    }
  }
}

3. template 수정


template의 메타데이터 등을 수정합니다.
주요 수정RELEASE-NAME의 항목.
예를 들어deployment.yamlmetadata.nameRELEASE-NAME-kubernetes-external-secrets이기 때문에 수정RELEASE-NAME한 부분이다.
이 글은 my-release-kubernetes-external-secrets라고 썼지만 자유롭고 문제가 없습니다.rbac.yaml, serviceaccount.yaml도 마찬가지로 수정했다.

4. GSA 및 KSA 링크


GCP 서비스 계정과kubernetes 서비스 계정의 링크를 진행합니다.
이제 1에 설명된 Workload Identity의 유효성을 확인합니다.
우선 2생성service.yaml에 추가serviceaccount.yaml된 항목이 있다.
helm template --output-dir <OUTPUT PATH> ./charts/kubernetes-external-secrets/
이때metadata.annotations는 연결하고 싶은 GCP 서비스 계정의 이름입니다.
이 GCP 서비스 계정의 역할이 필요합니다SERVICEACCOUNT_NAME.
다음으로 GKE에 secretmanager.secretAccessor를 적용합니다.
또한 binding을 완성하기 위해 gcloud에서 다음 명령을 실행합니다.
metadata:
  annotations:
    iam.gke.io/gcp-service-account: <SERVICEACCOUNT_NAME>@<PROJECT_NAME>.iam.gserviceaccount.com

5. 프로그램 설계


설정이 끝난 후 다른 manfest 파일도 적용됩니다.
이렇게 되면 External Secrets 설정이 완성되기 때문에 실제 시크릿을 설계해 봅니다.
예를 들어 다음과 같은 manfest 파일을 만듭니다.
gcloud iam service-accounts add-iam-policy-binding \
	--role roles/iam.workloadIdentityUser \
	--member "serviceAccount:<PROJECT_NAME>.svc.id.goog[default/my-release-kubernetes-external-secrets]" \
	<SERVICEACCOUNT_NAME>@<PROJECT_NAME>.iam.gserviceaccount.com
이로써 시크릿 매니저의 example-secret은 GKE의 시크릿으로 향상되었다.

끝맺다


끝까지 읽어주셔서 감사합니다.
실복을 하고 기사를 쓸 시간이 있으니 다른 점이 있으면 알려주세요.
또한 AWS Secret Manager 등을 사용하는 방법도 README 에서 사용할 수 있으므로 반드시 참조하십시오.

참고 자료

  • kubernetes-external-secrets
  • Using Workload Identity
  • 좋은 웹페이지 즐겨찾기