ํ•ด๋‹น ๋ฌธ์„œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฒ„์ „: v1.33

Kubernetes v1.33 ๋ฌธ์„œ๋Š” ๋” ์ด์ƒ ์ ๊ทน์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜์ง€ ์•Š์Œ. ํ˜„์žฌ ๋ณด๊ณ ์žˆ๋Š” ๋ฌธ์„œ๋Š” ์ •์  ์Šค๋ƒ…์ƒท์ž„. ์ตœ์‹  ๋ฌธ์„œ๋ฅผ ์œ„ํ•ด์„œ๋Š”, ๋‹ค์Œ์„ ์ฐธ๊ณ . ์ตœ์‹  ๋ฒ„์ „.

์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋ฐฑ์—”๋“œ์— ์—ฐ๊ฒฐ

์ด ์ž‘์—…์€ ํ”„๋ก ํŠธ์—”๋“œ ์™€ ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค. ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ์ธ์‚ฌํ•˜๊ธฐ(hello greeter)์ด๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ๋Š” nginx ๋ฐ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฑ์—”๋“œ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

๋ชฉ์ 

  • ๋””ํ”Œ๋กœ์ด๋จผํŠธ(Deployment) ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ์ƒ˜ํ”Œ hello ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.
  • ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ ์—ฌ๋Ÿฌ ๋ณต์ œ๋ณธ์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ธ๋‹ค.
  • ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ nginx ํ”„๋ก ํŠธ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค.
  • ํŠธ๋ž˜ํ”ฝ์„ ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๋ณด๋‚ด๋„๋ก ํ”„๋ก ํŠธ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  • type=LoadBalancer ์˜ ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์— ํ”„๋ก ํŠธ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•œ๋‹ค.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

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

๋ฒ„์ „ ํ™•์ธ์„ ์œ„ํ•ด์„œ, ๋‹ค์Œ ์ปค๋งจ๋“œ๋ฅผ ์‹คํ–‰ kubectl version.

์ด ์ž‘์—…์€ ์ง€์›๋˜๋Š” ํ™˜๊ฒฝ์ด ํ•„์š”ํ•œ ์™ธ๋ถ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๊ฐ€ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋งŒ์•ฝ, ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ™˜๊ฒฝ์ด๋ผ๋ฉด, ๋…ธ๋“œํฌํŠธ ์„œ๋น„์Šค ํƒ€์ž…์„ ๋Œ€์‹  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐฑ์—”๋“œ ์ƒ์„ฑํ•˜๊ธฐ

๋ฐฑ์—”๋“œ๋Š” ์ธ์‚ฌํ•˜๊ธฐ๋ผ๋Š” ๊ฐ„๋‹จํ•œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์ด๋‹ค. ์—ฌ๊ธฐ์— ๋ฐฑ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๊ตฌ์„ฑ ํŒŒ์ผ์ด ์žˆ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello
spec:
  selector:
    matchLabels:
      app: hello
      tier: backend
      track: stable
  replicas: 3
  template:
    metadata:
      labels:
        app: hello
        tier: backend
        track: stable
    spec:
      containers:
        - name: hello
          image: "gcr.io/google-samples/hello-go-gke:1.0"
          ports:
            - name: http
              containerPort: 80

๋ฐฑ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/service/access/backend-deployment.yaml

๋ฐฑ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์— ๊ด€ํ•œ ์ •๋ณด๋ฅผ ๋ณธ๋‹ค.

kubectl describe deployment backend

๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Name:                           backend
Namespace:                      default
CreationTimestamp:              Mon, 24 Oct 2016 14:21:02 -0700
Labels:                         app=hello
                                tier=backend
                                track=stable
Annotations:                    deployment.kubernetes.io/revision=1
Selector:                       app=hello,tier=backend,track=stable
Replicas:                       3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:                   RollingUpdate
MinReadySeconds:                0
RollingUpdateStrategy:          1 max unavailable, 1 max surge
Pod Template:
  Labels:       app=hello
                tier=backend
                track=stable
  Containers:
   hello:
    Image:              "gcr.io/google-samples/hello-go-gke:1.0"
    Port:               80/TCP
    Environment:        <none>
    Mounts:             <none>
  Volumes:              <none>
Conditions:
  Type          Status  Reason
  ----          ------  ------
  Available     True    MinimumReplicasAvailable
  Progressing   True    NewReplicaSetAvailable
OldReplicaSets:                 <none>
NewReplicaSet:                  hello-3621623197 (3/3 replicas created)
Events:
...

hello ์„œ๋น„์Šค ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑํ•˜๊ธฐ

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํ•ต์‹ฌ์€ ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์ด๋‹ค. ์„œ๋น„์Šค๋Š” ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์— ์–ธ์ œ๋“  ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” IP ์ฃผ์†Œ์™€ DNS ์ด๋ฆ„ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•œ๋‹ค. ์„œ๋น„์Šค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋Š” ํŒŒ๋“œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋จผ์ €, ์„œ๋น„์Šค ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์‚ดํŽด๋ณด์ž.

apiVersion: v1
kind: Service
metadata:
  name: hello
spec:
  selector:
    app: hello
    tier: backend
  ports:
  - protocol: TCP
    port: 80
    targetPort: http

๊ตฌ์„ฑ ํŒŒ์ผ์—์„œ hello ๋ผ๋Š” ์ด๋ฆ„์˜ ์„œ๋น„์Šค๊ฐ€ app: hello ๋ฐ tier: backend ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ํŒŒ๋“œ์— ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/service/access/backend-service.yaml

