지원 버전: Kubernetes 1.32, 1.33, 1.34
마지막 업데이트: 2026년 2월 22일
Kubernetes에서 구성 관리는 애플리케이션의 설정을 코드와 분리하여 관리하는 중요한 부분입니다. 이 장에서는 컨피그맵(ConfigMap), 시크릿(Secret), 환경 변수, 볼륨을 통한 구성 마운트 등 Kubernetes의 구성 관리 방법에 대해 자세히 알아보겠습니다.
핵심 개념: 컨피그맵은 키-값 쌍 형태로 구성 데이터를 저장하는 객체로, 애플리케이션 코드와 구성을 분리합니다.
컨피그맵은 키-값 쌍의 형태로 구성 데이터를 저장하는 API 객체입니다. 컨피그맵을 사용하면 컨테이너 이미지에서 구성 데이터를 분리하여 애플리케이션을 더 쉽게 이식할 수 있습니다.
ConfigMap과 Secret 비교
특성
ConfigMap
Secret
용도
일반 구성 데이터
민감한 구성 데이터
저장 형식
일반 텍스트
Base64 인코딩 (기본)
크기 제한
1MB
1MB
암호화
기본적으로 없음
etcd 암호화 지원
볼륨 타입
configMap
secret
사용 사례
환경 변수, 설정 파일
비밀번호, 토큰, 인증서
자동 업데이트
볼륨 마운트 시 지연 가능
볼륨 마운트 시 지연 가능
컨피그맵 생성 방법
컨피그맵은 다양한 방법으로 생성할 수 있습니다:
명령형 방식으로 생성:
선언형 방식으로 생성:
컨피그맵 사용 방법
컨피그맵은 다음과 같은 방법으로 사용할 수 있습니다:
환경 변수로 사용:
컨피그맵 생성
컨피그맵은 여러 가지 방법으로 생성할 수 있습니다:
명령형 방식
선언형 방식
컨피그맵 사용
컨피그맵은 다음과 같은 방법으로 포드에서 사용할 수 있습니다:
환경 변수로 사용
볼륨으로 마운트
특정 키만 마운트
컨피그맵 업데이트
컨피그맵을 업데이트하면 볼륨으로 마운트된 컨피그맵의 내용이 자동으로 업데이트됩니다. 그러나 환경 변수로 사용된 컨피그맵은 포드가 재시작되어야 업데이트됩니다.
또는
시크릿(Secret)
시크릿은 암호, OAuth 토큰, SSH 키와 같은 민감한 정보를 저장하는 API 객체입니다. 시크릿은 컨피그맵과 유사하지만, 민감한 데이터를 저장하기 위한 추가적인 보안 기능을 제공합니다.
시크릿 유형
Kubernetes는 다양한 유형의 시크릿을 제공합니다:
Opaque: 기본 유형으로, 임의의 사용자 정의 데이터를 저장합니다.
kubernetes.io/service-account-token: 서비스 계정 토큰을 저장합니다.
kubernetes.io/dockercfg: .dockercfg 파일의 직렬화된 형태를 저장합니다.
kubernetes.io/dockerconfigjson: .docker/config.json 파일의 직렬화된 형태를 저장합니다.
kubernetes.io/basic-auth: 기본 인증을 위한 자격 증명을 저장합니다.
kubernetes.io/ssh-auth: SSH 인증을 위한 자격 증명을 저장합니다.
kubernetes.io/tls: TLS 인증서와 키를 저장합니다.
bootstrap.kubernetes.io/token: 부트스트랩 토큰 데이터를 저장합니다.
시크릿 생성
시크릿은 여러 가지 방법으로 생성할 수 있습니다:
명령형 방식
선언형 방식
또는 stringData 필드를 사용하여 인코딩되지 않은 값을 제공할 수 있습니다:
시크릿 사용
시크릿은 다음과 같은 방법으로 포드에서 사용할 수 있습니다:
환경 변수로 사용
볼륨으로 마운트
이미지 풀 시크릿
시크릿 보안 고려 사항
시크릿은 기본적으로 base64로 인코딩되어 있지만, 이는 암호화가 아닙니다. 시크릿의 보안을 강화하기 위해 다음과 같은 방법을 고려할 수 있습니다:
etcd 암호화: etcd에 저장된 시크릿을 암호화합니다.
RBAC: 시크릿에 대한 접근을 제한합니다.
네트워크 정책: 시크릿에 접근할 수 있는 포드를 제한합니다.
외부 시크릿 관리 도구: AWS Secrets Manager, HashiCorp Vault 등의 외부 시크릿 관리 도구를 사용합니다.
etcd 암호화 구성
환경 변수
환경 변수는 컨테이너에 구성 정보를 전달하는 간단한 방법입니다. Kubernetes는 여러 가지 방법으로 환경 변수를 설정할 수 있습니다.
직접 설정
컨피그맵에서 설정
시크릿에서 설정
다운워드 API를 통한 설정
다운워드 API를 사용하면 포드 및 컨테이너 정보를 환경 변수로 노출할 수 있습니다.
볼륨을 통한 구성 마운트
볼륨을 통해 구성 파일을 컨테이너에 마운트하는 방법은 환경 변수보다 더 유연한 구성 관리 방법을 제공합니다.
컨피그맵 볼륨
시크릿 볼륨
특정 파일 마운트
읽기 전용 마운트
서브패스 마운트
구성 모범 사례
Kubernetes에서 구성을 관리할 때 다음과 같은 모범 사례를 고려하세요:
1. 구성과 코드 분리
애플리케이션 코드와 구성을 분리하여 관리하세요. 이렇게 하면 구성을 변경할 때 애플리케이션을 다시 빌드하지 않아도 됩니다.
2. 환경별 구성 관리
개발, 테스트, 프로덕션 등 다양한 환경에 대한 구성을 별도로 관리하세요. 네임스페이스를 사용하여 환경을 분리하고, 환경별로 다른 컨피그맵과 시크릿을 사용할 수 있습니다.
3. 민감한 정보는 시크릿 사용
암호, API 키, 인증서 등의 민감한 정보는 항상 시크릿을 사용하여 저장하세요. 컨피그맵은 민감하지 않은 구성 데이터에만 사용하세요.
4. 불변성 유지
구성을 변경할 때는 새 버전을 생성하고, 기존 버전을 수정하지 마세요. 이렇게 하면 롤백이 쉬워지고, 구성 변경 이력을 추적할 수 있습니다.
5. 구성 변경 시 포드 재시작
환경 변수로 사용된 구성은 포드가 재시작되어야 업데이트됩니다. 디플로이먼트를 사용하여 포드를 롤링 업데이트하세요.
6. 구성 검증
구성을 적용하기 전에 유효성을 검증하세요. 잘못된 구성은 애플리케이션 장애를 일으킬 수 있습니다.
7. 구성 문서화
구성 옵션과 그 영향을 문서화하세요. 이는 팀원들이 구성을 이해하고 관리하는 데 도움이 됩니다.
Amazon EKS에서의 구성 관리
Amazon EKS에서는 Kubernetes의 기본 구성 관리 기능 외에도 AWS의 다양한 서비스를 활용하여 구성과 시크릿을 관리할 수 있습니다. 이 섹션에서는 EKS에서 구성을 관리하는 다양한 방법과 AWS 서비스와의 통합에 대해 알아보겠습니다.
AWS Secrets Manager 통합
AWS Secrets Manager는 데이터베이스 자격 증명, API 키 및 기타 시크릿 정보를 안전하게 저장하고 관리할 수 있는 서비스입니다. EKS에서는 External Secrets Operator나 AWS Secrets and Configuration Provider(ASCP)를 사용하여 AWS Secrets Manager의 시크릿을 Kubernetes 시크릿으로 동기화할 수 있습니다.
External Secrets Operator 설치
SecretStore 생성
ExternalSecret 생성
IRSA(IAM Roles for Service Accounts) 설정
External Secrets Operator가 AWS Secrets Manager에 접근하려면 적절한 IAM 권한이 필요합니다. IRSA를 사용하여 Kubernetes 서비스 계정에 IAM 역할을 연결할 수 있습니다.
AWS Parameter Store 활용
AWS Systems Manager Parameter Store는 구성 데이터와 시크릿 값을 계층적으로 저장하고 관리할 수 있는 서비스입니다. Parameter Store는 Secrets Manager보다 비용이 저렴하며, 간단한 구성 값을 저장하는 데 적합합니다.
ASCP(AWS Secrets and Configuration Provider) 설치
SecretProviderClass 생성
포드에서 Parameter Store 값 사용
AWS AppConfig를 사용한 동적 구성
AWS AppConfig는 애플리케이션 구성을 관리하고 배포하는 서비스입니다. AppConfig를 사용하면 애플리케이션을 재배포하지 않고도 구성을 동적으로 업데이트할 수 있습니다.
AppConfig Agent 사이드카 패턴
EKS Fargate 프로파일을 사용한 구성
EKS Fargate를 사용하면 노드를 관리할 필요 없이 Kubernetes 포드를 실행할 수 있습니다. Fargate 프로파일을 사용하여 포드의 실행 환경을 구성할 수 있습니다.
AWS KMS를 사용한 시크릿 암호화
Kubernetes 시크릿은 기본적으로 base64로 인코딩되어 있지만, 이는 암호화가 아닙니다. AWS KMS(Key Management Service)를 사용하여 EKS 클러스터의 시크릿을 암호화할 수 있습니다.
KMS 키 생성
EKS 클러스터에 암호화 구성 적용
AWS IAM을 사용한 시크릿 접근 제어
IRSA(IAM Roles for Service Accounts)를 사용하여 Kubernetes 서비스 계정에 IAM 역할을 연결하면, 포드가 AWS 서비스에 안전하게 접근할 수 있습니다.
서비스 계정 생성
포드에서 서비스 계정 사용
EKS 구성 모범 사례
EKS에서 구성을 관리할 때 다음과 같은 모범 사례를 고려하세요:
IRSA 사용: AWS 서비스에 접근할 때는 항상 IRSA를 사용하여 포드에 최소 권한을 부여하세요.
시크릿 암호화: KMS를 사용하여 EKS 클러스터의 시크릿을 암호화하세요.
외부 시크릿 관리: 민감한 정보는 AWS Secrets Manager나 Parameter Store와 같은 외부 시크릿 관리 서비스를 사용하여 관리하세요.
구성 버전 관리: AWS AppConfig나 Parameter Store를 사용하여 구성 버전을 관리하세요.
환경별 구성 분리: 개발, 테스트, 프로덕션 환경에 대한 구성을 분리하여 관리하세요. Kubernetes 네임스페이스와 AWS 리소스 태그를 활용하세요.
IAM 정책 최소화: AWS 서비스에 접근할 때는 최소 권한 원칙을 따르세요.
구성 자동화: AWS CloudFormation, AWS CDK, Terraform 등의 도구를 사용하여 구성 관리를 자동화하세요.
EKS 구성 관리 도구
EKS에서 구성을 관리하는 데 도움이 되는 도구들을 살펴보겠습니다:
AWS Controllers for Kubernetes(ACK)
ACK는 Kubernetes에서 AWS 리소스를 관리할 수 있는 도구입니다. ACK를 사용하면 Kubernetes 매니페스트를 통해 AWS 리소스를 생성하고 관리할 수 있습니다.
eksctl
eksctl은 EKS 클러스터를 생성하고 관리하는 명령줄 도구입니다. eksctl을 사용하여 클러스터 구성을 관리할 수 있습니다.
AWS CDK
AWS CDK(Cloud Development Kit)는 프로그래밍 언어를 사용하여 AWS 리소스를 정의하는 도구입니다. CDK를 사용하여 EKS 클러스터와 관련 리소스를 정의할 수 있습니다.
결론
이 장에서는 Kubernetes의 구성 관리 방법에 대해 알아보았습니다. 컨피그맵과 시크릿은 애플리케이션 구성을 관리하는 기본적인 방법을 제공하며, 환경 변수와 볼륨을 통해 이러한 구성을 컨테이너에 전달할 수 있습니다. 또한, 구성 관리의 모범 사례와 외부 구성 관리 도구에 대해서도 살펴보았습니다.
Amazon EKS 환경에서는 Kubernetes의 기본 구성 관리 기능과 함께 AWS의 다양한 서비스를 활용하여 더욱 강력하고 안전한 구성 관리가 가능합니다. AWS Secrets Manager, Parameter Store, KMS, IAM 등의 서비스를 통합하여 시크릿을 안전하게 관리하고, IRSA를 통해 포드에 최소 권한을 부여할 수 있습니다. 또한, AWS AppConfig를 사용하여 애플리케이션을 재배포하지 않고도 구성을 동적으로 업데이트할 수 있습니다.
효과적인 구성 관리는 Kubernetes 애플리케이션의 유지 관리성, 확장성 및 보안을 향상시키는 데 중요합니다. 애플리케이션의 요구 사항에 맞는 적절한 구성 관리 전략을 선택하고, 모범 사례를 따르는 것이 중요합니다. 특히 EKS 환경에서는 AWS 서비스와의 통합을 통해 더욱 강력한 구성 관리 솔루션을 구축할 수 있습니다.
# KMS 키 생성
aws kms create-key --description "EKS Secret Encryption Key"
# 키 ID 저장
KEY_ID=$(aws kms create-key --query KeyMetadata.KeyId --output text)
# 키 별칭 생성
aws kms create-alias --alias-name alias/eks-secrets --target-key-id $KEY_ID
# 암호화 구성 적용
aws eks update-cluster-config \
--name my-cluster \
--encryption-config '[{"resources":["secrets"],"provider":{"keyArn":"arn:aws:kms:us-west-2:123456789012:key/'$KEY_ID'"}}]'
import * as cdk from 'aws-cdk-lib';
import * as eks from 'aws-cdk-lib/aws-eks';
import * as iam from 'aws-cdk-lib/aws-iam';
const app = new cdk.App();
const stack = new cdk.Stack(app, 'EksStack');
// EKS 클러스터 생성
const cluster = new eks.Cluster(stack, 'Cluster', {
version: eks.KubernetesVersion.V1_21,
secretsEncryptionKey: new kms.Key(stack, 'Key'),
});
// 서비스 계정 생성
const serviceAccount = cluster.addServiceAccount('ServiceAccount', {
name: 'my-service-account',
namespace: 'my-namespace',
});
// IAM 정책 연결
serviceAccount.role.addManagedPolicy(
iam.ManagedPolicy.fromAwsManagedPolicyName('SecretsManagerReadWrite')
);