Ingress 정의
쿠버네티스 Ingress란 HTTP(S) 기반의 L7 로드밸런싱 기능을 제공하는 컴포넌트이다클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이며, 일반적으로 HTTP를 관리함. Ingress는 외부에서 쿠버네티스 내부로 들어오는 네트워크 요청을 어떻게 처리할지 결정하며, 쉽게 말해 외부에서 쿠버네티스에서 실행중인 Deployment와 Service에 접근하기 위한 관문과 같은 역할을 담당한다.
쿠버네티스 서비스는 기본적으로 L4 레이어로 TCP 단에서 Pod를 로드밸런싱한다. 그런데 MSA(마이크로 서비스 아키텍쳐)의 경우 쿠버네티스 서비스 하나가 MSA 서비스 하나로 표현되는 경우가 많고, 서비스가 하나의 URL로 대표되는 경우가 많다(/member, /product ...). 그래서 MSA 서비스 간 라우팅을 하기 위해서는 API게이트웨이를 넣는 경우가 많은데, URL기반의 라우팅 정도라면 API게이트웨이처럼 무거운 아키텍쳐 컴포넌트가 아닌 L7 로드밸런서 정도로도 라우팅이 가능하며, 이때 필요한게 바로 쿠버네티스 Ingress다.
엄밀히 말하면 Ingress는 외부로부터 들어오는 요청에 대한 로드밸런싱, TLS/SSL 인증서 처리, 도메인 기반 가상 호스팅 제공, 특정 HTTP 경로의 라우팅 등의 규칙들을 정의해 둔 자원이며, 이런 규칙들을 실제로 동작하게 해주는건 Ingress-Controller다.
하지만 클라우드 서비스를 사용하게 되면 별다른 설정없이 각 클라우드 서비스에서 자사의 로드밸런서 서비스들과 연동해서 Ingress를 사용할 수 있게 해주지만, 클라우드를 사용하지 않고 클러스터를 구축해서 사용하는 경우는 Ingress Controller를 직접 Ingress와 연동시켜줘야 하며, 이때 가장 많이 사용되는 것이 바로 Ingress-nginx다.
Ingress 적용하기
Ingress를 적용하기 위해서는 Ingress, Ingress-Controller, Ingress-nginx 적용이 필요하다.
인그레스 규칙
/foo 와 /bar 경로를 통해 서비스를 포워딩하는 Ingress 룰을 다음과 같다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 4200
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
Ingress를 정의하는 위 YAML 파일은 매우 간단하다. [1] alicek106.com 이라는 호스트 명으로 접근하는 네트워크 요청에 대해서 Ingress 규칙을 적용하되, [2] http 프로토콜을 통해 [3] /api/hostname-service 라는 경로로 접근하는 요청을 [4] hostname-service 라는 이름의 Service의 80 포트로 전달하라는 뜻이다. (hostname-service와 hostname-deplyment는 미리 생성되어 있다고 가정한다. 컨테이너의 호스트 이름을 확인하는 매우 간단한 예제이다)
rewrite-target 의 중요성
Note that the /watch and /wear URL path are what we configure on the ingress controller so we can forwarded users to the appropriate application in the backend. The applications don't have this URL/Path configured on them:
http://<ingress-service>:<ingress-port>/watch --> http://<watch-service>:<port>/
http://<ingress-service>:<ingress-port>/wear --> http://<wear-service>:<port>/
Without the rewrite-target option, this is what would happen:
http://<ingress-service>:<ingress-port>/watch --> http://<watch-service>:<port>/watch
http://<ingress-service>:<ingress-port>/wear --> http://<wear-service>:<port>/wear
Ingress Control과 Ingress Role을 만들어 할당하는 순서
1) Ingress용 Namespace만들기
2) Ingress controller에 할당할 configmap만들기
3) Ingress controller에 할당할 ServiceAccount만들기1) Ingress용 Namespace만들기
2) Ingress controller에 할당할 configmap만들기
3) Ingress controller에 할당할 ServiceAccount만들기
4) Ingress controller Deploy(Configmap 및 ServiceAccount할당)
5) Deploy된 Ingress controller를 Service를 등록하여 외부에서 접근가능케함
6) 실제 Ingress 적용할 Namespace에서 Ingress Rule생성 및 할당
'PaaS > Kubernetes' 카테고리의 다른 글
Kubernetes Master/WorkerNode Server 설치하기(CentOS+Docker) (0) | 2021.04.11 |
---|---|
(Kubernetes) 클러스터 디자인 하기 (0) | 2021.04.11 |
(Kubernetes) DNS (0) | 2021.04.07 |
(Kubernetes) Service (0) | 2021.04.06 |
(Kubernetes) Networking (0) | 2021.04.05 |