Controller Helm 차트 예시
Controller Helm 차트 예시 (Controller Helm chart examples)
이 컨트롤러 구성 변형들 — TLS 설정, 데이터베이스 마이그레이션, 부트스트랩 admin 생성, cluster 서비스 노출 — 을 사용해서, 컨트롤러 배포의 기본 컨트롤러 설치를 환경에 맞게 적용할 수 있어요. PostgreSQL과 KMS(키 관리 시스템) 접근이 이미 존재한다고 가정합니다.
본문
컨트롤러 Secret 생성
차트가 설치 시 읽는 값을 담은 Kubernetes Secret을 만듭니다. 최소한 데이터베이스 URL과 Boundary Enterprise 라이선스를 포함하세요. bootstrapAdmin.enabled=true면 부트스트랩 admin 자격 증명을, HCL에서 env://BOUNDARY_PG_MIGRATION_URL로 migration_url을 참조한다면 마이그레이션 URL도 포함합니다.
$ kubectl create secret generic boundary-controller-secrets \
--namespace boundary \
--from-literal=database-url="postgres://<user>:***@<host>:5432/<dbname>?sslmode=require" \
--from-literal=migration-url="postgres://<migration-user>:***@<host>:5432/<dbname>?sslmode=require" \
--from-literal=license="<your-license-here>" \
--from-literal=admin-username="<admin-username>" \
--from-literal=admin-password="<admin-password>"
키 이름(database-url, migration-url, license, admin-username, admin-password)은 Helm values 파일의 secretRefs.keys.*에 설정한 값과 일치해야 해요. 이 명령들은 예시로 제공됩니다 — 워크플로에 맞는 어떤 Secret 관리 방법이든 사용하세요.
Note —
secretRefs.secretName이 설정되면 차트는controller.config가 secret 지원 필드에 대해 올바른env://변수 이름을 사용하는지 검증합니다. 다른 변수 이름을 쓰면 설치가 완료되기 전에 렌더링 중 차트가 실패해요. 필수 이름은 다음과 같습니다:
database { url }용env://BOUNDARY_PG_URLdatabase { migration_url }용env://BOUNDARY_PG_MIGRATION_URLcontroller { license }용env://BOUNDARY_LICENSE다른 변수 이름을 쓰고 그것이
extraEnv에 선언되지 않았다면, 차트는 해당 필드와 기대 변수 이름을 식별하는 오류 메시지와 함께 렌더링 중 실패합니다.
TLS Secret 생성
tls.disabled=false(기본값)라면, 차트를 설치하기 전에 Kubernetes TLS Secret을 만드세요. Secret은 표준 kubernetes.io/tls 유형과 tls.crt, tls.key 데이터 키를 사용해야 해요.
$ kubectl create secret tls boundary-controller-tls \
--namespace boundary \
--cert=tls.crt \
--key=tls.key
Secret 이름은 tls.secretName(기본값 boundary-controller-tls)과 일치해야 합니다. 이 명령들은 예시로 제공됩니다 — 워크플로에 맞는 어떤 Secret 관리 방법이든 사용하세요.
데이터베이스 초기화 활성화
첫 설치 시 사전 설치 데이터베이스 초기화 Job을 활성화해서 차트가 Boundary 스키마를 만들게 할 수 있어요.
예시 values:
database:
init:
enabled: true
다음 경우에 이 패턴을 사용하세요:
- 빈 PostgreSQL 데이터베이스에 대해 차트를 처음 설치할 때
- Helm이 초기 스키마 생성을 관리하기를 원할 때
database.init.enabled=true로 설정하면 Helm은 ConfigMap, Services, Deployment 및 기타 활성화된 리소스를 만들기 전에 Boundary 스키마를 초기화하는 pre-install Job을 실행합니다. 이후 설치하거나 기존 Boundary 데이터베이스에 재초기화할 때에는 이 Job을 비활성화하세요.
부트스트랩 admin 생성 활성화
첫 설치 시 사후 설치 부트스트랩 Job을 활성화해서 차트가 global password 인증 방법, 사용자, 계정, 역할을 만들게 할 수 있어요.
예시 values:
bootstrapAdmin:
enabled: true
Helm이 초기 Boundary admin 자격 증명을 만들기를 원할 때 이 패턴을 사용하세요. 첫 설치 후, 또는 다른 워크플로로 Boundary 인증 방법과 admin 주체를 관리한다면 이 Job을 비활성화합니다.
TLS가 활성화된 컨트롤러
컨트롤러 리스너의 API와 ops 트래픽을 암호화하려면 TLS를 활성화하세요. Kubernetes TLS Secret을 제공하고 프로브 스킴을 HTTPS와 정렬된 상태로 유지합니다.
Note — TLS 인증서에는 다음 SAN(Subject Alternative Name)이 포함되어야 해요(
nameOverride나fullnameOverride를 설정했다면 조정하세요):
- DNS:
<fullname>-api(예:boundary-controller-api)부트스트랩 admin Job은 이 이름에 대해 인증서를 검증합니다 — 없으면 Job이 시간 초과돼요.
예시 values:
tls:
disabled: false
secretName: boundary-controller-tls
mountPath: /etc/boundary/tls
일치하는 HCL — tls_disable = false를 설정하고 API와 ops 리스너에 tls_cert_file과 tls_key_file을 추가합니다:
listener "tcp" {
address = "0.0.0.0:9200"
purpose = "api"
tls_disable = false
tls_cert_file = "/etc/boundary/tls/tls.crt"
tls_key_file = "/etc/boundary/tls/tls.key"
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = false
tls_cert_file = "/etc/boundary/tls/tls.crt"
tls_key_file = "/etc/boundary/tls/tls.key"
}
TLS가 비활성화된 컨트롤러
컨트롤러 리스너가 TLS를 종료하는 업스트림 프록시나 로드 밸런서로 보호되거나, 암호화가 필요 없는 비프로덕션 환경에서는 TLS를 비활성화하세요.
예시 values:
tls:
disabled: true
일치하는 HCL — TLS가 활성화되어 있던 각 리스너에 tls_disable = true를 설정하고 tls_cert_file과 tls_key_file 설정을 제거합니다:
listener "tcp" {
address = "0.0.0.0:9200"
purpose = "api"
tls_disable = true
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = true
}
tls.disabled=true면 차트는 TLS Secret을 마운트하지 않고 프로브 스킴은 기본적으로 HTTP가 됩니다.
내부 전용 cluster 서비스
모든 worker가 클러스터 안에서 실행되거나 사설 네트워킹으로 연결한다면, cluster 리스너를 내부로 유지하고 public_cluster_addr을 worker가 도달할 수 있는 사설 DNS 이름이나 내부 로드 밸런서 주소로 설정하세요.
예시 values:
controller:
service:
api:
type: LoadBalancer
cluster:
type: ClusterIP
ops:
type: ClusterIP
일치하는 HCL:
controller {
name = "boundary-controller"
public_cluster_addr = "boundary-controller-cluster.boundary.svc.cluster.local:9201"
license = "env://BOUNDARY_LICENSE"
database {
url = "env://BOUNDARY_PG_URL"
}
}
외부에서 접근 가능한 cluster 서비스
worker가 다른 네임스페이스나 클러스터 바깥에서 실행된다면, 기본 ClusterIP cluster 서비스가 도달 가능하지 않을 수 있어요. cluster 서비스를 LoadBalancer로 구성하면 worker가 네임스페이스 바깥에서 public_cluster_addr에 연결할 수 있습니다.
예시 values:
controller:
service:
cluster:
type: LoadBalancer
port: 9201
targetPort: 9201
일치하는 HCL — 로드 밸런서가 프로비저닝된 후 public_cluster_addr을 업데이트합니다:
controller {
name = "boundary-controller"
public_cluster_addr = "<LOAD_BALANCER_ADDRESS>:9201"
license = "env://BOUNDARY_LICENSE"
database {
url = "env://BOUNDARY_PG_URL"
}
}
외부 주소가 할당될 때까지 cluster Service를 지켜봅니다:
$ kubectl get svc boundary-controller-cluster --namespace boundary --watch
예시 출력:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
boundary-controller-cluster LoadBalancer 10.0.0.123 <pending> 9201:31234/TCP 10s
boundary-controller-cluster LoadBalancer 10.0.0.123 203.0.113.10 9201:31234/TCP 45s
controller.config의 public_cluster_addr을 할당된 주소로 업데이트한 다음 업그레이드합니다:
$ helm upgrade boundary-controller hashicorp/boundary-controller \
--version 0.1.0 \
--namespace boundary \
--values my-values.yaml \
--rollback-on-failure \
--wait
worker 등록과 컨트롤러 클러스터링에 인터넷 접근 엔드포인트가 필요 없을 때 이 패턴을 사용하세요.
사전 구성된 DNS 주소가 있는 컨트롤러
컨트롤러의 cluster 리스너에 대한 DNS 이름을 이미 관리하고 있다면, 설치 전에 public_cluster_addr을 그 주소로 설정하세요:
controller {
name = "boundary-controller"
public_cluster_addr = "boundary-controller.example.com:9201"
license = "env://BOUNDARY_LICENSE"
database {
url = "env://BOUNDARY_PG_URL"
}
}
cluster Service가 외부 주소를 받은 뒤, DNS 레코드를 그 주소로 지정하세요. 이렇게 하면 설치 후 컨트롤러 HCL을 바꿀 필요가 없지만, DNS가 도달 가능한 cluster 리스너 엔드포인트로 해석되는지는 사용자가 책임져야 해요.
마이그레이션 URL 구성
스키마 마이그레이션에 다른 PostgreSQL 연결 문자열을 사용한다면, 컨트롤러 HCL에 migration_url을 평문 값으로 직접 설정하세요.
일치하는 HCL:
controller {
name = "boundary-controller"
public_cluster_addr = "boundary-controller-cluster.boundary.svc.cluster.local:9201"
license = "<your-license-here>"
database {
url = "postgres://<user>:***@<host>:5432/<dbname>?sslmode=require"
migration_url = "postgres://<migration-user>:***@<host>:5432/<dbname>?sslmode=require"
}
}
마이그레이션 URL에 평문으로 저장해서는 안 되는 자격 증명이 들어 있다면, 대신 env://BOUNDARY_PG_MIGRATION_URL로 참조하고 값을 secretRefs.keys.migrationUrl로 올바른 키를 가리키면서 databaseUrl과 같은 Kubernetes Secret에 저장할 수 있어요.
데이터베이스 마이그레이션이 있는 버전 업그레이드
Warning — 마이그레이션이나 복구를 실행하기 전에 PostgreSQL 백업을 받으세요.
스키마 변경이 필요한 Boundary 버전으로 업그레이드할 때는 먼저 컨트롤러 포드를 중지한 다음, Helm 업그레이드 중에 마이그레이션 Job을 실행하세요.
컨트롤러를 0으로 스케일:
$ helm upgrade boundary-controller hashicorp/boundary-controller \
--version 0.1.0 \
--namespace boundary \
--values my-values.yaml \
--set controller.replicas=0 \
--rollback-on-failure \
--wait
마이그레이션 실행:
$ helm upgrade boundary-controller hashicorp/boundary-controller \
--version 0.1.0 \
--namespace boundary \
--values my-values.yaml \
--set controller.replicas=0 \
--set database.migrate.enabled=true \
--rollback-on-failure \
--wait
또는 특정 버전에 대한 복구 마이그레이션도 함께 실행하려면:
$ helm upgrade boundary-controller hashicorp/boundary-controller \
--version 0.1.0 \
--namespace boundary \
--values my-values.yaml \
--set controller.replicas=0 \
--set database.migrate.enabled=true \
--set database.repair.version=<version_id> \
--rollback-on-failure \
--wait
마이그레이션이 완료된 후 모든 마이그레이션 플래그를 재설정하고 컨트롤러 레플리카 수를 복원합니다:
Note —
controller.replicas를 배포에 필요한 수로 설정하세요. 다음 예시는 차트 기본값이기 때문에2를 사용합니다.
$ helm upgrade boundary-controller hashicorp/boundary-controller \
--version 0.1.0 \
--namespace boundary \
--values my-values.yaml \
--set database.migrate.enabled=false \
--set database.repair.version="" \
--set controller.replicas=2 \
--rollback-on-failure \
--wait
Note —
--reset-values플래그를 쓰면database.migrate.enabled도 재설정되지만, 모든 Helm values를 차트 기본값으로 재설정해서 이전에--set이나--set-file로 적용한 오버라이드를 모두 버려요. 다른 릴리스 값에 영향을 주지 않고 마이그레이션 플래그만 비활성화하려면--set database.migrate.enabled=false를 사용하세요.
서비스 포트 변경
리스너 포트를 바꾸면 HCL과 차트 values를 모두 업데이트하세요.
예시 values:
controller:
service:
api:
port: 9210
targetPort: 9210
일치하는 HCL:
listener "tcp" {
address = "0.0.0.0:9210"
purpose = "api"
tls_disable = false
tls_cert_file = "/etc/boundary/tls/tls.crt"
tls_key_file = "/etc/boundary/tls/tls.key"
}
차트는 이 설정들을 자동으로 동기화하지 않아요. cluster와 ops 리스너의 포트도 바뀐다면 같은 패턴을 적용하세요.
문제 해결
마이그레이션 Job 실패
database.migrate.enabled=true로 시작된 마이그레이션 Job이 실패하면, 마이그레이션이 성공할 때까지 컨트롤러 포드는 0으로 스케일된 채 유지됩니다. 마이그레이션이나 복구를 실행하기 전에 받아 둔 PostgreSQL 백업을 참조해서 데이터베이스를 복원한 다음, database.migrate.enabled=true를 다시 설정하고 helm upgrade를 다시 실행하기 전에 근본 원인(예: 잘못된 database.repair.version)을 고쳐야 해요.
더 알아보기 (Learn more)
컨트롤러를 구성하거나 업데이트하기 위한 지원되는 Helm values는 Controller values를 참고하세요.