์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋กœ ์ž‘์—…ํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์˜ ์˜๊ตฌ ์—”ํ‹ฐํ‹ฐ์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ด๋Ÿฌํ•œ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๋ชจ๋ธ๊ณผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ํ•™์Šตํ•œ๋‹ค.

1 - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ์ดํ•ดํ•˜๊ธฐ

์ด ํŽ˜์ด์ง€์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API์—์„œ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„๋˜๊ณ , ๊ทธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ .yaml ํ˜•์‹์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ์ดํ•ดํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์—์„œ ์˜์†์„ฑ์„ ๊ฐ€์ง€๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ์ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ๋งํ•˜์ž๋ฉด, ๋‹ค์Œ๊ฐ™์ด ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ ์ค‘์ธ์ง€ (๊ทธ๋ฆฌ๊ณ  ์–ด๋А ๋…ธ๋“œ์—์„œ ๋™์ž‘ ์ค‘์ธ์ง€)
  • ๊ทธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค
  • ๊ทธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์–ด๋–ป๊ฒŒ ์žฌ๊ตฌ๋™ ์ •์ฑ…, ์—…๊ทธ๋ ˆ์ด๋“œ, ๊ทธ๋ฆฌ๊ณ  ๋‚ด๊ณ ์žฅ์„ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์— ๋™์ž‘ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •์ฑ…

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ํ•˜๋‚˜์˜ "์˜๋„๋ฅผ ๋‹ด์€ ๋ ˆ์ฝ”๋“œ"์ด๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์€ ๊ทธ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ง€์†์ ์œผ๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ด๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•จ์œผ๋กœ์จ, ์—ฌ๋Ÿฌ๋ถ„์ด ํด๋Ÿฌ์Šคํ„ฐ์˜ ์›Œํฌ๋กœ๋“œ๋ฅผ ์–ด๋–ค ํ˜•ํƒœ๋กœ ๋ณด์ด๊ณ ์ž ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ํšจ๊ณผ์ ์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์— ์ „ํ•œ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์—ฌ๋Ÿฌ๋ถ„์˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•ด ์˜๋„ํ•œ ์ƒํƒœ ๊ฐ€ ๋œ๋‹ค.

์ƒ์„ฑ์ด๋“ , ์ˆ˜์ •์ด๋“ , ๋˜๋Š” ์‚ญ์ œ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋™์ž‘์‹œํ‚ค๋ ค๋ฉด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•  ๋•Œ, CLI๋Š” ์—ฌ๋Ÿฌ๋ถ„ ๋Œ€์‹  ํ•„์š”ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ํ˜ธ์ถœํ•ด ์ค€๋‹ค. ๋˜ํ•œ, ์—ฌ๋Ÿฌ๋ถ„์€ ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ์ง์ ‘ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ๋ช…์„ธ(spec)์™€ ์ƒํƒœ(status)

๊ฑฐ์˜ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ๊ตฌ์„ฑ์„ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ๋‘ ๊ฐœ์˜ ์ค‘์ฒฉ๋œ ์˜ค๋ธŒ์ ํŠธ ํ•„๋“œ๋ฅผ ํฌํ•จํ•˜๋Š”๋ฐ ์˜ค๋ธŒ์ ํŠธ spec ๊ณผ ์˜ค๋ธŒ์ ํŠธ status ์ด๋‹ค. spec์„ ๊ฐ€์ง„ ์˜ค๋ธŒ์ ํŠธ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ฆฌ์†Œ์Šค์— ์›ํ•˜๋Š” ํŠน์ง•(์˜๋„ํ•œ ์ƒํƒœ)์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ œ๊ณตํ•ด์„œ ์„ค์ •ํ•œ๋‹ค.

status ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ๊ณผ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ์ œ๊ณต๋˜๊ณ  ์—…๋ฐ์ดํŠธ๋œ ์˜ค๋ธŒ์ ํŠธ์˜ ํ˜„์žฌ ์ƒํƒœ ๋ฅผ ์„ค๋ช…ํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ์˜ ์‹ค์ œ ์ƒํƒœ๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„ํ•œ ์ƒํƒœ์™€ ์ผ์น˜์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋Š์ž„์—†์ด ๊ทธ๋ฆฌ๊ณ  ๋Šฅ๋™์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋™์ž‘ํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ‘œํ˜„ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ์ด๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋””ํ”Œ๋กœ์ด๋จผํŠธ spec์— 3๊ฐœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆํ”Œ๋ฆฌ์นด๊ฐ€ ๋™์ž‘๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์€ ๊ทธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ spec์„ ์ฝ์–ด spec์— ์ผ์น˜๋˜๋„๋ก ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜์—ฌ 3๊ฐœ์˜ ์˜๋„ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋™์‹œํ‚จ๋‹ค. ๋งŒ์•ฝ, ๊ทธ ์ธ์Šคํ„ด์Šค๋“ค ์ค‘ ์–ด๋А ํ•˜๋‚˜๊ฐ€ ์–ด๋–ค ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฉˆ์ถ˜๋‹ค๋ฉด(์ƒํƒœ ๋ณ€ํ™” ๋ฐœ์ƒ), ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์€ ๋ณด์ •(์ด ๊ฒฝ์šฐ์—๋Š” ๋Œ€์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ)์„ ํ†ตํ•ด spec๊ณผ status๊ฐ„์˜ ์ฐจ์ด์— ๋Œ€์‘ํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ๋ช…์„ธ, ์ƒํƒœ, ๊ทธ๋ฆฌ๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋Š”, Kubernetes API Conventions ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๊ธฐ์ˆ ํ•˜๊ธฐ

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, (์ด๋ฆ„๊ณผ ๊ฐ™์€)์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ •๋ณด์™€ ๋”๋ถˆ์–ด, ์˜๋„ํ•œ ์ƒํƒœ๋ฅผ ๊ธฐ์ˆ ํ•œ ์˜ค๋ธŒ์ ํŠธ spec์„ ์ œ์‹œํ•ด ์ค˜์•ผ๋งŒ ํ•œ๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด (์ง์ ‘์ด๋“  ๋˜๋Š” kubectl์„ ํ†ตํ•ด์„œ๋“ ) ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋ฅผ ์ด์šฉํ•  ๋•Œ, API ์š”์ฒญ์€ ์š”์ฒญ ๋‚ด์šฉ ์•ˆ์— JSON ํ˜•์‹์œผ๋กœ ์ •๋ณด๋ฅผ ํฌํ•จ์‹œ์ผœ ์ค˜์•ผ๋งŒ ํ•œ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ •๋ณด๋ฅผ .yaml ํŒŒ์ผ๋กœ kubectl์— ์ œ๊ณตํ•œ๋‹ค. kubectl์€ API ์š”์ฒญ์ด ์ด๋ฃจ์–ด์งˆ ๋•Œ, JSON ํ˜•์‹์œผ๋กœ ์ •๋ณด๋ฅผ ๋ณ€ํ™˜์‹œ์ผœ ์ค€๋‹ค.

์—ฌ๊ธฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์œ„ํ•œ ํ•„์ˆ˜ ํ•„๋“œ์™€ ์˜ค๋ธŒ์ ํŠธ spec์„ ๋ณด์—ฌ์ฃผ๋Š” .yaml ํŒŒ์ผ ์˜ˆ์‹œ๊ฐ€ ์žˆ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

์œ„ ์˜ˆ์‹œ์™€ ๊ฐ™์ด .yaml ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋‚˜์˜ ๋ฐฉ์‹์œผ๋กœ๋Š” kubectl ์ปค๋งจ๋“œ-๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค์— ์ธ์ž๊ฐ’์œผ๋กœ .yaml ํŒŒ์ผ์„ ๊ฑด๋„ค kubectl apply ์ปค๋งจ๋“œ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค์Œ ์˜ˆ์‹œ์™€ ๊ฐ™๋‹ค.

kubectl apply -f https://k8s.io/examples/application/deployment.yaml

๊ทธ ์ถœ๋ ฅ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•˜๋‹ค.

deployment.apps/nginx-deployment created

์š”๊ตฌ๋˜๋Š” ํ•„๋“œ

์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ .yaml ํŒŒ์ผ ๋‚ด, ๋‹ค์Œ ํ•„๋“œ๋ฅผ ์œ„ํ•œ ๊ฐ’๋“ค์„ ์„ค์ •ํ•ด ์ค˜์•ผํ•œ๋‹ค.

  • apiVersion - ์ด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ๋ฒ„์ „์ด ์–ด๋–ค ๊ฒƒ์ธ์ง€
  • kind - ์–ด๋–ค ์ข…๋ฅ˜์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š”์ง€
  • metadata - ์ด๋ฆ„ ๋ฌธ์ž์—ด, UID, ๊ทธ๋ฆฌ๊ณ  ์„ ํƒ์ ์ธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํฌํ•จํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์œ ์ผํ•˜๊ฒŒ ๊ตฌ๋ถ„์ง€์–ด ์ค„ ๋ฐ์ดํ„ฐ
  • spec - ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ์–ด๋–ค ์ƒํƒœ๋ฅผ ์˜๋„ํ•˜๋Š”์ง€

์˜ค๋ธŒ์ ํŠธ spec์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ํฌ๋งท์€ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋งˆ๋‹ค ๋‹ค๋ฅด๊ณ , ๊ทธ ์˜ค๋ธŒ์ ํŠธ ํŠน์œ ์˜ ์ค‘์ฒฉ๋œ ํ•„๋“œ๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API ๋ ˆํผ๋Ÿฐ์Šค ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  spec ํฌ๋งท์„ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

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

๋‹ค์Œ ๋‚ด์šฉ

2 - ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌ

kubectl ์ปค๋งจ๋“œ๋ผ์ธ ํˆด์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์ƒ์ดํ•œ ๋ฐฉ๋ฒ•์„ ์ง€์›ํ•œ๋‹ค. ์ด ๋ฌธ์„œ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ ‘๊ทผ๋ฒ•์— ๋Œ€ํ•œ ๊ฐœ์š”๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Kubectl๋กœ ์˜ค๋ธŒ์ ํŠธ ๊ด€๋ฆฌํ•˜๊ธฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ Kubectl ์„œ์ ์—์„œ ํ™•์ธํ•œ๋‹ค.

