Worker Helm 차트 예시
Worker Helm 차트 예시 (Worker Helm chart examples)
이 worker 구성 변형들 — ingress, intermediate, egress 토폴로지, DNS 기반 주소 지정, 등록 방법 — 을 사용해서 worker를 네트워크 위치에 맞게 조정할 수 있어요. Boundary 컨트롤러나 HCP Boundary 클러스터가 이미 존재한다고 가정합니다.
| 토폴로지 | 연결을 받는 곳 | 일반적 Service 유형 | public_addr 필요 |
|---|---|---|---|
| Ingress | 다운스트림 worker 및 클라이언트 | LoadBalancer | 예 |
| Intermediate | 업스트림 및 다운스트림 worker | LoadBalancer | 예 |
| Egress | 업스트림 또는 intermediate worker; 타깃에 연결 | ClusterIP (proxy는 보통 비활성화) | 아니요 |
본문
Ingress 기능이 있는 worker
Ingress worker는 다운스트림 worker와 클라이언트로부터의 연결을 받아들여요. 흔히 컨트롤러 클러스터를 업스트림으로 사용하고, LoadBalancer Service를 통해 proxy 리스너를 공개적으로 노출합니다.
Ingress 기능이 있는 worker용 예시 HCL:
disable_mlock = true
listener "tcp" {
address = "0.0.0.0:9202"
purpose = "proxy"
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = true
}
worker {
name = "boundary-worker"
public_addr = "boundary-worker.example.com:9202"
initial_upstreams = ["<boundary-controller-cluster:9201>"]
tags {
type = ["worker", "ingress"]
}
}
kms "aead" {
purpose = "worker-auth"
aead_type = "aes-gcm"
key = "ATTK2pMjMTEJGlAkUJAePnFMlNLQaXBnhSqJHVlJeKQ="
key_id = "global_worker-auth"
}
events {
audit_enabled = true
sysevents_enabled = true
observations_enabled = true
sink "stderr" {
name = "all-events"
event_types = ["*"]
format = "cloudevents-json"
}
}
Ingress 기능과 공개 LoadBalancer가 있는 worker용 예시 values:
worker:
service:
proxy:
enabled: true
type: LoadBalancer
port: 9202
targetPort: 9202
ops:
enabled: true
type: ClusterIP
port: 9203
targetPort: 9203
persistence:
authStorage:
enabled: false
recording:
enabled: false
worker Helm 차트를 설치합니다:
$ helm install boundary-worker hashicorp/boundary-worker \
--version 0.1.0 \
--namespace boundary \
--create-namespace \
--values ingress-values.yaml \
--wait
로드 밸런서가 생길 때까지 public_addr을 알 수 없다면, 외부 주소를 기다리세요:
$ kubectl get svc boundary-worker-proxy --namespace boundary --watch
예시 출력:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
boundary-worker-proxy LoadBalancer 10.0.0.30 9202:31600/TCP 10s
boundary-worker-proxy LoadBalancer 10.0.0.30 203.0.113.20 9202:31600/TCP 45s
ingress-worker.hcl의 public_addr을 업데이트한 다음 업그레이드합니다:
$ helm upgrade boundary-worker hashicorp/boundary-worker \
--version 0.1.0 \
--namespace boundary \
--reuse-values \
--values ingress-values.yaml \
--rollback-on-failure \
--wait
Intermediate 기능이 있는 worker
Intermediate 기능이 있는 worker는 업스트림과 다운스트림 worker 사이의 트래픽을 중계해요. initial_upstreams와 public_addr이 모두 필요합니다.
Intermediate 기능이 있는 worker용 예시 HCL:
disable_mlock = true
listener "tcp" {
address = "0.0.0.0:9202"
purpose = "proxy"
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = true
}
worker {
name = "boundary-worker"
public_addr = ""
initial_upstreams = ["<ingress-or-intermediate-worker-address>:9202"]
tags {
type = ["worker", "intermediate"]
}
}
kms "aead" {
purpose = "worker-auth"
aead_type = "aes-gcm"
key = "ATTK2pMjMTEJGlAkUJAePnFMlNLQaXBnhSqJHVlJeKQ="
key_id = "global_worker-auth"
}
events {
audit_enabled = true
sysevents_enabled = true
observations_enable = true
sink "stderr" {
name = "all-events"
event_types = ["*"]
format = "cloudevents-json"
}
}
Intermediate 기능과 LoadBalancer가 있는 worker용 예시 values:
worker:
service:
proxy:
enabled: true
type: LoadBalancer
port: 9202
targetPort: 9202
ops:
enabled: true
type: ClusterIP
port: 9203
targetPort: 9203
persistence:
authStorage:
enabled: false
recording:
enabled: false
worker Helm 차트를 설치합니다:
$ helm install boundary-worker hashicorp/boundary-worker \
--version 0.1.0 \
--namespace boundary \
--create-namespace \
--values intermediate-values.yaml \
--wait
로드 밸런서가 생길 때까지 public_addr을 알 수 없다면 외부 주소를 기다리세요(ingress 기능이 있는 worker의 예시 출력 참고):
$ kubectl get svc boundary-worker-proxy --namespace boundary --watch
intermediate-worker.hcl의 public_addr을 업데이트한 다음 업그레이드합니다:
$ helm upgrade boundary-worker hashicorp/boundary-worker \
--version 0.1.0 \
--namespace boundary \
--reuse-values \
--values intermediate-values.yaml \
--rollback-on-failure \
--wait
Egress 기능이 있는 worker
Egress 기능이 있는 worker는 타깃 시스템에 연결하며 보통 타깃 직전의 마지막 홉이에요. 종종 public_addr이 필요하지 않습니다.
Egress 기능이 있는 worker용 예시 HCL:
disable_mlock = true
listener "tcp" {
address = "0.0.0.0:9202"
purpose = "proxy"
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = true
}
worker {
name = "boundary-worker"
public_addr = ""
initial_upstreams = ["<ingress-or-intermediate-worker-address>:9202"]
tags {
type = ["worker", "egress"]
}
}
kms "aead" {
purpose = "worker-auth"
aead_type = "aes-gcm"
key = "ATTK2pMjMTEJGlAkUJAePnFMlNLQaXBnhSqJHVlJeKQ="
key_id = "global_worker-auth"
}
events {
audit_enabled = true
sysevents_enabled = true
observations_enable = true
sink "stderr" {
name = "all-events"
event_types = ["*"]
format = "cloudevents-json"
}
}
Egress 기능이 있는 worker용 예시 values:
worker:
service:
proxy:
enabled: false
ops:
enabled: true
type: ClusterIP
persistence:
authStorage:
enabled: false
recording:
enabled: false
worker 구성을 포함한 values 파일로 worker를 설치합니다:
$ helm install boundary-worker hashicorp/boundary-worker \
--version 0.1.0 \
--namespace boundary \
--create-namespace \
--values egress-values.yaml \
--wait
사전 구성된 DNS 주소가 있는 worker
worker에 대한 DNS 이름을 이미 관리하고 있다면, 설치 중에 public_addr을 설정하세요:
worker {
name = "boundary-worker"
public_addr = "https://boundary-worker.example.com:9202"
initial_upstreams = ["boundary-controller-cluster:9201"]
tags {
type = ["worker", "ingress"]
}
}
kms "aead" {
purpose = "worker-auth"
aead_type = "aes-gcm"
key = "ATTK2pMjMTEJGlAkUJAePnFMlNLQaXBnhSqJHVlJeKQ="
key_id = "global_worker-auth"
}
Service가 외부 주소를 받은 뒤 DNS 레코드를 그 주소로 지정하세요. 이렇게 하면 설치 후 worker HCL을 바꿀 필요가 없지만, DNS가 도달 가능한 worker 엔드포인트로 해석되는지는 사용자가 책임져야 해요.
Worker-led 등록
Worker-led 등록에서는 컨트롤러가 생성한 활성화 토큰 없이 worker를 설치합니다. worker가 시작 시 아이덴티티 자료를 생성하고 등록 정보를 포드 로그에 기록해요. 자세한 내용은 Worker-led registration을 참고하세요.
Worker-led 등록용 예시 HCL:
disable_mlock = true
listener "tcp" {
address = "0.0.0.0:9202"
purpose = "proxy"
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = true
}
worker {
public_addr = ""
initial_upstreams = ["boundary-controller-cluster:9201"]
auth_storage_path = "/var/lib/boundary"
tags {
type = ["worker", "worker-led"]
}
}
events {
audit_enabled = true
sysevents_enabled = true
observations_enable = true
sink "stderr" {
name = "all-events"
event_types = ["*"]
format = "cloudevents-json"
}
}
Auth 스토리지 영속성이 있는 worker-led 등록용 예시 values:
worker:
persistence:
authStorage:
enabled: true
size: 1Gi
일반적인 워크플로는 다음과 같아요:
worker.config에 worker-led 등록 설정을 넣고 worker 차트 설치- worker 포드 로그 읽기
- 발생한 worker 등록 정보를 Boundary에 등록하거나 승인
- worker가 활성 상태가 되는지 확인
로그 보기:
$ kubectl logs --namespace boundary deployment/boundary-worker-deployment
worker-led 등록에서는 생성된 worker 아이덴티티가 재시작 후에도 지속되도록 auth 스토리지를 활성화된 상태로 유지하세요.
Controller-led 등록
Controller-led 등록의 일반적인 워크플로는 다음과 같아요. 자세한 내용은 Controller-led registration을 참고하세요:
- Boundary나 HCP Boundary에서 worker 리소스 생성
- 컨트롤러가 생성한 활성화 토큰 확보
- 아래 방법 중 하나로 토큰 제공
- worker Helm 차트 설치
- worker가 등록하고 자격 증명을 auth 스토리지에 영속화하는지 확인
worker는 초기 부트스트랩 중에 활성화 토큰을 사용합니다. 등록에 성공한 후에는 auth 스토리지에 영속화된 자격 증명을 사용해요.
차트는 활성화 토큰을 제공하는 세 가지 방법을 지원합니다.
Note — 평문과
extraEnv방법은 토큰을 Helm 릴리스 Secret에 저장하므로,helm get values boundary-worker --namespace boundary를 실행할 수 있는 누구에게나 보입니다. 토큰을 Helm 릴리스 저장소에서 완전히 밖에 두어야 한다면secretRefs방법을 사용하세요.
평문 토큰
토큰을 worker.config에 직접 넣습니다. 개발 전용으로만 적합해요 — ConfigMap을 읽을 수 있는 사람은 누구나 토큰을 볼 수 있습니다.
예시 HCL:
disable_mlock = true
listener "tcp" {
address = "0.0.0.0:9202"
purpose = "proxy"
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = true
}
worker {
name = "boundary-worker"
public_addr = ""
initial_upstreams = ["boundary-controller-cluster:9201"]
auth_storage_path = "/var/lib/boundary"
controller_generated_activation_token = "<activation-token>"
tags {
type = ["worker", "controller-led"]
}
}
events {
audit_enabled = true
sysevents_enabled = true
observations_enable = true
sink "stderr" {
name = "all-events"
event_types = ["*"]
format = "cloudevents-json"
}
}
예시 values:
worker:
persistence:
authStorage:
enabled: true
size: 1Gi
worker Helm 차트를 설치합니다:
$ helm install boundary-worker hashicorp/boundary-worker \
--version 0.1.0 \
--namespace boundary \
--create-namespace \
--values my-values.yaml \
--wait
extraEnv로 토큰 전달
worker.config에서 controller_generated_activation_token을 env:// 참조로 설정하고, 토큰을 extraEnv의 키-값 쌍으로 제공합니다:
disable_mlock = true
listener "tcp" {
address = "0.0.0.0:9202"
purpose = "proxy"
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = true
}
worker {
name = "boundary-worker"
public_addr = ""
initial_upstreams = ["boundary-controller-cluster:9201"]
auth_storage_path = "/var/lib/boundary"
controller_generated_activation_token = "env://BOUNDARY_WORKER_CONTROLLER_GENERATED_ACTIVATION_TOKEN"
tags {
type = ["worker", "controller-led"]
}
}
events {
audit_enabled = true
sysevents_enabled = true
observations_enable = true
sink "stderr" {
name = "all-events"
event_types = ["*"]
format = "cloudevents-json"
}
}
예시 values:
extraEnv:
- name: BOUNDARY_WORKER_CONTROLLER_GENERATED_ACTIVATION_TOKEN
value: "<activation-token>"
worker:
persistence:
authStorage:
enabled: true
size: 1Gi
worker Helm 차트를 설치합니다:
$ helm install boundary-worker hashicorp/boundary-worker \
--version 0.1.0 \
--namespace boundary \
--create-namespace \
--values my-values.yaml \
--wait
Kubernetes Secret에서 토큰 가져오기
활성화 토큰을 Kubernetes Secret에 저장하고 secretRefs로 참조합니다. 차트는 Secret 값을 BOUNDARY_WORKER_CONTROLLER_GENERATED_ACTIVATION_TOKEN 환경 변수로 주입하며, Boundary가 env:// 접두사를 통해 시작 시 읽어요.
차트를 설치하기 전에 Secret을 만듭니다:
$ kubectl create secret generic boundary-worker-secrets \
--namespace boundary \
--from-literal=worker-controller-generated-activation-token='<activation-token>'
키 이름(worker-controller-generated-activation-token)은 Helm values 파일의 secretRefs.keys.controllerGeneratedActivationToken에 설정한 값과 일치해야 해요. 이 명령은 예시로 제공됩니다 — 워크플로에 맞는 어떤 Secret 관리 방법이든 사용하세요.
worker.config에서 controller_generated_activation_token을 env:// 참조로 설정합니다:
worker {
name = "boundary-worker"
public_addr = ""
initial_upstreams = ["boundary-controller-cluster:9201"]
auth_storage_path = "/var/lib/boundary"
controller_generated_activation_token = "env://BOUNDARY_WORKER_CONTROLLER_GENERATED_ACTIVATION_TOKEN"
tags {
type = ["worker", "controller-led"]
}
}
예시 values:
secretRefs:
secretName: boundary-worker-secrets
keys:
controllerGeneratedActivationToken: worker-controller-generated-activation-token
worker:
persistence:
authStorage:
enabled: true
size: 1Gi
secretRefs.validateExisting=true로 설정하면 설치 중 Secret이 없을 때 Helm이 일찍 실패하게 할 수 있어요.
Note —
secretRefs.secretName이 설정되면 차트는worker.config가 secret 지원 필드에 대해 올바른env://변수 이름을 사용하는지 검증합니다. 다른 변수 이름을 쓰면 설치가 완료되기 전에 렌더링 중 차트가 실패해요. 필수 이름은 다음과 같습니다:
controller_generated_activation_token용env://BOUNDARY_WORKER_CONTROLLER_GENERATED_ACTIVATION_TOKEN다른 변수 이름을 쓰면 차트는 해당 필드와 기대 변수 이름을 식별하는 오류 메시지와 함께 렌더링 중 실패합니다.
secretRefs.secretName이 설정되었을 때worker.config에 토큰을 직접 하드코딩하는 것도 거부됩니다.
worker Helm 차트를 설치합니다:
$ helm install boundary-worker hashicorp/boundary-worker \
--version 0.1.0 \
--namespace boundary \
--create-namespace \
--values my-values.yaml \
--wait
KMS(키 관리 시스템) 기반 worker 인증
Boundary는 셀프 매니지드 배포에서만 KMS 기반 worker 인증을 지원해요. 자세한 내용은 외부 KMS 등록을 참고하세요. HCP Boundary worker에는 사용할 수 없습니다.
셀프 매니지드 배포에서는 필수 KMS worker-auth 스탠자로 worker HCL을 구성하세요. KMS 인증은 영구적인 로컬 auth 자료를 요구하지 않으므로 auth 스토리지 PVC를 비활성화해야 해요.
KMS 기반 worker 인증용 예시 HCL:
disable_mlock = true
listener "tcp" {
address = "0.0.0.0:9202"
purpose = "proxy"
}
listener "tcp" {
address = "0.0.0.0:9203"
purpose = "ops"
tls_disable = true
}
worker {
name = "boundary-worker"
public_addr = ""
initial_upstreams = ["boundary-controller-cluster:9201"]
tags {
type = ["worker", "kms"]
}
}
kms "aead" {
purpose = "worker-auth"
aead_type = "aes-gcm"
key = "ATTK2pMjMTEJGlAkUJAePnFMlNLQaXBnhSqJHVlJeKQ="
key_id = "global_worker-auth"
}
events {
audit_enabled = true
sysevents_enabled = true
observations_enable = true
sink "stderr" {
name = "all-events"
event_types = ["*"]
format = "cloudevents-json"
}
}
worker:
persistence:
authStorage:
enabled: false
worker.persistence.authStorage.enabled가 false일 때 차트는 PVC를 만드는 대신 auth 스토리지 경로에 emptyDir을 마운트해요.
세션 녹화 스토리지 활성화
worker가 세션 녹화를 저장한다면 녹화 영속성을 활성화하고 worker.config에 recording_storage_path를 설정하세요.
Note — RDP(원격 데스크톱 프로토콜) 세션 녹화 내보내기를 만들려면 worker에 버전
5.1.0이상의 FFmpeg 바이너리가 설치되어 있어야 해요.libsvtav1코덱도 있어야 합니다. 기본 Boundary worker 이미지는 FFmpeg를 포함하지 않으므로, 바이너리와 코덱을 추가한 커스텀 이미지를 빌드해서 values 파일에서 참조해야 해요.
values 파일에 커스텀 이미지를 전달합니다:
image:
repository: <your-registry>/boundary-worker
tag: "1.0.0-ffmpeg"
예시 values:
worker:
persistence:
recording:
enabled: true
size: 10Gi
path: /boundary/recording
일치하는 HCL:
worker {
name = "boundary-worker"
public_addr = ""
initial_upstreams = ["boundary-controller-cluster:9201"]
recording_storage_path = "/boundary/recording"
tags {
type = ["worker", "recording"]
}
}
worker.config의 녹화 스토리지 경로가 worker.persistence.recording.path와 일치하는지 확인하세요.
서비스 포트 변경
리스너 포트를 바꾸면 HCL과 차트 values를 모두 업데이트하세요.
예시 values:
worker:
service:
proxy:
port: 9222
targetPort: 9222
일치하는 HCL:
listener "tcp" {
address = "0.0.0.0:9222"
purpose = "proxy"
}
차트는 이 설정들을 자동으로 동기화하지 않아요.
문제 해결
세션 녹화 내보내기 실패
세션 녹화 내보내기가 실패하면 세션 녹화 스토리지 활성화에서 설명한 대로 worker 이미지에 버전 5.1.0 이상의 FFmpeg 바이너리와 libsvtav1 코덱이 포함되어 있는지 확인하세요. 기본 Boundary worker 이미지는 FFmpeg를 포함하지 않으므로, 바이너리와 코덱을 추가한 커스텀 이미지를 빌드해서 참조하기 전까지 녹화 내보내기가 실패합니다.
더 알아보기 (Learn more)
worker를 구성하거나 업데이트하기 위한 지원되는 Helm values는 Worker values를 참고하세요.