07D. ์ธ๊ทธ๋ ์ค์ ELB LoadBalancer ์๋น์ค ์์ฑํ๊ธฐ
07D. ์ธ๊ทธ๋ ์ค์ ELB LoadBalancer ์๋น์ค ์์ฑํ๊ธฐ ๊ด๋ จ
๋๋์ด AWS์ ELB(NLB, Network load balancer)์ ์ฐ๋๋ ์๋น์ค๋ฅผ ์์ฑํ ์ ์๊ฒ ๋์์ต๋๋ค.
์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ ์ค์นํ๊ธฐ
์ธ๊ทธ๋ ์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ Nginx ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ AWS์ฉ Nginx ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๋ฅผ ์ค์นํฉ๋๋ค.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.5.1/deploy/static/provider/aws/deploy.yaml
๋ค์ ๋ช ๋ น์ ์ ๋ ฅํ์ฌ Nginx ์ธ๊ทธ๋ ์ค ์ปจํธ๋กค๋ฌ๊ฐ ์ ๋๋ก ์ค์น๋์๋์ง ํ์ธํด๋ด ๋๋ค.
kubectl -n ingress-nginx get service
#
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# ingress-nginx-controller LoadBalancer 100.68.245.83 a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com 80:32325/TCP,443:31028/TCP 15m
# ingress-nginx-controller-admission ClusterIP 100.68.74.143 <none> 443/TCP 15m
ingress-nginx-controller
์ TYPE์ ๋ณด๋ฉด LoadBalancer
๋ก ์ค์ ๋ ๊ฒ์ ๋ณผ ์ ์๊ณ , EXTERNAL-IP
์๋ ELB(NLB)์ ๋๋ฉ์ธ์ด ํ์๋ฉ๋๋ค. ์ฆ, AWS์ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ํตํด ํธ๋ํฝ์ ๋ฐ์ ์ ์๊ฒ ๋ ๊ฒ์
๋๋ค.
๋ํ๋ก์ด๋จผํธ, ์๋น์ค ์์ฑํ๊ธฐ
๋ค์ ๋ด์ฉ์ deployment.yaml
ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
https://github.com/pyrasis/jHLsKubernetes/blob/main/Unit07/deployment.yaml
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-nginx
spec:
replicas: 1
selector:
matchLabels:
app: hello-nginx
template:
metadata:
labels:
app: hello-nginx
spec:
containers:
- name: hello-nginx
image: nginx:latest
ports:
- containerPort: 80
๋ค์ ๋ช
๋ น์ ์คํํ์ฌ deployment.yaml
ํ์ผ๋ก ๋ํ๋ก์ด๋จผํธ๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f deployment.yaml
deployment.apps/hello-nginx created
์ด๋ฒ์๋ ์๋น์ค๋ฅผ ์์ฑํฉ๋๋ค. ๋ค์ ๋ด์ฉ์ service.yaml
ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
https://github.com/pyrasis/jHLsKubernetes/blob/main/Unit07/service.yaml
service.yaml
apiVersion: v1
kind: Service
metadata:
name: hello-nginx
spec:
selector:
app: hello-nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
๋ค์ ๋ช
๋ น์ ์คํํ์ฌ service.yaml
ํ์ผ๋ก ์๋น์ค๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f service.yaml
service/hello-nginx created
๋ํ๋ก์ด๋จผํธ์ ์๋น์ค๋ ์ง๊ธ๊น์ง ๋ง๋ค์๋ ๊ฒ๊ณผ ๊ฐ์ ํ์์ด๋ฏ๋ก ๋ฐ๋ก ์ค๋ช ํ์ง ์๊ฒ ์ต๋๋ค.
์ธ๊ทธ๋ ์ค ๋ง๋ค๊ธฐ
๋๋ฉ์ธ์ ๊ตฌ์ ํ ๊ฒฝ์ฐ
์ด์ ์ธ๊ทธ๋ ์ค๋ฅผ ๋ง๋ค ์ฐจ๋ก์
๋๋ค. ๋ค์ ๋ด์ฉ์ ingress.yaml
ํ์ผ๋ก ์ ์ฅํฉ๋๋ค. ์ด๋ host
๋ถ๋ถ์ hello.<๊ตฌ์
ํ ๋๋ฉ์ธ>
์ผ๋ก ์ค์ ํด์ค๋๋ค. ํนํ apex ๋๋ฉ์ธ(root ๋๋ฉ์ธ)์ Route 53์ ์๋์ผ๋ก ๋ ์ฝ๋๊ฐ ์์ฑ๋์ง ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค. ๋ฐ๋์ ์๋ธ ๋๋ฉ์ธ์ผ๋ก ์ค์ ํด์ค๋๋ค.
https://github.com/pyrasis/jHLsKubernetes/blob/main/Unit07/ingress.yaml
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-nginx
spec:
ingressClassName: nginx
rules:
- host: hello.<๊ตฌ์
ํ ๋๋ฉ์ธ>
http:
paths:
- backend:
service:
name: hello-nginx
port:
number: 80
path: /
pathType: Prefix
์ ์ฅ์ด ๋๋ฌ์ผ๋ฉด ์ธ๊ทธ๋ ์ค๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f ingress.yaml
๋ง์ฝ ๋๋ฉ์ธ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ingress.yaml
์์ ๋๋ฉ์ธ์ ์์ ํ ๋ค kubectl apply
๋ฅผ ํด์๋ Route 53์ ์ ์ฉ์ด ๋์ง ์์ต๋๋ค. ์ด๋๋ ์ธ๊ทธ๋ ์ค๋ฅผ ์ญ์ ํ ๋ค์ ์์ฑํด์ผ ํฉ๋๋ค.
kubectl delete -f ingress.yaml
kubectl create -f ingress.yaml
webhook ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด?
๋ค์๊ณผ ๊ฐ์ด Internal error occurred: failed calling webhook
์๋ฌ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.
# error: failed to create ingress: Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": context deadline exceeded
์ด๋๋ ๋ค์ ๋ช
๋ น์ ์
๋ ฅํ์ฌ ingress-nginx-admission
webhook ์ค์ ์ ์ญ์ ํด์ค๋๋ค. ์ง๊ธ์ ์ด webhook์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ญ์ ํด๋ ๊ด์ฐฎ์ต๋๋ค.
kubectl delete validatingwebhookconfiguration ingress-nginx-admission
์ญ์ ๋์๋ค๋ฉด ๋ค์ ์ธ๊ทธ๋ ์ค๋ฅผ ์์ฑํด๋ด ๋๋ค.
kubectl create -f ingress.yaml
์ด์ kubectl get ingress
๋ช
๋ น์ผ๋ก ์ธ๊ทธ๋ ์ค๋ฅผ ์ถ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
kubectl get ingress
#
# NAME CLASS HOSTS ADDRESS PORTS AGE
# hello-nginx nginx <๊ตฌ์
ํ ๋๋ฉ์ธ> a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com 80 26m
HOSTS์ ๋๋ฉ์ธ์ผ๋ก <๊ตฌ์
ํ ๋๋ฉ์ธ>
์ด ์ค์ ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ADDRESS์๋ ELB(NLB)์ ๋๋ฉ์ธ์ด ํ์๋ฉ๋๋ค. ์ ๋ a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com
๊ฐ ๋์์ง๋ง, ์ด ๋๋ฉ์ธ์ ๊ฐ์ ๋ค๋ฅด๊ฒ ๋์ฌ ๊ฒ์
๋๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ http://<๊ตฌ์
ํ ๋๋ฉ์ธ>
์ ์ํ๋ฉด **Welcome to nginx!**๊ฐ ํ์๋ ๊ฒ์
๋๋ค.
์ค์ต์ด ๋๋ฌ์ผ๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ํด๋ฌ์คํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.
kops delete cluster --name k8s.ap-northeast-2.aws.hello.com --yes
๋๋ฉ์ธ์ ๊ตฌ์ ํ์ง ์์ ๊ฒฝ์ฐ
์ด์ ์ธ๊ทธ๋ ์ค๋ฅผ ๋ง๋ค ์ฐจ๋ก์
๋๋ค. ๋ค์ ๋ด์ฉ์ ingress.yaml
ํ์ผ๋ก ์ ์ฅํฉ๋๋ค.
https://github.com/pyrasis/jHLsKubernetes/blob/main/Unit07/ingress.yaml
ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-nginx
spec:
ingressClassName: nginx
rules:
- host: nginx.hello.com
http:
paths:
- backend:
service:
name: hello-nginx
port:
number: 80
path: /
pathType: Prefix
์ ์ฅ์ด ๋๋ฌ์ผ๋ฉด ์ธ๊ทธ๋ ์ค๋ฅผ ์์ฑํฉ๋๋ค.
kubectl create -f ingress.yaml
webhook ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด?
๋ค์๊ณผ ๊ฐ์ด Internal error occurred: failed calling webhook
์๋ฌ๊ฐ ๋ฐ์ํ ์๋ ์์ต๋๋ค.
# error: failed to create ingress: Internal error occurred: failed calling webhook "validate.nginx.ingress.kubernetes.io": failed to call webhook: Post "https://ingress-nginx-controller-admission.ingress-nginx.svc:443/networking/v1/ingresses?timeout=10s": context deadline exceeded
์ด๋๋ ๋ค์ ๋ช
๋ น์ ์
๋ ฅํ์ฌ ingress-nginx-admission
webhook ์ค์ ์ ์ญ์ ํด์ค๋๋ค. ์ง๊ธ์ ์ด webhook์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์ญ์ ํด๋ ๊ด์ฐฎ์ต๋๋ค.
kubectl delete validatingwebhookconfiguration ingress-nginx-admission
์ญ์ ๋์๋ค๋ฉด ๋ค์ ์ธ๊ทธ๋ ์ค๋ฅผ ์์ฑํด๋ด ๋๋ค.
kubectl create -f ingress.yaml
์ด์ kubectl get ingress
๋ช
๋ น์ผ๋ก ์ธ๊ทธ๋ ์ค๋ฅผ ์ถ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
kubectl get ingress
#
# NAME CLASS HOSTS ADDRESS PORTS AGE
# hello-nginx nginx nginx.hello.com a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com 80 26m
HOSTS์ ๋๋ฉ์ธ์ผ๋ก nginx.hello.com
์ด ์ค์ ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ADDRESS์๋ ELB(NLB)์ ๋๋ฉ์ธ์ด ํ์๋ฉ๋๋ค. ์ ๋ a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com
๊ฐ ๋์์ง๋ง, ์ด ๋๋ฉ์ธ์ ๊ฐ์ ๋ค๋ฅด๊ฒ ๋์ฌ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋ ์ค์ ๋ก hello.com
๋๋ฉ์ธ์ ๊ตฌ์
ํ์ง ์์์ผ๋ฏ๋ก, ๋ก์ปฌ์์ ์์๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํด์ผ ํฉ๋๋ค. ์ฆ, nginx.hello.com
๋๋ฉ์ธ์ด ELB์ IP ์ฃผ์๋ก ์ฐ๊ฒฐ๋๋๋ก ์ค์ ํ๋ ๊ฒ์
๋๋ค. ์ด์์ฒด์ ๋ณ๋ก ์ค์ ํ์ผ์ด ์กฐ๊ธ ๋ค๋ฅธ๋ฐ, ๊ฐ์ ์ด์์ฒด์ ์ ๋ง๋ ํ์ผ์ ์์ ํฉ๋๋ค.
๋จผ์ ping
๋ช
๋ น์ผ๋ก ELB(NLB)์ IP ์ฃผ์๋ฅผ ์์๋
๋๋ค.
ping a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com
#
# PING a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com (3.37.156.171) 56(84) bytes of data.
ping a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com
#
# Pinging a9d2164f4b43b43749deeb45a44e6458-1692cf8342f016af.elb.ap-northeast-2.amazonaws.com [3.37.156.171] with 32 bytes of data:
IP ์ฃผ์๊ฐ ์ถ๋ ฅ๋๋ฉด Ctrl+C๋ฅผ ๋๋ฌ ping
๋ช
๋ น์ ์ข
๋ฃ์ํต๋๋ค. ์ ๋ IP ์ฃผ์๊ฐ 3.37.156.171
๋ก ๋์์ง๋ง, ELB ๋๋ฉ์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ ๋ค๋ฅด๊ฒ ๋์ฌ ๊ฒ์
๋๋ค(<ELB์ ํผ๋ธ๋ฆญ IPv4 ์ฃผ์>
).
๋ฆฌ๋
์ค, macOS๋ /etc/
hosts
ํ์ผ์ ์์ ํด์ผ ํฉ๋๋ค. root ๊ถํ์ด ์์ด์ผ ํ๋ฏ๋ก sudo vim
์ผ๋ก ์์ ํฉ๋๋ค.
sudo vim /etc/hosts
/etc/hosts
ํ์ผ์ ๋ง์ง๋ง ๋ถ๋ถ์ ๋ค์ ๋ด์ฉ์ ์ถ๊ฐํ ๋ค ์ ์ฅํฉ๋๋ค.
/etc/
hosts
<ELB์ ํผ๋ธ๋ฆญ IPv4 ์ฃผ์> nginx.hello.com
์๋์ฐ๋ C:\Windows\System32\drivers\etc\
hosts
ํ์ผ์ ์์ ํด์ผ ํฉ๋๋ค. ๊ด๋ฆฌ์ ๊ถํ์ด ํ์ํ๋ฏ๋ก, ๋ฉ๋ชจ์ฅ์ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์คํํ ๋ค ํ์ผ์ ์ฝ๋๋ค.
. C:\Windows\System32\drivers\etc\
hosts
ํ์ผ์ ๋ง์ง๋ง ๋ถ๋ถ์ ๋ค์ ๋ด์ฉ์ ์ถ๊ฐํ ๋ค ์ ์ฅํฉ๋๋ค.
C:\Windows\System32\drivers\etc\
hosts
<ELB์ ํผ๋ธ๋ฆญ IPv4 ์ฃผ์> nginx.hello.com
๋ฉ๋ชจ์ฅ์์ hosts ํ์ผ์ด ๋ณด์ด์ง ์๋๋ค๋ฉด?
๋ฉ๋ชจ์ฅ์์ hosts ํ์ผ์ด ๋ณด์ด์ง ์๋๋ค๋ฉด, ์ด๊ธฐ ์ฐฝ์์ ์ด๊ธฐ(O) ๋ฒํผ ์์ **ํ ์คํธ ๋ฌธ์(*.txt)**๋ฅผ **๋ชจ๋ ํ์ผ (*.*)**๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค.
์น ๋ธ๋ผ์ฐ์ ๋ฅผ ์ด๊ณ http://nginx.hello.com ์ ์ํ๋ฉด **Welcome to nginx!**๊ฐ ํ์๋ ๊ฒ์ ๋๋ค.
์ฆ, ์ง๊ธ๊น์ง ๊ตฌ์ถํ๋ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ชจ์์ด ๋ฉ๋๋ค.
์ค์ต์ด ๋๋ฌ์ผ๋ฉด ๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ํด๋ฌ์คํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.
kops delete cluster --name k8s.ap-northeast-2.aws.hello.com --yes
EC2 ๋น์ฉ ๋ฌธ์
AWS์์ EC2, ELB๋ฅผ ์ฌ์ฉํ ๋๋ ์๊ฐ๋น ๋น์ฉ์ด ์ฒญ๊ตฌ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ค์ต์ ์ ์ํ ๋๋ด๋ ๊ฒ์ด ์ ๋ฆฌํ๋ฉฐ ์ค์ต์ด ๋๋๋ฉด ๋ฐ๋์ ๋ชจ๋ ์ธ์คํด์ค์ ELB(NLB)๋ฅผ ์ญ์ (terminate)ํด์ผ ํฉ๋๋ค. ์ญ์ ํ์ง ์๊ณ ๊ทธ๋ฅ ์๊ณ ์์๋ค๊ฐ๋ ์๊ธ ํญํ์ ๋ง์ ์ ์์ผ๋ ์ด ๋ถ๋ถ์ ์ ๋ง ์ฃผ์ํด์ผ ํฉ๋๋ค.