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
์ฐธ๊ณ :
nginx ๊ตฌ์ฑ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ๋ฐ์ ๋์๋ค. ์ด๋ฅผ ์คํํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ๊ตฌ์ฑ์ ๋ณด๋ค ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์๋ ์ปจํผ๊ทธ๋งต(ConfigMap)์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.ํ๋ก ํธ์๋ ์๋น์ค์ ํต์ ํ๊ธฐ
์ผ๋จ ๋ก๋๋ฐธ๋ฐ์ ํ์ ์ ์๋น์ค๋ฅผ ์์ฑํ๋ฉด, ์ด ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ์ธ๋ถ 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
๋ค์ ๋ด์ฉ
- ์๋น์ค์ ๋ํด ๋ ์์๋ณธ๋ค.
- ์ปจํผ๊ทธ๋งต์ ๋ํด ๋ ์์๋ณธ๋ค.
- ์๋น์ค์ ํ๋์ฉ DNS์ ๋ํด ๋ ์์๋ณธ๋ค.