Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ค๋ž˜๋œ ๊ธฐ๋Šฅ ๋ถ„๊ธฐ ์ œ๊ฑฐ

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์˜ค๋ž˜๋œ ๊ธฐ๋Šฅ ๋ถ„๊ธฐ ์ œ๊ฑฐ

ะŸั€ะธะฒะตั‚! ๊ธฐ๋Šฅ ๋ถ„๊ธฐ (๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐฐํฌ, ์•ฑ ๊ฒ€ํ† ๋ผ๊ณ ๋„ ํ•จ) - ์ด๋Š” ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ณ ์œ ํ•œ URL์— ๋Œ€ํ•œ ๊ฐ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ๋„ ๋ฐฐํฌ๋˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋‚˜ ์ œํ’ˆ ์ „๋ฌธ๊ฐ€์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ ์ด์ „ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฐ๊ฐ์˜ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹ ํ˜„์žฌ ๋ฐฐํฌ๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ์ƒˆ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ƒˆ ๋ฐฐํฌ๊ฐ€ ๋กค์•„์›ƒ๋ฉ๋‹ˆ๋‹ค. ํ’€ ์š”์ฒญ์„ ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•  ๋•Œ ์งˆ๋ฌธ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ๊ธฐ๋Šฅ ๋ถ„๊ธฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ Kubernetes ๋ฆฌ์†Œ์Šค๋Š” ์—ฌ์ „ํžˆ ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ๋ถ„๊ธฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด

Kubernetes์—์„œ ๊ธฐ๋Šฅ ๋ถ„๊ธฐ๋ฅผ ๋งŒ๋“œ๋Š” ํ•œ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ํ”„๋กœ๋•์…˜ ๊ตฌ์„ฑ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kind: Namespace
apiVersion: v1
metadata:
  name: habr-back-end
...

kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: habr-back-end
spec:
  replicas: 3
...

๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜์˜ ๊ฒฝ์šฐ ์‹๋ณ„์ž(์˜ˆ: ํ’€ ์š”์ฒญ ๋ฒˆํ˜ธ)์™€ ์ผ์ข…์˜ ์ ‘๋‘์‚ฌ/์ ‘๋ฏธ์‚ฌ(์˜ˆ: -pr-):

kind: Namespace
apiVersion: v1
metadata:
  name: habr-back-end-pr-17
...

kind: Deployment
apiVersion: apps/v1
metadata:
  namespace: habr-back-end-pr-17
spec:
  replicas: 1
...

์ผ๋ฐ˜์ ์œผ๋กœ ๋‚˜๋Š” ์ผ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜คํผ๋ ˆ์ดํ„ฐ (ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜) Github์˜ ํ”„๋กœ์ ํŠธ ๋งํฌ. ์ด์ „ ๊ธฐ๋Šฅ ๋ถ„๊ธฐ์— ์†ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. Kubernetes์—์„œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋ฉด ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋„ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

$ kubectl get pods --all-namespaces | grep -e "-pr-"
NAMESPACE            ... AGE
habr-back-end-pr-264 ... 4d8h
habr-back-end-pr-265 ... 5d7h

ํด๋Ÿฌ์Šคํ„ฐ์— ๊ธฐ๋Šฅ ๋ถ„๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ะธ ์—ฌ๊ธฐ์—.

์ž๊ทน

์ง€์†์ ์ธ ํ†ตํ•ฉ์ด ํฌํ•จ๋œ ์ผ๋ฐ˜์ ์ธ ํ’€ ์š”์ฒญ ์ˆ˜๋ช… ์ฃผ๊ธฐ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค(continuous integration):

  1. ์šฐ๋ฆฌ๋Š” ๋ธŒ๋žœ์น˜์— ์ƒˆ๋กœ์šด ์ปค๋ฐ‹์„ ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค.
  2. ๋นŒ๋“œ์—์„œ๋Š” ๋ฆฐํ„ฐ ๋ฐ/๋˜๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
  3. Kubernetes ํ’€ ์š”์ฒญ ๊ตฌ์„ฑ์€ ์ฆ‰์‹œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ํ•ด๋‹น ๋ฒˆํ˜ธ๋Š” ์™„์„ฑ๋œ ํ…œํ”Œ๋ฆฟ์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค).
  4. kubectl apply๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์— ๊ตฌ์„ฑ์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค(๋ฐฐํฌ).
  5. ํ’€ ์š”์ฒญ์ด ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค.

๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ ์ž‘์—…์„ ํ•˜๋Š” ๋™์•ˆ ์ด์ „ ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฐ๊ฐ์˜ ์ƒˆ๋กœ์šด ์ปค๋ฐ‹ ํ˜„์žฌ ๋ฐฐํฌ๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ์ƒˆ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์ƒˆ ๋ฐฐํฌ๊ฐ€ ๋กค์•„์›ƒ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ’€ ์š”์ฒญ์ด ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ๋˜๋ฉด ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋งŒ ๋นŒ๋“œ๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ํ’€ ์š”์ฒญ์„ ์žŠ์–ด๋ฒ„๋ ธ์œผ๋ฉฐ ํ•ด๋‹น Kubernetes ๋ฆฌ์†Œ์Šค๋Š” ์—ฌ์ „ํžˆ ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

์•„๋ž˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml

๋‹ค์Œ ๋‚ด์šฉ์œผ๋กœ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ์„ ํ†ตํ•ด ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค. kubectl apply -f:

apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
  name: stale-feature-branch
spec:
  namespaceSubstring: -pr-
  afterDaysWithoutDeploy: 3

๋งค๊ฐœ ๋ณ€์ˆ˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šคํ•˜์œ„ ๋ฌธ์ž์—ด ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ํ’€ ์š”์ฒญ์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋Ÿฌ์Šคํ„ฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ: habr-back-end, habr-front-end, habr-back-end-pr-17, habr-back-end-pr-33์ด๋ฉด ์‚ญ์ œ ํ›„๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. habr-back-end-pr-17, habr-back-end-pr-33.

๋งค๊ฐœ ๋ณ€์ˆ˜ afterDaysWithoutDeploy ์ด์ „ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ 3 ะดะฝั 1 ั‡ะฐั ๋’ค๋กœ, ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 3 ะดะฝั, ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. 2 ะดะฝั 23 ั‡ะฐัะฐ ๋’ค๋กœ, ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. 3 ะดะฝั, ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์‚ญ์ œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์Šค์บ”ํ•˜๊ณ  ๋ฐฐํฌํ•˜์ง€ ์•Š์€ ๊ธฐ๊ฐ„์„ ํ™•์ธํ•˜๋Š” ๋นˆ๋„๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋งค๋ถ„ ํ™•์ธ. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. 30 ะผะธะฝัƒั‚ะฐะผ.

์ด๊ฑฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™ ์‹œ์ผœ์š”

์‹ค์ œ๋กœ๋Š” ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋„์ปค ๊ณ ๋ฆฝ๋œ ํ™˜๊ฒฝ์—์„œ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด
  2. ๋ฏธ๋‹ˆ์ฟ ๋ฒ  Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋กœ์ปฌ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฟ  ๋ฒ ํ‹€ โ€” ํด๋Ÿฌ์Šคํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ช…๋ น์ค„ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋กœ์ปฌ์—์„œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

$ minikube start --vm-driver=docker
minikube v1.11.0 on Darwin 10.15.5
Using the docker driver based on existing profile.
Starting control plane node minikube in cluster minikube.

์ง€์ • kubectl ๊ธฐ๋ณธ์ ์œผ๋กœ ๋กœ์ปฌ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ kubectl config use-context minikube
Switched to context "minikube".

ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ๊ตฌ์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

$ curl https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/configs/production.yml > stale-feature-branch-production-configs.yml

ํ”„๋กœ๋•์…˜ ๊ตฌ์„ฑ์€ ์ด์ „ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ™•์ธํ•˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ์ง€๋งŒ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—๋Š” ํ•ด๋‹น ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์—†์œผ๋ฏ€๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค. IS_DEBUG ์— true. ์ด ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ afterDaysWithoutDeploy ๋ฐฐํฌํ•˜์ง€ ์•Š์€ ๋‚  ๋™์•ˆ์€ ๊ณ ๋ ค๋˜์ง€ ์•Š์œผ๋ฉฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํ™•์ธ๋˜์ง€ ์•Š์œผ๋ฉฐ ํ•˜์œ„ ๋ฌธ์ž์—ด(-pr-).

์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ Linux:

$ sed -i 's|false|true|g' stale-feature-branch-production-configs.yml

์ผœ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ macOS:

$ sed -i "" 's|false|true|g' stale-feature-branch-production-configs.yml

