클라우드/Kubernetes

쿠버네티스 Ingress

Cloud_Park 2020. 1. 13. 18:29

Ingress

쿠버네티스는 4Layer로 TCP단에서 Pod들을 밸런싱한다.

서비스 같은경우에는 SSL, VirtualHost와 같이 여러 호스트 명을 사용하거나 호스트명에 대한 라우팅이 불가능하고, URL Path에 따른  서비스간 라우팅이 불가능하다.

또한 마이크로 서비스 아키텍쳐(MSA)같은 경우  쿠버네티스의 서비스하나가 MSA의 서비스로 표현되는 경우가 많고  서비스는 하나의 URL로 대표되는 경우가 많다.

MSA서비스간의 라우팅을 하기위해서는 API게이트웨이를 넣는 경우가 많은데,  이 경우에는 API 게이트웨이에대한 관리포인트가 생기기 때문에  URL 기반의 라우팅 정도라면

API 게이트 웨이 처럼 무거운 아키텍처 컴포넌트가 아니라 L7 로드벨런서 정도로 위의 기능을 모두 제공가능하다.

 

쿠버네티스 HTTP(S) 기반의 L7 로드밸런싱 기능을 제공하는 컴포넌트를 Ingress라고한다.

https://bcho.tistory.com/1263?category=731548

설명하자면  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/