Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Connect a Frontend to a Backend Using Services

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

์ด ์ž‘์—…์€ ํ”„๋ก ํŠธ์—”๋“œ ์™€ ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ƒ์„ฑํ•˜๋Š”์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค. ๋ฐฑ์—”๋“œ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ์ธ์‚ฌํ•˜๊ธฐ(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)