ํด๋น ๋ฌธ์์ ์ฟ ๋ฒ๋คํฐ์ค ๋ฒ์ : 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
์ฐธ๊ณ :
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์ ๋ํด ๋ ์์๋ณธ๋ค.