๊ด€๋ฆฌ ๊ธฐ๋ฒ•

๊ด€๋ฆฌ๊ธฐ๋ฒ•๋Œ€์ƒ๊ถŒ์žฅ ํ™˜๊ฒฝ์ง€์›ํ•˜๋Š” ์ž‘์—…์ž ์ˆ˜ํ•™์Šต ๋‚œ์ด๋„
๋ช…๋ นํ˜• ์ปค๋งจ๋“œํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๊ฐœ๋ฐœ ํ™˜๊ฒฝ1+๋‚ฎ์Œ
๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ๊ฐœ๋ณ„ ํŒŒ์ผํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ1๋ณดํ†ต
์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ1+๋†’์Œ

๋ช…๋ นํ˜• ์ปค๋งจ๋“œ

๋ช…๋ นํ˜• ์ปค๋งจ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๋Š” ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง์ ‘ ๋™์ž‘์‹œํ‚จ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์‹คํ–‰ํ•  ์ž‘์—…์„ ์ธ์ˆ˜ ๋˜๋Š” ํ”Œ๋ž˜๊ทธ๋กœ kubectl ์ปค๋งจ๋“œ์— ์ง€์ •ํ•œ๋‹ค.

์ด๊ฒƒ์€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ผํšŒ์„ฑ ์ž‘์—…์„ ๊ฐœ์‹œ์‹œํ‚ค๊ฑฐ๋‚˜ ๋™์ž‘์‹œํ‚ค๊ธฐ ์œ„ํ•œ ์ถ”์ฒœ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๊ธฐ๋ฒ•์€ ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด์ „ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์ด๋ ฅ์„ ์ œ๊ณตํ•ด ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์‹œ

๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ nginx ์ปจํ…Œ์ด๋„ˆ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋™์‹œํ‚จ๋‹ค.

kubectl create deployment nginx --image nginx

ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„

์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์— ๋น„ํ•ด ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ปค๋งจ๋“œ๋Š” ํ•˜๋‚˜์˜ ๋™์ž‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋‹จ์–ด๋กœ ํ‘œํ˜„๋œ๋‹ค.
  • ์ปค๋งจ๋“œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋‹จ ํ•˜๋‚˜์˜ ๋‹จ๊ณ„๋งŒ์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์— ๋น„ํ•ด ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์ปค๋งจ๋“œ๋Š” ๋ณ€๊ฒฝ ๊ฒ€ํ†  ํ”„๋กœ์„ธ์Šค์™€ ํ†ตํ•ฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ปค๋งจ๋“œ๋Š” ๋ณ€๊ฒฝ์— ๊ด€ํ•œ ๊ฐ์‚ฌ ์ถ”์ (audit trail)์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ปค๋งจ๋“œ๋Š” ํ™œ์„ฑ ๋™์ž‘ ์ค‘์ธ ๊ฒฝ์šฐ๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ ˆ์ฝ”๋“œ์˜ ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ปค๋งจ๋“œ๋Š” ์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์„ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ

๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์—์„œ๋Š” kubectl ์ปค๋งจ๋“œ๋กœ ์ž‘์—…(์ƒ์„ฑ, ๊ต์ฒด ๋“ฑ), ์„ ํƒ์  ํ”Œ๋ž˜๊ทธ, ๊ทธ๋ฆฌ๊ณ  ์ตœ์†Œ ํ•˜๋‚˜์˜ ํŒŒ์ผ ์ด๋ฆ„์„ ์ง€์ •ํ•œ๋‹ค. ๊ทธ ํŒŒ์ผ์€ YAML ๋˜๋Š” JSON ํ˜•์‹์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ์˜ ์™„์ „ํ•œ ์ •์˜๋ฅผ ํฌํ•จํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

์˜ค๋ธŒ์ ํŠธ ์ •์˜์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ๋‚ด์šฉ์€ API ์ฐธ์กฐ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

์˜ˆ์‹œ

๊ตฌ์„ฑ ํŒŒ์ผ์— ์ •์˜๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl create -f nginx.yaml

๋‘ ๊ฐœ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ •์˜๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

kubectl delete -f nginx.yaml -f redis.yaml

ํ™œ์„ฑ ๋™์ž‘ํ•˜๋Š” ๊ตฌ์„ฑ์„ ๋ฎ์–ด์”€์œผ๋กœ์จ ๊ตฌ์„ฑ ํŒŒ์ผ์— ์ •์˜๋œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

kubectl replace -f nginx.yaml

ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„

๋ช…๋ นํ˜• ์ปค๋งจ๋“œ์— ๋น„ํ•ด ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ Git๊ณผ ๊ฐ™์€ ์†Œ์Šค ์ปจํŠธ๋กค ์‹œ์Šคํ…œ์— ๋ณด๊ด€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ ํ‘ธ์‹œ์™€ ๊ฐ์‚ฌ ์ถ”์  ์ „์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ฒ€ํ† ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค๋“ค๊ณผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ ์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์„ ์œ„ํ•œ ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ณตํ•œ๋‹ค.

๋ช…๋ นํ˜• ์ปค๋งจ๋“œ์— ๋น„ํ•ด ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ ์˜ค๋ธŒ์ ํŠธ ์Šคํ‚ค๋งˆ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค.
  • ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ YAML ํŒŒ์ผ์„ ๊ธฐ๋กํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ๊ณผ์ •์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์— ๋น„ํ•ด ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์˜ ๋™์ž‘์€ ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „ 1.5 ๋ถ€ํ„ฐ๋Š” ๋” ์„ฑ์ˆ™ํ•œ ๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์„ ์ œ๊ณตํ•œ๋‹ค.

์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์— ๋น„ํ•ด ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ, ํŒŒ์ผ์— ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค.
  • ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์— ๋ฐ˜์˜๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๊ต์ฒด ์ค‘์— ์†์‹ค๋œ๋‹ค.

์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ

์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๋Š” ๋กœ์ปฌ์— ๋ณด๊ด€๋œ ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๋Œ€์ƒ์œผ๋กœ ์ž‘๋™์‹œํ‚ค์ง€๋งŒ, ์‚ฌ์šฉ์ž๋Š” ํŒŒ์ผ์—์„œ ์ˆ˜ํ–‰ ํ•  ์ž‘์—…์„ ์ •์˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ, ๊ทธ๋ฆฌ๊ณ  ์‚ญ์ œ ์ž‘์—…์€ kubectl์— ์˜ํ•ด ์˜ค๋ธŒ์ ํŠธ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๊ฐ์ง€๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์กฐ์ž‘์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์‹œ

configs ๋””๋ ‰ํ„ฐ๋ฆฌ ๋‚ด ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑ ๋˜๋Š” ํŒจ์น˜ํ•œ๋‹ค. ๋จผ์ € ์–ด๋– ํ•œ ๋ณ€๊ฒฝ์ด ์ด๋ฃจ์–ด์ง€๊ฒŒ ๋ ์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด diff ํ•˜๊ณ  ๋‚˜์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl diff -f configs/
kubectl apply -f configs/

์žฌ๊ท€์ ์œผ๋กœ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

kubectl diff -R -f configs/
kubectl apply -R -f configs/

ํŠธ๋ ˆ์ด๋“œ ์˜คํ”„

๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์— ๋น„ํ•ด ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ํ™œ์„ฑ ์˜ค๋ธŒ์ ํŠธ์— ์ง์ ‘ ์ž‘์„ฑ๋œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๊ตฌ์„ฑ ํŒŒ์ผ๋กœ ๋‹ค์‹œ ๋ณ‘ํ•ฉ๋˜์ง€ ์•Š๋”๋ผ๋„ ์œ ์ง€๋œ๋‹ค.
  • ์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ์˜ ์ž‘์—… ๋ฐ ์˜ค๋ธŒ์ ํŠธ ๋ณ„ ์ž‘์—… ์œ ํ˜•(์ƒ์„ฑ, ํŒจ์น˜, ์‚ญ์ œ)์˜ ์ž๋™ ๊ฐ์ง€์— ๋” ๋‚˜์€ ์ง€์›์„ ์ œ๊ณตํ•œ๋‹ค.

๋ช…๋ นํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์— ๋น„ํ•ด ๋‹จ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์„ ์–ธํ˜• ์˜ค๋ธŒ์ ํŠธ ๊ตฌ์„ฑ์€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ต๋‹ค.
  • diff๋ฅผ ์‚ฌ์šฉํ•œ ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ๋Š” ๋ณต์žกํ•œ ๋ณ‘ํ•ฉ ๋ฐ ํŒจ์น˜ ์ž‘์—…์„ ์ผ์œผํ‚จ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

3 - ์˜ค๋ธŒ์ ํŠธ ์ด๋ฆ„๊ณผ ID

ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐ ์˜ค๋ธŒ์ ํŠธ๋Š” ํ•ด๋‹น ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•˜์—ฌ ๊ณ ์œ ํ•œ ์ด๋ฆ„ ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ, ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ์— ๊ฑธ์ณ ๊ณ ์œ ํ•œ UID ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋ฆ„์ด myapp-1234์ธ ํŒŒ๋“œ๋Š” ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋ฆ„์ด myapp-1234์ธ ํŒŒ๋“œ์™€ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ๊ฐ๊ฐ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ ์ผํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž ์ œ๊ณต ์†์„ฑ์˜ ๊ฒฝ์šฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋ ˆ์ด๋ธ”๊ณผ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

์ด๋ฆ„

/api/v1/pods/some-name๊ณผ ๊ฐ™์ด, ๋ฆฌ์†Œ์Šค URL์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํด๋ผ์ด์–ธํŠธ ์ œ๊ณต ๋ฌธ์ž์—ด.

