From bb0295a5277f89e3d7b6e69fab70e455852b0938 Mon Sep 17 00:00:00 2001 From: jungwoo choi Date: Sun, 30 Aug 2026 18:41:16 +0900 Subject: [PATCH] =?UTF-8?q?feat(dev):=20=EB=A1=9C=EC=BB=AC=20kind=20?= =?UTF-8?q?=EC=9B=8C=EC=BB=A4=20=EB=85=B8=EB=93=9C=20=EC=B6=94=EA=B0=80(de?= =?UTF-8?q?v=20up=20--workers=20N=20+=20environments.dev.workers)=20?= =?UTF-8?q?=E2=80=94=200.22.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 --- bin/yakcloud | 21 ++++++++++++++++----- yakcloud.yaml | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/bin/yakcloud b/bin/yakcloud index b434e77..fd026d5 100755 --- a/bin/yakcloud +++ b/bin/yakcloud @@ -16,7 +16,7 @@ set -uo pipefail # -e 미사용: 'test && action' 관용구가 값 없을 때 REPO="${YAKCLOUD_STARTER_REPO:-https://gitea.yakenator.io/yakenator/yakcloud-starter}" BRANCH="${YAKCLOUD_STARTER_BRANCH:-main}" -VERSION="0.21.4" +VERSION="0.22.0" # 로컬 개발 클러스터(kind) — 개발 후 운영까지 '직선 배포'의 dev 구간. DEV_CTX="${YAK_DEV_CONTEXT:-kind-yak-dev}" DEV_CLUSTER="${YAK_DEV_CLUSTER:-yak-dev}" @@ -467,7 +467,7 @@ _podman_auth_fix() { # --name dev2 --port N → kind 'yak-dev2', ctx 'kind-yak-dev2', 등록명 -dev2, 인그레스 N (80은 기본 클러스터 몫) # 나머지 인자(태그 등)는 DEV_ARGS 배열에 남긴다(--name 값이 태그로 오인되지 않게 여기서 소비). _dev_resolve() { - DEV_NAME="dev"; DEV_HTTP_PORT="80"; DEV_PORT_EXPLICIT=0; DEV_ARGS=() + DEV_NAME="dev"; DEV_HTTP_PORT="80"; DEV_PORT_EXPLICIT=0; DEV_WORKERS=0; DEV_ARGS=() while [ "$#" -gt 0 ]; do case "$1" in --name|--cluster) DEV_NAME="${2:-}"; shift 2 || shift ;; @@ -475,9 +475,14 @@ _dev_resolve() { --cluster=*) DEV_NAME="${1#--cluster=}"; shift ;; --port) DEV_HTTP_PORT="${2:-}"; DEV_PORT_EXPLICIT=1; shift 2 || shift ;; --port=*) DEV_HTTP_PORT="${1#--port=}"; DEV_PORT_EXPLICIT=1; shift ;; + --workers|--worker) DEV_WORKERS="${2:-0}"; shift 2 || shift ;; + --workers=*) DEV_WORKERS="${1#--workers=}"; shift ;; + --worker=*) DEV_WORKERS="${1#--worker=}"; shift ;; *) DEV_ARGS+=("$1"); shift ;; esac done + case "$DEV_WORKERS" in ''|*[!0-9]*) DEV_WORKERS=0 ;; esac + [ "$DEV_WORKERS" -gt 5 ] && DEV_WORKERS=5 # 노트북 자원 보호(과도한 노드 방지) DEV_NAME="$(printf '%s' "$DEV_NAME" | tr '[:upper:]' '[:lower:]' | tr -cs 'a-z0-9-' '-' | sed 's/^-*//; s/-*$//')" [ -z "$DEV_NAME" ] && DEV_NAME="dev" DEV_CLUSTER="${YAK_DEV_CLUSTER:-yak-$DEV_NAME}" @@ -500,10 +505,14 @@ cmd_dev_up() { if [ "$DEV_HTTP_PORT" -lt 1 ] || [ "$DEV_HTTP_PORT" -gt 65535 ]; then die "포트는 1-65535 범위여야 합니다: '$DEV_HTTP_PORT'" fi - info "kind 클러스터 '$DEV_CLUSTER' 생성 ($rt) — 인그레스 http 포트 ${DEV_HTTP_PORT}…" + local nw="${DEV_WORKERS:-0}" + info "kind 클러스터 '$DEV_CLUSTER' 생성 ($rt) — 인그레스 http 포트 ${DEV_HTTP_PORT}, 워커 ${nw}개…" local ports=" - { containerPort: 80, hostPort: ${DEV_HTTP_PORT}, protocol: TCP }" [ "$DEV_HTTP_PORT" = "80" ] && ports="$ports - { containerPort: 443, hostPort: 443, protocol: TCP }" + # 워커 노드(N개) — 인그레스는 CP(ingress-ready 라벨·포트매핑) 몫이라 워커는 순수 워크로드 스케줄 대상. + local workers="" + [ "$nw" -gt 0 ] && workers="$(for _ in $(seq 1 "$nw"); do echo "- role: worker"; done)" env $kenv kind create cluster --name "$DEV_CLUSTER" --config - < [--template S|M] [--nodes N] [--golden] 클러스터 생성(프로비저닝 완료까지 대기) cluster ls 내 클러스터 목록(이름·상태·노드·기본 도메인) ── 로컬 개발 클러스터(kind) — 개발 후 운영까지 직선 배포의 dev 구간 ── - dev up 로컬 kind 생성 + 인그레스(80/443) — 최초 1회 + dev up [--workers N] 로컬 kind 생성 + 인그레스(80/443) — 최초 1회. --workers N=워커 노드 추가(기본 0=CP만, 매니페스트 environments.dev.workers 도 가능) dev deploy [tag] 매니페스트대로 로컬 리컨실(이미지 빌드+load, 소스/워크로드/인그레스; 콘솔 API 불필요) dev ls 로컬 클러스터 목록(kind 이름 / --name / 콘솔 등록명) — 삭제 전 대상 확인 dev status | dev clean 로컬 배포 상태 / 이 프로젝트 리소스 삭제 diff --git a/yakcloud.yaml b/yakcloud.yaml index dcf04ac..0b2a72a 100644 --- a/yakcloud.yaml +++ b/yakcloud.yaml @@ -12,7 +12,7 @@ project: my-app # 프로젝트 이름(이미지 경로/표 # val/prod = **관리형**. yakcloud project promote --to val|prod → 이미지 build+push(이미 있으면 재빌드 없이) 후 리컨실 + 도메인. # (기본 도메인 c-xxxx.yakenator.io 은 자동. 운영 커스텀 도메인은 prod.domains 에.) environments: - dev: { cluster: dev, port: 80 } # 로컬 kind (project deploy). cluster=로컬 이름, port=인그레스 포트(이름!=dev면 비80) + dev: { cluster: dev, port: 80 } # 로컬 kind (project deploy). cluster=로컬 이름, port=인그레스 포트(이름!=dev면 비80). 워커 추가는 workers: N (기본 0=CP만) val: { cluster: my-val-cluster } # 관리형 (promote --to val) prod: { cluster: my-prod-cluster, domains: [] } # 관리형 (promote --to prod, domains 예: [app.example.com])