ํ”„๋กœ์ ํŠธ ์„ค์น˜:

$ kubectl apply -f stale-feature-branch-production-configs.yml

ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธ StaleFeatureBranch:

$ kubectl api-resources | grep stalefeaturebranches
NAME                 ... APIGROUP                             ... KIND
stalefeaturebranches ... feature-branch.dmytrostriletskyi.com ... StaleFeatureBranch

ํด๋Ÿฌ์Šคํ„ฐ์— ์—ฐ์‚ฐ์ž๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ kubectl get pods --namespace stale-feature-branch-operator
NAME                                           ... STATUS  ... AGE
stale-feature-branch-operator-6bfbfd4df8-m7sch ... Running ... 38s

๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์ฒ˜๋ฆฌํ•  ์ค€๋น„๊ฐ€ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. StaleFeatureBranch:

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Operator Version: 0.0.1"}
...
... "msg":"Starting EventSource", ... , "source":"kind source: /, Kind="}
... "msg":"Starting Controller", ...}
... "msg":"Starting workers", ..., "worker count":1}

๊ธฐ์„ฑํ’ˆ์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค fixtures (ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค ๋ชจ๋ธ๋ง์„ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด์ง„ ๊ตฌ์„ฑ) StaleFeatureBranch:

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/stale-feature-branch.yml

๊ตฌ์„ฑ์€ ํ•˜์œ„ ๋ฌธ์ž์—ด์ด ์žˆ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. -pr- ํ•œ๋ฒˆ์— 1 ะผะธะฝัƒั‚ัƒ.:

apiVersion: feature-branch.dmytrostriletskyi.com/v1
kind: StaleFeatureBranch
metadata:
  name: stale-feature-branch
spec:
  namespaceSubstring: -pr-
  afterDaysWithoutDeploy: 1 
  checkEveryMinutes: 1

์šด์˜์ž๊ฐ€ ์‘๋‹ตํ–ˆ์œผ๋ฉฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ™•์ธํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Stale feature branch is being processing.","namespaceSubstring":"-pr-","afterDaysWithoutDeploy":1,"checkEveryMinutes":1,"isDebug":"true"}

์„ธํŠธ fixtures, ๋‘ ๊ฐœ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค(project-pr-1, project-pr-2) ๊ทธ๋ฆฌ๊ณ  ๊ทธ๋“ค deployments, services, ingress, ๋“ฑ๋“ฑ:

$ kubectl apply -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/first-feature-branch.yml -f https://raw.githubusercontent.com/dmytrostriletskyi/stale-feature-branch-operator/master/fixtures/second-feature-branch.yml
...
namespace/project-pr-1 created
deployment.apps/project-pr-1 created
service/project-pr-1 created
horizontalpodautoscaler.autoscaling/project-pr-1 created
secret/project-pr-1 created
configmap/project-pr-1 created
ingress.extensions/project-pr-1 created
namespace/project-pr-2 created
deployment.apps/project-pr-2 created
service/project-pr-2 created
horizontalpodautoscaler.autoscaling/project-pr-2 created
secret/project-pr-2 created
configmap/project-pr-2 created
ingress.extensions/project-pr-2 created

์œ„์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...
NAME                              ... READY ... STATUS  ... AGE
pod/project-pr-1-848d5fdff6-rpmzw ... 1/1   ... Running ... 67s

NAME                         ... READY ... AVAILABLE ... AGE
deployment.apps/project-pr-1 ... 1/1   ... 1         ... 67s
...

์šฐ๋ฆฌ๊ฐ€ ํฌํ•จํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— debug, ๋„ค์ž„์ŠคํŽ˜์ด์Šค project-pr-1 ะธ project-pr-2๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์ฆ‰์‹œ ์‚ญ์ œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. afterDaysWithoutDeploy. ์ด๋Š” ์šด์˜์ž ๋กœ๊ทธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ kubectl logs stale-feature-branch-operator-6bfbfd4df8-m7sch -n stale-feature-branch-operator
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-1"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-1","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-1"}
... "msg":"Namespace should be deleted due to debug mode is enabled.","namespaceName":"project-pr-2"}
... "msg":"Namespace is being processing.","namespaceName":"project-pr-2","namespaceCreationTimestamp":"2020-06-16 18:43:58 +0300 EEST"}
... "msg":"Namespace has been deleted.","namespaceName":"project-pr-2"}