ํŠน์ • ์‹œ์ ์— ๊ฐ™์€ ์ข…๋ฅ˜(kind) ๋‚ด์—์„œ๋Š” ํ•˜๋‚˜์˜ ์ด๋ฆ„์€ ํ•˜๋‚˜์˜ ์˜ค๋ธŒ์ ํŠธ์—๋งŒ ์ง€์ •๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œํ•œ ๊ฒฝ์šฐ, ์‚ญ์ œ๋œ ์˜ค๋ธŒ์ ํŠธ์™€ ๊ฐ™์€ ์ด๋ฆ„์„ ์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ์— ์ง€์ • ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค์Œ์€ ๋ฆฌ์†Œ์Šค์— ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋„ค ๊ฐ€์ง€ ์œ ํ˜•์˜ ์ด๋ฆ„ ์ œํ•œ ์กฐ๊ฑด์ด๋‹ค.

DNS ์„œ๋ธŒ๋„๋ฉ”์ธ ์ด๋ฆ„

๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์—๋Š” RFC 1123์— ์ •์˜๋œ ๋Œ€๋กœ DNS ์„œ๋ธŒ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฆ„์ด ๋‹ค์Œ์„ ์ถฉ์กฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • 253์ž๋ฅผ ๋„˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
  • ์†Œ๋ฌธ์ž์™€ ์˜์ˆซ์ž - ๋˜๋Š” . ๋งŒ ํฌํ•จํ•œ๋‹ค.
  • ์˜์ˆซ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • ์˜์ˆซ์ž๋กœ ๋๋‚œ๋‹ค.

RFC 1123 ๋ ˆ์ด๋ธ” ์ด๋ฆ„

์ผ๋ถ€ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์€ RFC 1123์— ์ •์˜๋œ ๋Œ€๋กœ DNS ๋ ˆ์ด๋ธ” ํ‘œ์ค€์„ ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฆ„์ด ๋‹ค์Œ์„ ์ถฉ์กฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

  • ์ตœ๋Œ€ 63์ž์ด๋‹ค.
  • ์†Œ๋ฌธ์ž์™€ ์˜์ˆซ์ž ๋˜๋Š” - ๋งŒ ํฌํ•จํ•œ๋‹ค.
  • ์˜์ˆซ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
  • ์˜์ˆซ์ž๋กœ ๋๋‚œ๋‹ค.

RFC 1035 ๋ ˆ์ด๋ธ” ์ด๋ฆ„

๋ช‡๋ช‡ ๋ฆฌ์†Œ์Šค ํƒ€์ž…์€ ์ž์‹ ์˜ ์ด๋ฆ„์„ RFC 1035์— ์ •์˜๋œ DNS ๋ ˆ์ด๋ธ” ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋„๋ก ์š”๊ตฌํ•œ๋‹ค. ์ด๊ฒƒ์€ ์ด๋ฆ„์ด ๋‹ค์Œ์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

  • ์ตœ๋Œ€ 63๊ฐœ ๋ฌธ์ž๋ฅผ ํฌํ•จ
  • ์†Œ๋ฌธ์ž ์˜์ˆซ์ž ๋˜๋Š” '-'๋งŒ ํฌํ•จ
  • ์•ŒํŒŒ๋ฒณ ๋ฌธ์ž๋กœ ์‹œ์ž‘
  • ์˜์ˆซ์ž๋กœ ๋๋‚จ

๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ ์ด๋ฆ„

์ผ๋ถ€ ๋ฆฌ์†Œ์Šค ์œ ํ˜•์—์„œ๋Š” ์ด๋ฆ„์„ ๊ฒฝ๋กœ ์„ธ๊ทธ๋จผํŠธ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ์ธ์ฝ”๋”ฉ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฆ‰ ์ด๋ฆ„์ด "." ๋˜๋Š” ".."์ด ์•„๋‹ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋ฆ„์—๋Š” "/" ๋˜๋Š” "%"๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์—†๋‹ค.

์•„๋ž˜๋Š” ํŒŒ๋“œ์˜ ์ด๋ฆ„์ด nginx-demo๋ผ๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์˜ˆ์‹œ์ด๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: nginx-demo
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

UID

์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ค‘๋ณต ์—†์ด ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์ด ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ž์—ด.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๊ตฌ๋™๋˜๋Š” ์ „์ฒด ์‹œ๊ฐ„์— ๊ฑธ์ณ ์ƒ์„ฑ๋˜๋Š” ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๋Š” ์„œ๋กœ ๊ตฌ๋ถ„๋˜๋Š” UID๋ฅผ ๊ฐ–๋Š”๋‹ค. ์ด๋Š” ๊ธฐ๋ก์ƒ ์œ ์‚ฌํ•œ ์˜ค๋ธŒ์ ํŠธ์˜ ์ถœํ˜„์„ ์„œ๋กœ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค UID๋Š” ๋ณดํŽธ์ ์œผ๋กœ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž์ด๋‹ค(๋˜๋Š” UUID๋ผ๊ณ  ํ•œ๋‹ค). UUID๋Š” ISO/IEC 9834-8 ๊ณผ ITU-T X.667 ๋กœ ํ‘œ์ค€ํ™” ๋˜์–ด ์žˆ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

4 - ๋ ˆ์ด๋ธ”๊ณผ ์…€๋ ‰ํ„ฐ

๋ ˆ์ด๋ธ” ์€ ํŒŒ๋“œ์™€ ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธ์— ์ฒจ๋ถ€๋œ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์ด๋‹ค. ๋ ˆ์ด๋ธ”์€ ์˜ค๋ธŒ์ ํŠธ์˜ ํŠน์„ฑ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ค‘์š”ํ•˜์ง€๋งŒ, ์ฝ”์–ด ์‹œ์Šคํ…œ์— ์ง์ ‘์ ์ธ ์˜๋ฏธ๋Š” ์—†๋‹ค. ๋ ˆ์ด๋ธ”๋กœ ์˜ค๋ธŒ์ ํŠธ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์„ ์„ ํƒํ•˜๊ณ , ๊ตฌ์„ฑํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ ˆ์ด๋ธ”์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์— ๋ถ™์ด๊ฑฐ๋‚˜ ์ƒ์„ฑ ์ดํ›„์— ๋ถ™์ด๊ฑฐ๋‚˜ ์–ธ์ œ๋“ ์ง€ ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ค๋ธŒ์ ํŠธ๋งˆ๋‹ค ํ‚ค์™€ ๊ฐ’์œผ๋กœ ๋ ˆ์ด๋ธ”์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ์˜ ํ‚ค๋Š” ๊ณ ์œ ํ•œ ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค.