์ด ์‹œ์ ์—์„œ hello ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์ œ๋ณธ 3๊ฐœ๋ฅผ ์‹คํ–‰ํ•˜๋Š” backend ๋””ํ”Œ๋กœ์ด๋จผํŠธ๊ฐ€ ์žˆ๊ณ , ํ•ด๋‹น ๋ฐฑ์—”๋“œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ณด๋‚ด๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์ด ์„œ๋น„์Šค๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํ™•์ธํ•  ์ˆ˜ ์—†๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ์ƒ์„ฑํ•˜๊ธฐ

์ด์ œ ๋ฐฑ์—”๋“œ๋ฅผ ์‹คํ–‰ํ–ˆ์œผ๋ฏ€๋กœ, ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๋งŒ๋“ค๊ณ , ๋ฐฑ์—”๋“œ๋กœ์˜ ์š”์ฒญ์„ ํ”„๋ก์‹œํ•˜์—ฌ ๋ฐฑ์—”๋“œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ์ง€์ •๋œ DNS ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์›Œ์ปค ํŒŒ๋“œ์— ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค. DNS ์ด๋ฆ„์€ examples/service/access/backend-service.yaml ๊ตฌ์„ฑ ํŒŒ์ผ์˜ name ํ•„๋“œ ๊ฐ’์ธ hello ์ด๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์•ˆ์˜ ํŒŒ๋“œ๋Š” hello ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ”„๋ก์‹œํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ nginx ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋‹ค์Œ์€ nginx ๊ตฌ์„ฑ ํŒŒ์ผ์ด๋‹ค.

# The identifier Backend is internal to nginx, and used to name this specific upstream
upstream Backend {
    # hello is the internal DNS name used by the backend Service inside Kubernetes
    server hello;
}

server {
    listen 80;

    location / {
        # The following statement will proxy traffic to the upstream named Backend
        proxy_pass http://Backend;
    }
}

๋ฐฑ์—”๋“œ์™€ ๊ฐ™์ด, ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค. ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์™€ ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค ๊ฐ„์— ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค์˜ ๊ตฌ์„ฑ์— type: LoadBalancer ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์„œ๋น„์Šค๊ฐ€ ํด๋ผ์šฐ๋“œ ๊ณต๊ธ‰์ž๊ฐ€ ํ”„๋กœ๋น„์ €๋‹ํ•œ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค.

---
apiVersion: v1
kind: Service
metadata:
  name: frontend
spec:
  selector:
    app: hello
    tier: frontend
  ports:
  - protocol: "TCP"
    port: 80
    targetPort: 80
  type: LoadBalancer
...
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
spec:
  selector:
    matchLabels:
      app: hello
      tier: frontend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: hello
        tier: frontend
        track: stable
    spec:
      containers:
        - name: nginx
          image: "gcr.io/google-samples/hello-frontend:1.0"
          lifecycle:
            preStop:
              exec:
                command: ["/usr/sbin/nginx","-s","quit"]
...

ํ”„๋ก ํŠธ์—”๋“œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ์™€ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

kubectl apply -f https://k8s.io/examples/service/access/frontend-deployment.yaml
kubectl apply -f https://k8s.io/examples/service/access/frontend-service.yaml

๊ฒฐ๊ณผ๋Š” ๋‘ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ํ™•์ธํ•œ๋‹ค.

deployment.apps/frontend created
service/frontend created

ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•˜๊ธฐ

์ผ๋‹จ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ํƒ€์ž…์˜ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ์ด ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์™ธ๋ถ€ IP๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.

kubectl get service frontend --watch

frontend ์„œ๋น„์Šค์˜ ๊ตฌ์„ฑ์„ ๋ณด์—ฌ์ฃผ๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ฃผ์‹œํ•œ๋‹ค. ์ฒ˜์Œ์—, ์™ธ๋ถ€ IP๋Š” <pending> ์œผ๋กœ ๋‚˜์—ด๋œ๋‹ค.

NAME       TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)  AGE
frontend   LoadBalancer   10.51.252.116   <pending>     80/TCP   10s

ํ•˜์ง€๋งŒ, ์™ธ๋ถ€ IP๊ฐ€ ์ƒ์„ฑ๋˜์ž๋งˆ์ž ๊ตฌ์„ฑ์€ EXTERNAL-IP ์ œ๋ชฉ ์•„๋ž˜์— ์ƒˆ๋กœ์šด IP๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ฐฑ์‹ ํ•œ๋‹ค.

NAME       TYPE           CLUSTER-IP      EXTERNAL-IP        PORT(S)  AGE
frontend   LoadBalancer   10.51.252.116   XXX.XXX.XXX.XXX    80/TCP   1m

์ด์ œ ํ•ด๋‹น IP๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์™ธ๋ถ€์—์„œ frontend ์„œ๋น„์Šค์™€ ํ†ต์‹ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

ํ”„๋ก ํŠธ์—”๋“œ ํ†ตํ•ด์„œ ํŠธ๋ž˜ํ”ฝ ๋ณด๋‚ด๊ธฐ

์ด์ œ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋น„์Šค์˜ ์™ธ๋ถ€ IP์—์„œ curl ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด ์—”๋“œํฌ์ธํŠธ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

curl http://${EXTERNAL_IP} # ์•ž์˜ ์˜ˆ์—์„œ ๋ณธ EXTERNAL-IP๋กœ ์ˆ˜์ •ํ•œ๋‹ค

๊ฒฐ๊ณผ๋กœ ๋ฐฑ์—”๋“œ์—์„œ ์ƒ์„ฑ๋œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์ธ๋‹ค.

{"message":"Hello"}

์ •๋ฆฌํ•˜๊ธฐ

์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž.

kubectl delete services frontend backend

๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹, ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด, ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž.

kubectl delete deployment frontend backend

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

์ตœ์ข… ์ˆ˜์ • August 10, 2022 at 4:33 PM PST: [ko] Update links in dev-1.24-ko.3 (9fe9e1b827)