본문으로 건너뛰기
runlot
셀프 호스팅Helm으로 설치

Helm으로 설치

컨트롤 플레인, Git 호스팅, 대시보드는 Kubernetes 클러스터에서 실행하고, 데이터 노드는 VM에 패키지로 설치합니다.

차트는 컨트롤 플레인을 클러스터에 설치합니다. cp-core는 레플리카 1개의 StatefulSet으로, cp-public은 Ingress 뒤의 Deployment로 설치되며, Git 호스팅과 패키지가 실행하는 것과 동일한 설치 코어를 실행하는 Job도 함께 설치됩니다. 데이터 노드는 VM에 남아 차트가 노출하는 Service를 통해 합류합니다. 이것이 지원되는 구성인 프로필 cp-only입니다. 노드까지 DaemonSet으로 실행하는 full 프로필도 있지만 아직 끝내지 못한 측정에 달려 있으며, 차트는 프로덕션에서 이를 거부합니다.

사전 요구 사항

  • Kubernetes 1.30 이상. cp-public의 무중단 업그레이드에는 sleep preStop 핸들러가 필요하며, 이는 1.30 이상에서 제공됩니다.
  • 대시보드와 Git 이름을 위한 Ingress 컨트롤러와 TLS Secret.
  • 작은 ReadWriteOnce 볼륨 두 개를 위한 StorageClass: cp-core의 상태용과 Git 데이터용입니다.
  • 차트가 제공하는 정책이 의미를 가지려면 NetworkPolicy를 적용하는 CNI가 필요합니다. 차트는 이를 확인할 수 없으며, Calico에서 측정했습니다.
  • 요구 사항에 나온 대로, 클러스터에서 접근할 수 있는 PostgreSQL 18과 S3 호환 스토어.
  • 클러스터의 LoadBalancer 또는 NodePort가 닿는 네트워크에 있는 데이터 노드 VM.

저장소 추가

Terminal
helm repo add runlot https://charts.runlot.io
helm repo update
helm search repo runlot --devel

차트 버전은 runlot의 릴리스 태그와 일대일로 대응합니다. 현재 모든 runlot 릴리스가 릴리스 후보이므로, 이를 보려면 --devel이 필요합니다.

직접 만드는 Secret

Terminal
kubectl create namespace runlot
kubectl -n runlot create secret generic runlot-master-key --from-literal=masterKey="$(openssl rand -hex 32)"
kubectl -n runlot create secret generic runlot-license    --from-file=license=./license
kubectl -n runlot create secret generic runlot-meta-db    --from-literal=url='postgres://runlot:…@db.acme.example:5432/runlot_meta?sslmode=require'
kubectl -n runlot create secret generic runlot-s3         --from-literal=accessKeyId=… --from-literal=secretAccessKey=…
kubectl -n runlot create secret generic runlot-smtp       --from-literal=user=… --from-literal=password=…

차트는 마스터 키 Secret과 라이선스 Secret을 만들지 않습니다. 저희는 키의 사본을 갖고 있지 않으며, 차트가 키 생성을 거부하기 때문에 클러스터에서도 이 원칙이 지켜집니다.

values.yaml

values.yaml
profile: cp-only
tier: single                      # eval | single | ha

license:   { existingSecret: runlot-license }
masterKey: { existingSecret: runlot-master-key }
metaDB:    { existingSecret: runlot-meta-db }
objectStore:
  endpoint: https://s3.acme.example
  bucket: runlot
  pathStyle: true
  existingSecret: runlot-s3

domains:
  dashboard: runlot.acme.example
  git:       git.acme.example
  apps:      apps.acme.example
  wire:      wire.acme.example
  objects:   objects.acme.example

org:  { name: acme, adminEmails: [[email protected]] }
mail: { smtp: { host: smtp.acme.example, port: 587, existingSecret: runlot-smtp, from: [email protected] } }

ingress:
  className: nginx
  tls: { dashboardSecret: runlot-dash-tls, gitSecret: runlot-git-tls }

service:
  cpCoreNode: { type: LoadBalancer }   # what the VM nodes reach the control plane through

helm show values runlot/runlot --devel은 주석이 달린 전체 값 목록을 출력합니다. values.schema.json은 잘못된 조합을 배포에 성공한 뒤가 아니라 helm lint 단계에서 거부합니다. 예를 들어 cp-only 아래의 node 블록, tier: eval 밖의 eval 설정, eval 밖에서 비어 있는 마스터 키 또는 라이선스 Secret이 해당합니다.

설치

Terminal
helm install runlot runlot/runlot --devel -n runlot -f values.yaml

차트는 다음 순서로 실행됩니다. RBAC와 차트 자체의 Secret 두 개, 그다음 preflight와 install cp를 실행하는 Job, 이어서 cp-core, cp-public, Git, 마지막으로 노드 조인 토큰을 runlot-node-join Secret에 기록하는 post-install Job입니다.

Terminal
kubectl -n runlot get secret runlot-node-join -o jsonpath='{.data.token}' | base64 -d

VM이 접근할 수 있는 주소를 노드 Service에 할당

VM 노드는 상호 인증되는 TLS 포트로 cp-core에 접속합니다. LoadBalancer에 주소가 할당되면, 그 주소가 cp-core의 인증서에 포함되어야 합니다.

Terminal
kubectl -n runlot get svc runlot-cp-core-node -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
helm upgrade runlot runlot/runlot --devel -n runlot -f values.yaml \
  --set service.cpCoreNode.externalAddress=<that address>

주소는 설치가 끝난 뒤에야 생기므로, 차트의 NOTES는 첫 설치 후에 이 줄을 출력합니다.

노드를 패키지로 설치

RUNLOT_CP_PRIVATE_ADDR을 Service의 외부 주소로 설정하고 위 Secret의 조인 토큰을 사용하여 패키지로 설치: 각 데이터 노드를 따르세요. 클러스터에서 차트의 NetworkPolicy가 적용되는 경우 VM 노드의 주소를 networkPolicy.nodeCIDRs에 넣어야 하며, 클러스터의 노드 서브넷도 함께 넣어야 합니다. LoadBalancer가 해당 서브넷으로 SNAT하기 때문입니다.

노드 위치 선언

Terminal
kubectl -n runlot exec deploy/runlot-cp-public -- \
  runlot-admin bootstrap --core http://runlot-cp-core:8081 --nodes node-1=icn/KR/do

cp-only에서는 차트가 올라온 뒤에 노드가 조인하므로, post-install Job은 선언할 대상이 없으며 그 사실을 알립니다. 이 명령으로 해당 정보를 설정합니다.

업그레이드

Terminal
helm repo update
helm upgrade runlot runlot/runlot --devel -n runlot -f values.yaml --version <new>

pre-upgrade Job은 새 컨트롤 플레인이 시작되기 전에 스키마 마이그레이션을 실행합니다. cp-public은 요청 유실 없이 롤링 업데이트되며, cp-core는 레플리카가 하나라서 재시작됩니다. 이 동안 대시보드에는 마지막 상태가 표시되고 노드는 계속 서비스합니다. 그다음 운영: 업그레이드에 따라 노드 패키지를 업그레이드하세요.

라이선스 변경

Terminal
kubectl -n runlot create secret generic runlot-license --from-file=license=./license --dry-run=client -o yaml | kubectl apply -f -

컨트롤 플레인은 마운트된 Secret을 1분 안에 다시 읽습니다. 재시작은 필요하지 않습니다.

이 페이지의 목차