"metadata": {
  "labels": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

๋ ˆ์ด๋ธ”์€ UI์™€ CLI์—์„œ ํšจ์œจ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฒ€์ƒ‰์— ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค. ์‹๋ณ„๋˜์ง€ ์•Š๋Š” ์ •๋ณด๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ๊ธฐ๋กํ•ด์•ผ ํ•œ๋‹ค.

์‚ฌ์šฉ ๋™๊ธฐ

๋ ˆ์ด๋ธ”์„ ์ด์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋А์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉํ•œ ๋ฐฉ์‹์œผ๋กœ ์กฐ์ง ๊ตฌ์กฐ์™€ ์‹œ์Šคํ…œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์— ๋งคํ•‘ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์„œ๋น„์Šค ๋ฐฐํฌ์™€ ๋ฐฐ์น˜ ํ”„๋กœ์„ธ์‹ฑ ํŒŒ์ดํ”„๋ผ์ธ์€ ํ”ํžˆ ๋‹ค์ฐจ์›์˜ ์—”ํ‹ฐํ‹ฐ๋“ค์ด๋‹ค(์˜ˆ: ๋‹ค์ค‘ ํŒŒํ‹ฐ์…˜ ๋˜๋Š” ๋ฐฐํฌ, ๋‹ค์ค‘ ๋ฆด๋ฆฌ์Šค ํŠธ๋ž™, ๋‹ค์ค‘ ๊ณ„์ธต, ๊ณ„์ธต ์† ์—ฌ๋Ÿฌ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋“ค). ๊ด€๋ฆฌ์—๋Š” ํฌ๋กœ์Šค-์ปคํŒ… ์ž‘์—…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ ์ด ์ž‘์—…์€ ์‚ฌ์šฉ์ž๋ณด๋‹ค๋Š” ์ธํ”„๋ผ์— ์˜ํ•ด ๊ฒฐ์ •๋œ ์—„๊ฒฉํ•œ ๊ณ„์ธต ํ‘œํ˜„์ธ ์บก์Аํ™”๋ฅผ ๊นจํŠธ๋ฆฐ๋‹ค.

๋ ˆ์ด๋ธ” ์˜ˆ์‹œ:

  • "release" : "stable", "release" : "canary"
  • "environment" : "dev", "environment" : "qa", "environment" : "production"
  • "tier" : "frontend", "tier" : "backend", "tier" : "cache"
  • "partition" : "customerA", "partition" : "customerB"
  • "track" : "daily", "track" : "weekly"

์ด ์˜ˆ์‹œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ด๋ธ”์ด๋ฉฐ, ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ๋งŒ์˜ ๊ทœ์น™(convention)์— ๋”ฐ๋ผ ์ž์œ ๋กญ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋ธŒ์ ํŠธ์— ๋ถ™์—ฌ์ง„ ๋ ˆ์ด๋ธ” ํ‚ค๋Š” ๊ณ ์œ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค.

๊ตฌ๋ฌธ๊ณผ ์บ๋ฆญํ„ฐ ์…‹

๋ ˆ์ด๋ธ” ์€ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์ด๋‹ค. ์œ ํšจํ•œ ๋ ˆ์ด๋ธ” ํ‚ค์—๋Š” ์Šฌ๋ž˜์‹œ(/)๋กœ ๊ตฌ๋ถ„๋˜๋Š” ์„ ํƒํ•œ ์ ‘๋‘์‚ฌ์™€ ์ด๋ฆ„์ด๋ผ๋Š” 2๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฆ„ ์„ธ๊ทธ๋จผํŠธ๋Š” 63์ž ๋ฏธ๋งŒ์œผ๋กœ ์‹œ์ž‘๊ณผ ๋์€ ์•ŒํŒŒ๋ฒณ๊ณผ ์ˆซ์ž([a-z0-9A-Z])์ด๋ฉฐ, ๋Œ€์‹œ(-), ๋ฐ‘์ค„(_), ์ (.)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ ‘๋‘์‚ฌ๋Š” ์„ ํƒ์ด๋‹ค. ๋งŒ์•ฝ ์ ‘๋‘์‚ฌ๋ฅผ ์ง€์ •ํ•œ ๊ฒฝ์šฐ ์ ‘๋‘์‚ฌ๋Š” DNS์˜ ํ•˜์œ„ ๋„๋ฉ”์ธ์œผ๋กœ ํ•ด์•ผ ํ•˜๋ฉฐ, ์ (.)๊ณผ ์ „์ฒด 253์ž ์ดํ•˜, ์Šฌ๋ž˜์‹œ(/)๋กœ ๊ตฌ๋ถ„๋˜๋Š” DNS ๋ ˆ์ด๋ธ”์ด๋‹ค.

์ ‘๋‘์‚ฌ๋ฅผ ์ƒ๋žตํ•˜๋ฉด ํ‚ค ๋ ˆ์ด๋ธ”์€ ๊ฐœ์ธ์šฉ์œผ๋กœ ๊ฐ„์ฃผํ•œ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ์˜ค๋ธŒ์ ํŠธ์— ์ž๋™ํ™”๋œ ์‹œ์Šคํ…œ ์ปดํฌ๋„ŒํŠธ(์˜ˆ: kube-scheduler, kube-controller-manager, kube-apiserver, kubectl ๋˜๋Š” ๋‹ค๋ฅธ ํƒ€์‚ฌ์˜ ์ž๋™ํ™” ๊ตฌ์„ฑ ์š”์†Œ)์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

kubernetes.io/์™€ k8s.io/ ์ ‘๋‘์‚ฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ํ•ต์‹ฌ ์ปดํฌ๋„ŒํŠธ๋กœ ์˜ˆ์•ฝ๋˜์–ด ์žˆ๋‹ค.

์œ ํšจํ•œ ๋ ˆ์ด๋ธ” ๊ฐ’์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • 63 ์ž ์ดํ•˜์—ฌ์•ผ ํ•˜๊ณ  (๊ณต๋ฐฑ์ผ ์ˆ˜๋„ ์žˆ์Œ),
  • (๊ณต๋ฐฑ์ด ์•„๋‹ˆ๋ผ๋ฉด) ์‹œ์ž‘๊ณผ ๋์€ ์•ŒํŒŒ๋ฒณ๊ณผ ์ˆซ์ž([a-z0-9A-Z])์ด๋ฉฐ,
  • ์•ŒํŒŒ๋ฒณ๊ณผ ์ˆซ์ž, ๋Œ€์‹œ(-), ๋ฐ‘์ค„(_), ์ (.)์„ ์ค‘๊ฐ„์— ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์˜ ์˜ˆ์‹œ๋Š” ํŒŒ๋“œ์— environment: production ๊ณผ app: nginx 2๊ฐœ์˜ ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋‹ค.


apiVersion: v1
kind: Pod
metadata:
  name: label-demo
  labels:
    environment: production
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ

์ด๋ฆ„๊ณผ UID์™€ ๋‹ค๋ฅด๊ฒŒ ๋ ˆ์ด๋ธ”์€ ๊ณ ์œ ํ•˜์ง€ ์•Š๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ๋งŽ์€ ์˜ค๋ธŒ์ ํŠธ์— ๊ฐ™์€ ๋ ˆ์ด๋ธ”์„ ๊ฐ€์งˆ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•œ๋‹ค.

๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์‚ฌ์šฉ์ž๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ฝ”์–ด ๊ทธ๋ฃน์˜ ๊ธฐ๋ณธ์ด๋‹ค.

API๋Š” ํ˜„์žฌ ์ผ์น˜์„ฑ ๊ธฐ์ค€ ๊ณผ ์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ์ด๋ผ๋Š” ๋‘ ์ข…๋ฅ˜์˜ ์…€๋ ‰ํ„ฐ๋ฅผ ์ง€์›ํ•œ๋‹ค. ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋‹ค์–‘ํ•œ ์š”๊ตฌ์‚ฌํ•ญ ์— ๋”ฐ๋ผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์–‘ํ•œ ์š”๊ตฌ์‚ฌํ•ญ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์‰ผํ‘œ ๊ธฐํ˜ธ๊ฐ€ AND(&&) ์—ฐ์‚ฐ์ž๋กœ ๊ตฌ๋ถ„๋˜๋Š” ์—ญํ• ์„ ํ•˜๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

๋น„์–ด์žˆ๊ฑฐ๋‚˜ ์ง€์ •๋˜์ง€ ์•Š์€ ์…€๋ ‰ํ„ฐ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค. ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” API ์œ ํ˜•์€ ์œ ํšจ์„ฑ๊ณผ ์˜๋ฏธ๋ฅผ ๋ฌธ์„œํ™”ํ•ด์•ผ ํ•œ๋‹ค.

์ผ์น˜์„ฑ ๊ธฐ์ค€ ์š”๊ฑด

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

environment = production
tier != frontend

์ „์ž๋Š” environment๋ฅผ ํ‚ค๋กœ ๊ฐ€์ง€๋Š” ๊ฒƒ๊ณผ production์„ ๊ฐ’์œผ๋กœ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค. ํ›„์ž๋Š” tier๋ฅผ ํ‚ค๋กœ ๊ฐ€์ง€๊ณ , ๊ฐ’์„ frontend๋ฅผ ๊ฐ€์ง€๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•˜๊ณ , tier๋ฅผ ํ‚ค๋กœ ๊ฐ€์ง€๋ฉฐ, ๊ฐ’์„ ๊ณต๋ฐฑ์œผ๋กœ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค. environment=production,tier!=frontend ์ฒ˜๋Ÿผ ์‰ผํ‘œ๋ฅผ ํ†ตํ•ด ํ•œ ๋ฌธ์žฅ์œผ๋กœ frontend๋ฅผ ์ œ์™ธํ•œ production์„ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

์ผ์น˜์„ฑ ๊ธฐ์ค€ ๋ ˆ์ด๋ธ” ์š”๊ฑด์— ๋Œ€ํ•œ ํ•˜๋‚˜์˜ ์ด์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ํŒŒ๋“œ๊ฐ€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ธฐ์ค€์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜ ์ƒ˜ํ”Œ ํŒŒ๋“œ๋Š” "accelerator=nvidia-tesla-p100" ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: cuda-test
spec:
  containers:
    - name: cuda-test
      image: "registry.k8s.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1
  nodeSelector:
    accelerator: nvidia-tesla-p100

์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ์š”๊ฑด

์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ๋ ˆ์ด๋ธ” ์š”๊ฑด์— ๋”ฐ๋ผ ๊ฐ’ ์ง‘ํ•ฉ์„ ํ‚ค๋กœ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. in,notin๊ณผ exists(ํ‚ค ์‹๋ณ„์ž๋งŒ ํ•ด๋‹น)์˜ 3๊ฐœ์˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์›ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด,

environment in (production, qa)
tier notin (frontend, backend)
partition
!partition
  • ์ฒซ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ ํ‚ค๊ฐ€ environment์ด๊ณ  ๊ฐ’์ด production ๋˜๋Š” qa์ธ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.
  • ๋‘ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ ํ‚ค๊ฐ€ tier์ด๊ณ  ๊ฐ’์ด frontend์™€ backend๋ฅผ ๊ฐ€์ง€๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ์™ธํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค์™€ ํ‚ค๋กœ tier๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ’์„ ๊ณต๋ฐฑ์œผ๋กœ ๊ฐ€์ง€๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.
  • ์„ธ ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์— ์ƒ๊ด€์—†์ด ํ‚ค๊ฐ€ partition์„ ํฌํ•จํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.
  • ๋„ค ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์— ์ƒ๊ด€์—†์ด ํ‚ค๊ฐ€ partition์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‰ผํ‘œ๋Š” AND ์—ฐ์‚ฐ์ž๋กœ ์ž‘๋™ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ partition,environment notin (qa)์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ’๊ณผ ์ƒ๊ด€์—†์ด ํ‚ค๊ฐ€ partition์ธ ๊ฒƒ๊ณผ ํ‚ค๊ฐ€ environment์ด๊ณ  ๊ฐ’์ด qa์™€ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋‹ค. ์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ environment=production๊ณผ environment in (production)์„ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค. ์œ ์‚ฌํ•˜๊ฒŒ๋Š” !=๊ณผ notin์„ ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๋ณธ๋‹ค.

์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ์š”๊ฑด์€ ์ผ์น˜์„ฑ ๊ธฐ์ค€ ์š”๊ฑด๊ณผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด partition in (customerA, customerB),environment!=qa

API

LIST์™€ WATCH ํ•„ํ„ฐ๋ง

LIST์™€ WATCH ์ž‘์—…์€ ์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฐ˜ํ™˜๋˜๋Š” ์˜ค๋ธŒ์ ํŠธ ์ง‘ํ•ฉ์„ ํ•„ํ„ฐ๋งํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ์š”๊ฑด ๋ชจ๋‘ ํ—ˆ์šฉ๋œ๋‹ค(URL ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด์„ ๊ทธ๋Œ€๋กœ ํ‘œ๊ธฐํ•จ).

  • ์ผ์น˜์„ฑ ๊ธฐ์ค€ ์š”๊ฑด: ?labelSelector=environment%3Dproduction,tier%3Dfrontend
  • ์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ์š”๊ฑด: ?labelSelector=environment+in+%28production%2Cqa%29%2Ctier+in+%28frontend%29

๋‘ ๊ฐ€์ง€ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ ์Šคํƒ€์ผ์€ ๋ชจ๋‘ REST ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ†ตํ•ด ์„ ํƒ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋ชฉ๋ก์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, kubectl๋กœ apiserver๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์ผ์น˜์„ฑ ๊ธฐ์ค€ ์œผ๋กœ ํ•˜๋Š” ์…€๋ ‰ํ„ฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get pods -l environment=production,tier=frontend

๋˜๋Š” ์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ์š”๊ฑด์„ ์‚ฌ์šฉํ•˜๋ฉด

kubectl get pods -l 'environment in (production),tier in (frontend)'

์•ž์„œ ์•ˆ๋‚ดํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ์š”๊ฑด์€ ๋” ๋ณด์—ฌ์ค€๋‹ค. ์˜ˆ์‹œ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด OR ์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get pods -l 'environment in (production, qa)'

๋˜๋Š” exists ์—ฐ์‚ฐ์ž์— ๋ถˆ์ผ์น˜ํ•œ ๊ฒƒ์œผ๋กœ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get pods -l 'environment,environment notin (frontend)'

API ์˜ค๋ธŒ์ ํŠธ์—์„œ ์ฐธ์กฐ ์„ค์ •

services ์™€ replicationcontrollers์™€ ๊ฐ™์€ ์ผ๋ถ€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋Š” ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ๋“œ์™€ ๊ฐ™์€ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค ์ง‘ํ•ฉ์„ ์„ ํƒํ•œ๋‹ค.

์„œ๋น„์Šค์™€ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ

services์—์„œ ์ง€์ •ํ•˜๋Š” ํŒŒ๋“œ ์ง‘ํ•ฉ์€ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋กœ ์ •์˜ํ•œ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ replicationcontrollers๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ๋“œ์˜ ์˜ค๋ธŒ์ ํŠธ ๊ทธ๋ฃน๋„ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋กœ ์ •์˜ํ•œ๋‹ค.

์„œ๋น„์Šค์™€ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋Š” json ๋˜๋Š” yaml ํŒŒ์ผ์— ๋งคํ•‘๋œ ์ผ์น˜์„ฑ ๊ธฐ์ค€ ์š”๊ตฌ์‚ฌํ•ญ์˜ ์…€๋ ‰ํ„ฐ๋งŒ ์ง€์›ํ•œ๋‹ค.

"selector": {
    "component" : "redis",
}

or

selector:
    component: redis

json ๋˜๋Š” yaml ์„œ์‹์—์„œ ์…€๋ ‰ํ„ฐ๋Š” component=redis ๋˜๋Š” component in (redis) ๋ชจ๋‘ ๊ฐ™์€ ๊ฒƒ์ด๋‹ค.

์„ธํŠธ-๊ธฐ๋ฐ˜ ์š”๊ฑด์„ ์ง€์›ํ•˜๋Š” ๋ฆฌ์†Œ์Šค

Job, Deployment, ReplicaSet ๊ทธ๋ฆฌ๊ณ  DaemonSet ๊ฐ™์€ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋“ค์€ ์ง‘ํ•ฉ์„ฑ ๊ธฐ์ค€ ์˜ ์š”๊ฑด๋„ ์ง€์›ํ•œ๋‹ค.

selector:
  matchLabels:
    component: redis
  matchExpressions:
    - {key: tier, operator: In, values: [cache]}
    - {key: environment, operator: NotIn, values: [dev]}

matchLabels๋Š” {key,value}์˜ ์Œ๊ณผ ๋งค์นญ๋œ๋‹ค. matchLabels์— ๋งค์นญ๋œ ๋‹จ์ผ {key,value}๋Š” matchExpressions์˜ ์š”์†Œ์™€ ๊ฐ™์œผ๋ฉฐ key ํ•„๋“œ๋Š” "key"๋กœ, operator๋Š” "In" ๊ทธ๋ฆฌ๊ณ  values์—๋Š” "value"๋งŒ ๋‚˜์—ด๋˜์–ด ์žˆ๋‹ค. matchExpressions๋Š” ํŒŒ๋“œ ์…€๋ ‰ํ„ฐ์˜ ์š”๊ฑด ๋ชฉ๋ก์ด๋‹ค. ์œ ํšจํ•œ ์—ฐ์‚ฐ์ž์—๋Š” In, NotIn, Exists ๋ฐ DoNotExist๊ฐ€ ํฌํ•จ๋œ๋‹ค. In ๋ฐ NotIn์€ ์„ค์ •๋œ ๊ฐ’์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. matchLabels์™€ matchExpressions ๋ชจ๋‘ AND๋กœ ๋˜์–ด ์žˆ์–ด ์ผ์น˜ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ์š”๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•œ๋‹ค.

๋…ธ๋“œ ์…‹ ์„ ํƒ

๋ ˆ์ด๋ธ”์„ ํ†ตํ•ด ์„ ํƒํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ ์…‹์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋…ธ๋“œ ์„ ํƒ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.

5 - ๋„ค์ž„์ŠคํŽ˜์ด์Šค

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋Š” ๋‹จ์ผ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ์˜ ๋ฆฌ์†Œ์Šค ๊ทธ๋ฃน ๊ฒฉ๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค. ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ์œ ์ผํ•ด์•ผ ํ•˜๋ฉฐ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ฐ„์—์„œ ์œ ์ผํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ์Šค์ฝ”ํ•‘์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ ์˜ค๋ธŒ์ ํŠธ (์˜ˆ: ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ์„œ๋น„์Šค ๋“ฑ) ์—๋งŒ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ ๋ฒ”์œ„์˜ ์˜ค๋ธŒ์ ํŠธ (์˜ˆ: ์Šคํ† ๋ฆฌ์ง€ํด๋ž˜์Šค, ๋…ธ๋“œ, ํผ์‹œ์Šคํ„ดํŠธ๋ณผ๋ฅจ ๋“ฑ) ์—๋Š” ์ ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒ€์ด๋‚˜, ํ”„๋กœ์ ํŠธ์— ๊ฑธ์ณ์„œ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“ค์–ด์กŒ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฑฐ์˜ ์—†๊ฑฐ๋‚˜, ์ˆ˜ ์‹ญ๋ช… ์ •๋„๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ „ํ˜€ ๊ณ ๋ คํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜์ž.

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์ด๋ฆ„์˜ ๋ฒ”์œ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋ฆฌ์†Œ์Šค์˜ ์ด๋ฆ„์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ์œ ์ผํ•ด์•ผํ•˜์ง€๋งŒ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ํ†ตํ‹€์–ด์„œ ์œ ์ผํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์„œ๋กœ ์ค‘์ฒฉ๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ๊ฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋Š” ํ•˜๋‚˜์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ž์›์„ (๋ฆฌ์†Œ์Šค ์ฟผํ„ฐ๋ฅผ ํ†ตํ•ด) ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž ์‚ฌ์ด์—์„œ ๋‚˜๋ˆ„๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

๋™์ผํ•œ ์†Œํ”„ํŠธ์›จ์–ด์˜ ๋‹ค๋ฅธ ๋ฒ„์ „๊ณผ ๊ฐ™์ด ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ดˆ๊ธฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ฒ˜์Œ์— ๋„ค ๊ฐœ์˜ ์ดˆ๊ธฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ–๋Š”๋‹ค.

default
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—๋Š” ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋จผ์ € ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
kube-node-lease
์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๊ฐ ๋…ธ๋“œ์™€ ์—ฐ๊ด€๋œ ๋ฆฌ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ–๋Š”๋‹ค. ๋…ธ๋“œ ๋ฆฌ์Šค๋Š” kubelet์ด ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ๋ณด๋‚ด์„œ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์ด ๋…ธ๋“œ์˜ ์žฅ์• ๋ฅผ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
kube-public
์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ(์ธ์ฆ๋˜์ง€ ์•Š์€ ํด๋ผ์ด์–ธํŠธ ํฌํ•จ)๊ฐ€ ์ฝ๊ธฐ ๊ถŒํ•œ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์ฃผ๋กœ ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ ์ค‘์— ๊ณต๊ฐœ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜์„œ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ๋˜์–ด ์žˆ๋‹ค. ์ด ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๊ณต๊ฐœ์ ์ธ ์„ฑ๊ฒฉ์€ ๋‹จ์ง€ ๊ด€๋ก€์ด์ง€ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์•„๋‹ˆ๋‹ค.
kube-system
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์‹œ์Šคํ…œ์—์„œ ์ƒ์„ฑํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์œ„ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‹ค๋ฃจ๊ธฐ

๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ์ƒ์„ฑ๊ณผ ์‚ญ์ œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๊ด€๋ฆฌ์ž ๊ฐ€์ด๋“œ ๋ฌธ์„œ์— ๊ธฐ์ˆ ๋˜์–ด ์žˆ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์กฐํšŒ

์‚ฌ์šฉ ์ค‘์ธ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํ˜„์žฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl get namespace
NAME              STATUS   AGE
default           Active   1d
kube-node-lease   Active   1d
kube-public       Active   1d
kube-system       Active   1d

์š”์ฒญ์— ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ค์ •ํ•˜๊ธฐ

ํ˜„์žฌ ์š”์ฒญ์— ๋Œ€ํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•ด์„œ --namespace ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด,

kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>
kubectl get pods --namespace=<insert-namespace-name-here>

์„ ํ˜ธํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์„ค์ •ํ•˜๊ธฐ

์ดํ›„ ๋ชจ๋“  kubectl ๋ช…๋ น์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์ปจํ…์ŠคํŠธ์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl config set-context --current --namespace=<insert-namespace-name-here>
# ํ™•์ธํ•˜๊ธฐ
kubectl config view --minify | grep namespace:

๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ DNS

์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ํ•ด๋‹น DNS ์—”ํŠธ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ์—”ํŠธ๋ฆฌ๋Š” <์„œ๋น„์Šค-์ด๋ฆ„>.<๋„ค์ž„์ŠคํŽ˜์ด์Šค-์ด๋ฆ„>.svc.cluster.local์˜ ํ˜•์‹์„ ๊ฐ–๋Š”๋ฐ, ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ <์„œ๋น„์Šค-์ด๋ฆ„>๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์— ๊ตญํ•œ๋œ ์„œ๋น„์Šค๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค. ๊ฐœ๋ฐœ, ์Šคํ…Œ์ด์ง•, ์šด์˜๊ณผ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋‚ด์—์„œ ๋™์ผํ•œ ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๋„˜์–ด์„œ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์ „์ฒด ์ฃผ์†Œ ๋„๋ฉ”์ธ ์ด๋ฆ„(FQDN)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์€ ์œ ํšจํ•œ RFC 1123 DNS ๋ ˆ์ด๋ธ”์ด์–ด์•ผ ํ•œ๋‹ค.

๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜์ง€๋Š” ์•Š์Œ

๋Œ€๋ถ€๋ถ„์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค(์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ๋“œ, ์„œ๋น„์Šค, ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํŠธ๋กค๋Ÿฌ ์™ธ)๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฆฌ์†Œ์Šค ์ž์ฒด๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋…ธ๋“œ๋‚˜ ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ๊ณผ ๊ฐ™์€ ์ €์ˆ˜์ค€ ๋ฆฌ์†Œ์Šค๋Š” ์–ด๋А ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋„ ์†ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‹ค์Œ์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜์ง€ ์•Š๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

# ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๋Š” ๋ฆฌ์†Œ์Šค
kubectl api-resources --namespaced=true

# ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค
kubectl api-resources --namespaced=false

์ž๋™ ๋ ˆ์ด๋ธ”๋ง

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes 1.22 [stable]

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์€ NamespaceDefaultLabelName ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š”(immutable) ๋ ˆ์ด๋ธ” kubernetes.io / metadata.name ์„ ์„ค์ •ํ•œ๋‹ค. ๋ ˆ์ด๋ธ” ๊ฐ’์€ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ด๋ฆ„์ด๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

6 - ์–ด๋…ธํ…Œ์ด์…˜

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ๋น„-์‹๋ณ„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์˜ค๋ธŒ์ ํŠธ์— ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„๊ตฌ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ค๋ธŒ์ ํŠธ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒจ๋ถ€

๋ ˆ์ด๋ธ”์ด๋‚˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฒจ๋ถ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ , ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ ์ปฌ๋ ‰์…˜์„ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด์—, ์–ด๋…ธํ…Œ์ด์…˜์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์„ ํƒํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋…ธํ…Œ์ด์…˜์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์ž‘๊ฑฐ๋‚˜ ํฌ๊ณ , ๊ตฌ์กฐ์ ์ด๊ฑฐ๋‚˜ ๊ตฌ์กฐ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ ˆ์ด๋ธ”์—์„œ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ž๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

์–ด๋…ธํ…Œ์ด์…˜์€ ๋ ˆ์ด๋ธ”๊ณผ ๊ฐ™์ด ํ‚ค/๊ฐ’ ๋งต์ด๋‹ค.

"metadata": {
  "annotations": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

๋‹ค์Œ์€ ์–ด๋…ธํ…Œ์ด์…˜์— ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด์˜ ์˜ˆ์ œ์ด๋‹ค.

  • ํ•„๋“œ๋Š” ์„ ์–ธ์  ๊ตฌ์„ฑ ๊ณ„์ธต์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํ•„๋“œ๋ฅผ ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ฒจ๋ถ€ํ•˜๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ๋˜๋Š” ์„œ๋ฒ„๊ฐ€ ์„ค์ •ํ•œ ๊ธฐ๋ณธ ๊ฐ’, ์ž๋™ ์ƒ์„ฑ๋œ ํ•„๋“œ, ๊ทธ๋ฆฌ๊ณ  ์˜คํ† ์‚ฌ์ด์ง• ๋˜๋Š” ์˜คํ† ์Šค์ผ€์ผ๋ง ์‹œ์Šคํ…œ์— ์˜ํ•ด ์„ค์ •๋œ ํ•„๋“œ์™€ ๊ตฌ๋ถ„๋œ๋‹ค.

  • ๋นŒ๋“œ, ๋ฆด๋ฆฌ์Šค, ๋˜๋Š” ํƒ€์ž„ ์Šคํƒฌํ”„, ๋ฆด๋ฆฌ์Šค ID, git ๋ธŒ๋žœ์น˜, PR ๋ฒˆํ˜ธ, ์ด๋ฏธ์ง€ ํ•ด์‹œ ๋ฐ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฃผ์†Œ์™€ ๊ฐ™์€ ์ด๋ฏธ์ง€ ์ •๋ณด.

  • ๋กœ๊น…, ๋ชจ๋‹ˆํ„ฐ๋ง, ๋ถ„์„ ๋˜๋Š” ๊ฐ์‚ฌ ๋ฆฌํฌ์ง€ํ„ฐ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ.

  • ๋””๋ฒ„๊น… ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ํด๋ผ์ด์–ธํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋˜๋Š” ๋„๊ตฌ ์ •๋ณด: ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ด๋ฆ„, ๋ฒ„์ „, ๊ทธ๋ฆฌ๊ณ  ๋นŒ๋“œ ์ •๋ณด.

  • ๋‹ค๋ฅธ ์ƒํƒœ๊ณ„ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ด€๋ จ ์˜ค๋ธŒ์ ํŠธ URL๊ณผ ๊ฐ™์€ ์‚ฌ์šฉ์ž ๋˜๋Š” ๋„๊ตฌ/์‹œ์Šคํ…œ ์ถœ์ฒ˜ ์ •๋ณด.

  • ๊ฒฝ๋Ÿ‰ ๋กค์•„์›ƒ ๋„๊ตฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ. ์˜ˆ: ๊ตฌ์„ฑ ๋˜๋Š” ์ฒดํฌํฌ์ธํŠธ

  • ์ฑ…์ž„์ž์˜ ์ „ํ™”๋ฒˆํ˜ธ ๋˜๋Š” ํ˜ธ์ถœ๊ธฐ ๋ฒˆํ˜ธ, ๋˜๋Š” ํŒ€ ์›น ์‚ฌ์ดํŠธ ๊ฐ™์€ ํ•ด๋‹น ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ์ง„์ž…์ .

  • ํ–‰๋™์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋น„ํ‘œ์ค€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์ข… ์‚ฌ์šฉ์ž์˜ ์ง€์‹œ ์‚ฌํ•ญ.

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

๋ฌธ๋ฒ•๊ณผ ์บ๋ฆญํ„ฐ ์…‹

์–ด๋…ธํ…Œ์ด์…˜ ์€ ํ‚ค/๊ฐ’ ์Œ์ด๋‹ค. ์œ ํšจํ•œ ์–ด๋…ธํ…Œ์ด์…˜ ํ‚ค์—๋Š” ๋‘ ๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์žˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๋Š” ์„ ํƒ์ ์ธ ์ ‘๋‘์‚ฌ์™€ ์ด๋ฆ„(name)์ด๋ฉฐ, ์Šฌ๋ž˜์‹œ(/)๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ์ด๋ฆ„ ์„ธ๊ทธ๋จผํŠธ๋Š” ํ•„์ˆ˜์ด๋ฉฐ, ์˜๋ฌธ ์ˆซ์ž([a-z0-9A-Z])๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋๋‚˜๋Š” 63์ž ์ดํ•˜์ด์–ด์•ผ ํ•˜๊ณ , ์‚ฌ์ด์— ๋Œ€์‹œ(-), ๋ฐ‘์ค„(_), ์ (.)์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ ‘๋‘์‚ฌ๋Š” ์„ ํƒ์ ์ด๋‹ค. ์ง€์ •๋œ ๊ฒฝ์šฐ, ์ ‘๋‘์‚ฌ๋Š” DNS ์„œ๋ธŒ๋„๋ฉ”์ธ์ด์–ด์•ผ ํ•œ๋‹ค. ์ (.)์œผ๋กœ ๊ตฌ๋ถ„๋œ ์ผ๋ จ์˜ DNS ๋ ˆ์ด๋ธ”์€ ์ด 253์ž๋ฅผ ๋„˜์ง€ ์•Š๊ณ , ๋’ค์— ์Šฌ๋ž˜์‹œ(/)๊ฐ€ ๋ถ™๋Š”๋‹ค.

์ ‘๋‘์‚ฌ๊ฐ€ ์ƒ๋žต๋˜๋ฉด, ์–ด๋…ธํ…Œ์ด์…˜ ํ‚ค๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋น„๊ณต๊ฐœ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ์ตœ์ข… ์‚ฌ์šฉ์ž ์˜ค๋ธŒ์ ํŠธ์— ์–ด๋…ธํ…Œ์ด์…˜์„ ์ถ”๊ฐ€ํ•˜๋Š” ์ž๋™ํ™”๋œ ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ์š”์†Œ(์˜ˆ :kube-scheduler, kube-controller-manager, kube-apiserver, kubectl, ๋˜๋Š” ๋‹ค๋ฅธ ์จ๋“œํŒŒํ‹ฐ ์ž๋™ํ™”)๋Š” ์ ‘๋‘์‚ฌ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

kubernetes.io/์™€ k8s.io/ ์ ‘๋‘์‚ฌ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์œ„ํ•ด ์˜ˆ์•ฝ๋˜์–ด ์žˆ๋‹ค.

๋‹ค์Œ์€ imageregistry: https://hub.docker.com/ ์–ด๋…ธํ…Œ์ด์…˜์ด ์žˆ๋Š” ํŒŒ๋“œ์˜ ๊ตฌ์„ฑ ํŒŒ์ผ ์˜ˆ์‹œ์ด๋‹ค.


apiVersion: v1
kind: Pod
metadata:
  name: annotations-demo
  annotations:
    imageregistry: "https://hub.docker.com/"
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
    ports:
    - containerPort: 80

๋‹ค์Œ ๋‚ด์šฉ

๋ ˆ์ด๋ธ”๊ณผ ์…€๋ ‰ํ„ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค.

7 - ํ•„๋“œ ์…€๋ ‰ํ„ฐ

ํ•„๋“œ ์…€๋ ‰ํ„ฐ ๋Š” ํ•œ ๊ฐœ ์ด์ƒ์˜ ๋ฆฌ์†Œ์Šค ํ•„๋“œ ๊ฐ’์— ๋”ฐ๋ผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ํ•„๋“œ ์…€๋ ‰ํ„ฐ ์ฟผ๋ฆฌ์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • metadata.name=my-service
  • metadata.namespace!=default
  • status.phase=Pending

๋‹ค์Œ์˜ kubectl ์ปค๋งจ๋“œ๋Š” status.phase ํ•„๋“œ์˜ ๊ฐ’์ด Running ์ธ ๋ชจ๋“  ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.

kubectl get pods --field-selector status.phase=Running

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•„๋“œ

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•„๋“œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ฆฌ์†Œ์Šค ์ข…๋ฅ˜์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅด๋‹ค. ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ข…๋ฅ˜๋Š” metadata.name ๊ณผ metadata.namespace ํ•„๋“œ ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ํ•„๋“œ ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์—๋Ÿฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

kubectl get ingress --field-selector foo.bar=baz
Error from server (BadRequest): Unable to find "ingresses" that match label selector "", field selector "foo.bar=baz": "foo.bar" is not a known field selector: only "metadata.name", "metadata.namespace"

์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์—ฐ์‚ฐ์ž

ํ•„๋“œ ์…€๋ ‰ํ„ฐ์—์„œ =, ==, != ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค (=์™€ ==๋Š” ๋™์ผํ•œ ์˜๋ฏธ์ด๋‹ค). ์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋‹ค์Œ์˜ kubectl ์ปค๋งจ๋“œ๋Š” default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•ด์žˆ์ง€ ์•Š์€ ๋ชจ๋“  ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.

kubectl get services  --all-namespaces --field-selector metadata.namespace!=default

์—ฐ๊ณ„๋˜๋Š” ์…€๋ ‰ํ„ฐ

๋ ˆ์ด๋ธ”์„ ๋น„๋กฏํ•œ ๋‹ค๋ฅธ ์…€๋ ‰ํ„ฐ์ฒ˜๋Ÿผ, ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋˜๋Š” ๋ชฉ๋ก์„ ํ†ตํ•ด ํ•„๋“œ ์…€๋ ‰ํ„ฐ๋ฅผ ์—ฐ๊ณ„ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์˜ kubectl ์ปค๋งจ๋“œ๋Š” status.phase ํ•„๋“œ๊ฐ€ Running ์ด ์•„๋‹ˆ๊ณ , spec.restartPolicy ํ•„๋“œ๊ฐ€ Always ์ธ ๋ชจ๋“  ํŒŒ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.

kubectl get pods --field-selector=status.phase!=Running,spec.restartPolicy=Always

์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์†Œ์Šค ์ข…๋ฅ˜

ํ•„๋“œ ์…€๋ ‰ํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฆฌ์†Œ์Šค ์ข…๋ฅ˜์— ๊ฑธ์ณ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์˜ kubectl ์ปค๋งจ๋“œ๋Š” default ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•ด์žˆ์ง€ ์•Š์€ ๋ชจ๋“  ์Šคํ…Œ์ดํŠธํ’€์…‹(StatefulSet)๊ณผ ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•œ๋‹ค.

kubectl get statefulsets,services --all-namespaces --field-selector metadata.namespace!=default

8 - ํŒŒ์ด๋„๋ผ์ด์ €

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

ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ๊ฐ€์ง„ ํŠน์ •ํ•œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์‚ญ์ œํ•˜๋„๋ก ์ง€์‹œํ•  ๋•Œ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค API๋Š” .metadata.deletionTimestamp์„ ๋ง๋ถ™์—ฌ ์‚ญ์ œํ•˜๋„๋ก ์˜ค๋ธŒ์ ํŠธ์— ํ‘œ์‹œํ•˜๋ฉฐ, 202 ์ƒํƒœ์ฝ”๋“œ(HTTP "Accepted")์„ ๋ฆฌํ„ดํ•œ๋‹ค. ๋Œ€์ƒ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ Terminating ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๋™์•ˆ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋˜๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•˜๋‚˜์˜ ํŒŒ์ด๋„๋ผ์ด์ €์—์„œ ์ •์˜ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ •์˜๋œ ์ž‘์—…์ด ์™„๋ฃŒ ํ›„์—, ๊ทธ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋Œ€์ƒ ์˜ค๋ธŒ์ ํŠธ๋กœ๋ถ€ํ„ฐ ์—ฐ๊ด€๋œ ํŒŒ์ด๋„๋ผ์ด์ €์„ ์‚ญ์ œํ•œ๋‹ค. metadata.finalizers ํ•„๋“œ๊ฐ€ ๋น„์–ด ์žˆ์„ ๋•Œ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์‚ญ์ œ๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

ํŒŒ์ด๋„๋ผ์ด์ €๊ฐ€ ๋ฆฌ์†Œ์Šค๋“ค์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์„ ์ œ์–ดํ•˜๋„๋ก ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜๋‚˜์˜ ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋Œ€์ƒ ๋ฆฌ์†Œ์†Œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์ „์— ์—ฐ๊ด€๋œ ๋ฆฌ์†Œ์Šค๋“ค ๋˜๋Š” ์ธํ”„๋ผ๋ฅผ ์ •๋ฆฌํ•˜๋„๋ก ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ์ด๋„๋ผ์ด์ €(Finalizer)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์ „ ํŠน์ • ์ •๋ฆฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ปจํŠธ๋กค๋Ÿฌ(Controller)์— ๊ฒฝ๊ณ ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์˜ ๊ฐ€๋น„์ง€(Garbage) ์ˆ˜์ง‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ์ด๋„๋ผ์ด์ €๋Š” ๋ณดํ†ต ์‹คํ–‰ํ•  ์ฝ”๋“œ๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ํŒŒ์ด๋„๋ผ์ด์ €๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋…ธํ…Œ์ด์…˜๊ณผ ๋น„์Šทํ•˜๊ฒŒ ํŠน์ • ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ‚ค๋“ค์˜ ๋ชฉ๋ก์ด๋‹ค. ์ผ๋ถ€ ํŒŒ์ด๋„๋ผ์ด์ €๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์ง€์ •ํ•˜์ง€๋งŒ, ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

ํŒŒ์ด๋„๋ผ์ด์ €์˜ ์ž‘๋™ ๋ฐฉ์‹

๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด metadata.finalizers ํ•„๋“œ์— ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œํ•˜๋ ค ํ•  ๋•Œ๋Š” ์‚ญ์ œ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” API ์„œ๋ฒ„๊ฐ€ finalizers ํ•„๋“œ์˜ ๊ฐ’์„ ์ธ์‹ํ•˜๊ณ  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

  • ์‚ญ์ œ๋ฅผ ์‹œ์ž‘ํ•œ ์‹œ๊ฐ๊ณผ ํ•จ๊ป˜ metadata.deletionTimestamp ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.
  • ์˜ค๋ธŒ์ ํŠธ์˜ metadata.finalizers ํ•„๋“œ๊ฐ€ ๋น„์›Œ์งˆ ๋•Œ๊นŒ์ง€ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ œ๊ฑฐ๋˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
  • 202 ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค(HTTP "Accepted").

์ด ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๋Š” metadata.deletionTimestamp๋ฅผ ์„ค์ •ํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์—ˆ์Œ์„ ์ธ์ง€ํ•˜์—ฌ ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ญ์ œ๊ฐ€ ์š”์ฒญ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๊ทธ ๋ฆฌ์†Œ์Šค์— ์ง€์ •๋œ ํŒŒ์ด๋„๋ผ์ด์ €์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋ ค ์‹œ๋„ํ•œ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒŒ์ด๋„๋ผ์ด์ € ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ ๋งˆ๋‹ค ๋ฆฌ์†Œ์Šค์˜ finalizers ํ•„๋“œ์—์„œ ํ•ด๋‹น ํ‚ค(key)๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค. finalizers ํ•„๋“œ๊ฐ€ ๋น„์›Œ์ง€๋ฉด deletionTimestamp ํ•„๋“œ๊ฐ€ ์„ค์ •๋œ ์˜ค๋ธŒ์ ํŠธ๋Š” ์ž๋™์œผ๋กœ ์‚ญ์ œ๋œ๋‹ค. ๋˜ํ•œ ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ์ด๋„๋ผ์ด์ €์˜ ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋กœ๋Š” ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ(Persistent Volume) ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์‹ค์ˆ˜๋กœ ์‚ญ์ œ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” kubernetes.io/pv-protection๊ฐ€ ์žˆ๋‹ค. ํŒŒ๋“œ๊ฐ€ ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉ ์ค‘์ผ ๋•Œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” pv-protection ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ์„ ์‚ญ์ œํ•˜๋ ค ํ•˜๋ฉด Terminating ์ƒํƒœ๊ฐ€ ๋˜์ง€๋งŒ ํŒŒ์ด๋„๋ผ์ด์ €๊ฐ€ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค. ํŒŒ๋“œ๊ฐ€ ํผ์‹œ์Šคํ„ดํŠธ ๋ณผ๋ฅจ์˜ ์‚ฌ์šฉ์„ ์ค‘์ง€ํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ pv-protection ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ํ•ด์ œํ•˜๊ณ  ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ณผ๋ฅจ์„ ์‚ญ์ œํ•œ๋‹ค.

์†Œ์œ ์ž ์ฐธ์กฐ, ๋ ˆ์ด๋ธ”, ํŒŒ์ด๋„๋ผ์ด์ €

๋ ˆ์ด๋ธ”(Label)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ์†Œ์œ ์ž ์ฐธ์กฐ(Owner reference)๋Š” ์˜ค๋ธŒ์ ํŠธ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์„ค๋ช…ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ(Controller)๊ฐ€ ํŒŒ๋“œ์™€ ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ จ ์˜ค๋ธŒ์ ํŠธ์˜ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์žก(Job)์ด ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์žก ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํ•ด๋‹น ํŒŒ๋“œ์— ๋ ˆ์ด๋ธ”์„ ์ ์šฉํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ๋™์ผํ•œ ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ํŒŒ๋“œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•œ๋‹ค.

๋˜ํ•œ, ์žก ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ํŒŒ๋“œ์— ์†Œ์œ ์ž ์ฐธ์กฐ๋„ ์ถ”๊ฐ€ํ•˜์—ฌ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•œ ์žก์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค. ์ด ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์žก์„ ์‚ญ์ œํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์‚ฌ์šฉ์ž ์ฐธ์กฐ(๋ ˆ์ด๋ธ” ๋Œ€์‹ )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด ์–ด๋–ค ํŒŒ๋“œ๊ฐ€ ์ •๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋˜ํ•œ ์‚ญ์ œ ๋Œ€์ƒ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์†Œ์œ ์ž ์ฐธ์กฐ๋ฅผ ์‹๋ณ„ํ•  ๋•Œ ํŒŒ์ด๋„๋ผ์ด์ €๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค.

๊ฒฝ์šฐ์— ๋”ฐ๋ผ ํŒŒ์ด๋„๋ผ์ด์ €๋Š” ์ข…์† ์˜ค๋ธŒ์ ํŠธ์˜ ์‚ญ์ œ๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋กœ ์ธํ•ด ๋Œ€์ƒ ์†Œ์œ ์ž ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์™„์ „ํžˆ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ์˜ˆ์ƒ๋ณด๋‹ค ์˜ค๋ž˜ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋Œ€์ƒ ์†Œ์œ ์ž ๋ฐ ์ข…์† ๊ฐ์ฒด์— ๋Œ€ํ•œ ํŒŒ์ด๋„๋ผ์ด์ €์™€ ์†Œ์œ ์ž ์ฐธ์กฐ๋ฅผ ํ™•์ธํ•ด ์›์ธ์„ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

9 - ๊ถŒ์žฅ ๋ ˆ์ด๋ธ”

kubectl๊ณผ ๋Œ€์‹œ๋ณด๋“œ์™€ ๊ฐ™์€ ๋งŽ์€ ๋„๊ตฌ๋“ค๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹œ๊ฐํ™” ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณตํ†ต ๋ ˆ์ด๋ธ” ์…‹์€ ๋ชจ๋“  ๋„๊ตฌ๋“ค์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ณตํ†ต์˜ ๋ฐฉ์‹์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ๋„๊ตฌ๋“ค์ด ์ƒํ˜ธ ์šด์šฉ์ ์œผ๋กœ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

๊ถŒ์žฅ ๋ ˆ์ด๋ธ”์€ ์ง€์› ๋„๊ตฌ ์™ธ์—๋„ ์ฟผ๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹๋ณ„ํ•˜๊ฒŒ ํ•œ๋‹ค.

๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜ ๊ฐœ๋…์„ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌ๋œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ํ”Œ๋žซํผ ์„œ๋น„์Šค(PaaS)๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด ๊ณต์‹์ ์ธ ๊ฐœ๋…์ด ์—†๊ฑฐ๋‚˜ ๊ฐ•์š”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋น„๊ณต์‹์ ์ด๋ฉฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋กœ ์„ค๋ช…๋œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จ๋œ ์ •์˜๋Š” ์œ ์—ฐํ•˜๋‹ค.

๊ณต์œ  ๋ ˆ์ด๋ธ”๊ณผ ์ฃผ์„์—๋Š” ๊ณตํ†ต ์ ‘๋‘์‚ฌ์ธ app.kubernetes.io ๊ฐ€ ์žˆ๋‹ค. ์ ‘๋‘์‚ฌ๊ฐ€ ์—†๋Š” ๋ ˆ์ด๋ธ”์€ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐœ์ธ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ณต์œ  ์ ‘๋‘์‚ฌ๋Š” ๊ณต์œ  ๋ ˆ์ด๋ธ”์ด ์‚ฌ์šฉ์ž ์ •์˜ ๋ ˆ์ด๋ธ”์„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.

๋ ˆ์ด๋ธ”

๋ ˆ์ด๋ธ”์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋ ค๋ฉด ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์— ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

ํ‚ค์„ค๋ช…์˜ˆ์‹œํƒ€์ž…
app.kubernetes.io/name์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„mysql๋ฌธ์ž์—ด
app.kubernetes.io/instance์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์œ ํ•œ ์ด๋ฆ„mysql-abcxzy๋ฌธ์ž์—ด
app.kubernetes.io/version์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ˜„์žฌ ๋ฒ„์ „ (์˜ˆ: SemVer 1.0, revision hash ๋“ฑ.)5.7.21๋ฌธ์ž์—ด
app.kubernetes.io/component์•„ํ‚คํ…์ฒ˜ ๋‚ด ๊ตฌ์„ฑ์š”์†Œdatabase๋ฌธ์ž์—ด
app.kubernetes.io/part-of์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ „์ฒด ์ด๋ฆ„wordpress๋ฌธ์ž์—ด
app.kubernetes.io/managed-by์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ž‘๋™์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋„๊ตฌHelm๋ฌธ์ž์—ด

์œ„ ๋ ˆ์ด๋ธ”์˜ ์‹ค์ œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ ์Šคํ…Œ์ดํŠธํ’€์…‹ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ณ ๋ คํ•œ๋‹ค.

# ์•„๋ž˜๋Š” ์ „์ฒด ๋ช…์„ธ์˜ ์ผ๋ถ€๋ถ„์ด๋‹ค
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxzy
    app.kubernetes.io/version: "5.7.21"
    app.kubernetes.io/component: database
    app.kubernetes.io/part-of: wordpress
    app.kubernetes.io/managed-by: Helm

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋™์ผํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์—, ์‹ฌ์ง€์–ด๋Š” ๋™์ผํ•œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—๋„ ํ•œ๋ฒˆ ๋˜๋Š” ๊ทธ ์ด์ƒ ์„ค์น˜๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•˜๋‚˜์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— WordPress๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ์„ค์น˜๋˜์–ด ๊ฐ๊ฐ ์„œ๋กœ ๋‹ค๋ฅธ ์›น์‚ฌ์ดํŠธ๋ฅผ ์„œ๋น„์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ด๋ฆ„๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์€ ๋ณ„๋„๋กœ ๊ธฐ๋ก๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด WordPress๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„์œผ๋กœ app.kubernetes.io/name ์ด๋ผ๋Š” ๋ ˆ์ด๋ธ”์— wordpress ๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์ง€๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์œผ๋กœ๋Š” app.kubernetes.io/instance ๋ผ๋Š” ๋ ˆ์ด๋ธ”์— wordpress-abcxzy ๋ผ๋Š” ๊ฐ’์„ ๊ฐ€์ง„๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค๋Š” ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๊ฐ€์ ธ์•ผ ํ•œ๋‹ค.

์˜ˆ์‹œ

์œ„ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์–‘ํ•œ ๋ณต์žก์„ฑ์ด ์žˆ๋‹ค.

๋‹จ์ˆœํ•œ ์Šคํ…Œ์ดํŠธ๋ฆฌ์Šค ์„œ๋น„์Šค

Deployment ์™€ Service ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ†ตํ•ด ๋ฐฐํฌ๋œ ๋‹จ์ˆœํ•œ ์Šคํ…Œ์ดํŠธ๋ฆฌ์Šค ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ๋ฅผ ๋ณด์ž. ๋‹ค์Œ ๋‘ ์‹๋ณ„์ž๋Š” ๋ ˆ์ด๋ธ”์„ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

Deployment ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ํŒŒ๋“œ๋ฅผ ๊ฐ์‹œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: myservice
    app.kubernetes.io/instance: myservice-abcxyz
...

Service๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: myservice
    app.kubernetes.io/instance: myservice-abcxyz
...

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

Helm์„ ์ด์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MySQL)์„ ์ด์šฉํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WordPress)์„ ์„ค์น˜ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ์ข€ ๋” ๋ณต์žกํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ ์‹๋ณ„์ž๋Š” ์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ์˜ ์‹œ์ž‘์„ ๋ณด์—ฌ์ค€๋‹ค.