์ž์›์˜ ๊ฐ€์šฉ์„ฑ์„ ํ™•์ธํ•˜๋ฉด ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. Terminating (์‚ญ์ œ ํ”„๋กœ์„ธ์Šค) ๋˜๋Š” ์ด๋ฏธ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค(๋ช…๋ น ์ถœ๋ ฅ์ด ๋น„์–ด ์žˆ์Œ).

$ kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-1 && kubectl get namespace,pods,deployment,service,horizontalpodautoscaler,configmap,ingress -n project-pr-2
...

์ƒ์„ฑ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. fixtures ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ณ  XNUMX๋ถ„ ์ด๋‚ด์— ์ œ๊ฑฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋Œ€์•ˆ

ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ผํ•˜๋Š” ์šด์˜์ž ๋Œ€์‹  ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์žˆ์œผ๋ฉฐ ๋ชจ๋‘ ๋ถˆ์™„์ „ํ•˜๋ฉฐ(๋‹จ์ ์€ ์ฃผ๊ด€์ ์ž„) ๋ชจ๋“  ์‚ฌ๋žŒ์ด ํŠน์ • ํ”„๋กœ์ ํŠธ์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์Šค์Šค๋กœ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜์˜ ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋นŒ๋“œ ์ค‘์— ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    • ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋นŒ๋“œ ์ค‘์ธ ์ปค๋ฐ‹๊ณผ ๊ด€๋ จ๋œ ํ’€ ์š”์ฒญ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋Š” ํ’€ ์š”์ฒญ ์‹๋ณ„์ž(ํ•ด๋‹น ๋ฒˆํ˜ธ ๋˜๋Š” ๋ธŒ๋žœ์น˜ ์ด๋ฆ„)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์‹๋ณ„์ž๋Š” ํ•ญ์ƒ ์ปค๋ฐ‹์— ์ง€์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”„๋กœ์ ํŠธ ๋‹ค์šด๋กœ๋“œ, ํ…Œ์ŠคํŠธ ์‹คํ–‰, ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ, ๋ฆด๋ฆฌ์Šค ๋งŒ๋“ค๊ธฐ, ์•Œ๋ฆผ ๋ณด๋‚ด๊ธฐ, ๋งˆ์ง€๋ง‰ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์˜ ๊ธฐ๋Šฅ ๋ถ„๊ธฐ ์ง€์šฐ๊ธฐ ๋“ฑ์˜ ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ฆผ์„ ๋ณด๋‚ผ ๋•Œ ๋นŒ๋“œ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ ์ ˆํ•œ ์ปจํ…์ŠคํŠธ๊ฐ€ ์—†์œผ๋ฉด ๋งˆ์Šคํ„ฐ ๋นŒ๋“œ์—์„œ ๊ธฐ๋Šฅ ๋ถ„๊ธฐ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  2. ์›นํ›… ์‚ฌ์šฉ(์˜ˆ).

    • ์ด๊ฒƒ์€ ๊ท€ํ•˜์˜ ์ ‘๊ทผ ๋ฐฉ์‹์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์  ํ‚จ์Šค, ํ•œ ๊ฐ€์ง€ ์œ ํ˜•์˜ ํŒŒ์ดํ”„๋ผ์ธ๋งŒ์ด ํ•ด๋‹น ๊ตฌ์„ฑ์„ ์†Œ์Šค ์ฝ”๋“œ์— ์ €์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์›นํ›„ํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ž์ฒด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ์œ ์ง€ ๊ด€๋ฆฌ๊ฐ€ ์–ด๋ ค์šด Jenkins ์ธํ„ฐํŽ˜์ด์Šค์— ๋ฐฐ์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. ์“ฐ๊ธฐ ํฌ๋ก ์žก Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ธ€์“ฐ๊ธฐ์™€ ์ง€์›์— ์‹œ๊ฐ„์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
    • ์šด์˜์ž๋Š” ์ด๋ฏธ ์œ ์‚ฌํ•œ ์Šคํƒ€์ผ๋กœ ์ž‘์—…ํ•˜๊ณ  ๋ฌธ์„œํ™”๋˜์–ด ์ง€์›๋ฉ๋‹ˆ๋‹ค.

๊ธฐ์‚ฌ์— ๊ด€์‹ฌ์„ ๊ฐ€์ ธ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Github์˜ ํ”„๋กœ์ ํŠธ ๋งํฌ.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€