쿠버네티스 Ingress
Ingress
쿠버네티스는 4Layer로 TCP단에서 Pod들을 밸런싱한다.
서비스 같은경우에는 SSL, VirtualHost와 같이 여러 호스트 명을 사용하거나 호스트명에 대한 라우팅이 불가능하고, URL Path에 따른 서비스간 라우팅이 불가능하다.
또한 마이크로 서비스 아키텍쳐(MSA)같은 경우 쿠버네티스의 서비스하나가 MSA의 서비스로 표현되는 경우가 많고 서비스는 하나의 URL로 대표되는 경우가 많다.
MSA서비스간의 라우팅을 하기위해서는 API게이트웨이를 넣는 경우가 많은데, 이 경우에는 API 게이트웨이에대한 관리포인트가 생기기 때문에 URL 기반의 라우팅 정도라면
API 게이트 웨이 처럼 무거운 아키텍처 컴포넌트가 아니라 L7 로드벨런서 정도로 위의 기능을 모두 제공가능하다.
쿠버네티스 HTTP(S) 기반의 L7 로드밸런싱 기능을 제공하는 컴포넌트를 Ingress라고한다.
설명하자면 ingress가 앞에 붙어서 URL로 각각 라우팅해주는 구조가 된다
위 그림처럼 User, products 서비스 두개를 구현하여 배포하고 이를 Ingress를 이용하여 URL로 라우팅하는 방법을 구현해보자.
파일 1. users,2. product 도 문자열만 바꿔서
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
users-svc-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: users-node-svc
spec:
selector:
app: users
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
|
cs |
Ingress를 배포하려면 nodeport타임으로 배포해야한다.
user서비스를 node port로 배포하는 yaml파일
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
users-svc-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: users-node-svc
spec:
selector:
app: users
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 8080
|
cs |
**targetport만 잡고 nodeport를 설정하지 않으면 자동으로 nodeport를 지정해준다.
확인하기
$ kubectl get services
Ingress 생성해보기
hello-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress
spec:
rules:
- http:
paths:
- path: /users/*
backend:
serviceName: users-node-svc
servicePort: 80
- path: /products/*
backend:
serviceName: products-node-svc
servicePort: 80
spec 부분에
rule->http->paths 밑 path에 url을 지정해준다.
실행하기
kubectl create -f [filename].yaml
확인하기
kubectl get ing // 1~2분 소요됨 (healthcheck를 확인해야하기 때문에 이전에 404,500에러가 난다)
결과확인
curl [ip]/user/
curl [ip] /product/
StaticIP 지정하기
gcp에선 gcloud명령어로 생성가능하다 --global 옵션은 --regional 과 다르게 구글클라우드 망 가속기능을 사용하기때문에 구글 클라우드의 100+의 pop을 이용하여 가속하게된다.
더 깊게 설명하자면 일반적으로 한국 -인터넷- 미국으로 트래픽이 간다. 하지만 global같은 경우 한국-인터넷-일본(pop)-미국)이라 더 빠르다고한다.
생성하기
gcloud compute addresses create hello-ingress-ip --global
static ip를 이용하여 ingree만들기
파일이름 hello-ingress-staticip[.yaml
내용
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: hello-ingress-staticip
annotations:
kubernetes.io/ingress.global-static-ip-name: "hello-ingress-ip"
spec:
rules:
- http:
paths:
- path: /users/*
backend:
serviceName: users-node-svc
servicePort: 80
- path: /products/*
backend:
serviceName: products-node-svc
servicePort: 80
등록하기
kubectl create -f hello-ingress-staticip.yaml
확인하기
kubectl get ing
결과확인하기
curl [ip]/user/