WordPress๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Deployment ๋กœ ์‹œ์ž‘ํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.kubernetes.io/name: wordpress
    app.kubernetes.io/instance: wordpress-abcxyz
    app.kubernetes.io/version: "4.9.4"
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: server
    app.kubernetes.io/part-of: wordpress
...

Service ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: wordpress
    app.kubernetes.io/instance: wordpress-abcxyz
    app.kubernetes.io/version: "4.9.4"
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: server
    app.kubernetes.io/part-of: wordpress
...

MySQL์€ StatefulSet ์— MySQL์˜ ์†Œ์†๊ณผ ์ƒ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ๋…ธ์ถœ๋œ๋‹ค.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxyz
    app.kubernetes.io/version: "5.7.21"
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: database
    app.kubernetes.io/part-of: wordpress
...

Service ๋Š” WordPress์˜ ์ผ๋ถ€๋กœ MySQL์„ ๋…ธ์ถœํ•˜๋Š” ๋ฐ ์ด์šฉํ•œ๋‹ค.

apiVersion: v1
kind: Service
metadata:
  labels:
    app.kubernetes.io/name: mysql
    app.kubernetes.io/instance: mysql-abcxyz
    app.kubernetes.io/version: "5.7.21"
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: database
    app.kubernetes.io/part-of: wordpress
...

MySQL StatefulSet ๊ณผ Service ๋กœ MySQL๊ณผ WordPress๊ฐ€ ๋” ํฐ ๋ฒ”์œ„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋œ๋‹ค.