Ingress란
- k8s의 Ingress는 외부에서 k8s cluster 내부로 들어오는 네트워크 요청 즉, Ingress 트래픽을 어떻게 처리할지 정의한다.
- 다시 말하면, Ingress는 외부에서 k8s에서 실행 중인 Deployment와 Service에 접근하기 위한, 일종의 관문(Gateway) 같은 역할을 담당한다.
- Ingress를 사용하지 않았다고 가정했을 때, 외부 요청을 처리할 수 있는 선택지는 NodePort, ExternalIP 등이 있다.
- 그러나 이러한 방법들은 일반적으로 Layer4(TCP,UDP)에서의 요청을 처리하며, 네트워크 요청에 대한 세부적인 처리 로직을 구현하기는 아무래도 한계가 있다.
- k8s의 Ingress는 Layer 7에서의 요청을 처리할 수 있다.
- 외부로부터 들어오는 요청에 대한 Load Balancing, TLS/SSL 인증서 처리, 특정 HTTP 경로의 라우팅 등을 Ingress를 통해 자세하게 정의할 수 있다.
- 물론, 이러한 기능들은 위에서 언급한 NodePort 등의 방법으로도 절대로 불가능한 것은 아니지만, 이러한 세부적인 로직을 모든 애플리케이션 개발 레벨에서 각각 구현하게 되면 서비스 운영 측면에서 추가적인 복잡성이 발생한다.
- 그 대신에, 외부 요청을 어떻게 처리할 것인지를 정의하는 집합인 Ingress를 정의한 뒤, 이를 Ingress Controller라고 부르는 특별한 웹 서버에 적용함으로써 추상화된 단계에서 서비스 처리 로직을 정의할 수 있다.
- 또한, Ingress Controller 종류 및 사용 중인 Cloud Provider에 따라 다양한 기능을 부가적으로 사용할 수도 있으니, 서비스를 외부로 노출시켜 제공해야 한다면 Ingress를 사용하는 것이 바람직하다.
- Ingress 요청을 처리하기 위한 Service는 일반적으로 Cloud Platform에서 제공되는 Load Balanser 타입의 Service를 사용한다.
- Private Cloud에서 운영하고 있는 서버에 Ingress를 직접 구축하게 된다면, Service의 Type으로서 NodePort 또는 ExternalIP, MetalLB 등을 대신 사용할 수 있다.
Ingress 와 Ingress Controller
- k8s 에서 Ingress 를 사용하기 위해서는 두 가지가 필요하다.
- 첫번째는 YAML 파일에서 [ kind: Ingress ]로 정의되는 Ingress 오브젝트이다.
- 두번째는 Ingress 규칙이 적용될 Ingress Controller 이다.
- Ingress 를 정의하는 YAML 파일은 아래와 같이 작성할 수 있다.
- 0. nginx.ingress.kubernetes.io/rewrite-target : rule 의 path 에 지정된 경로를 해당 주석에
설정된 경로로 Redirect 한다.
- 1. Yangseunghyun.com 이라는 host name 으로 접근하는 네트워크 요청에 대해 Ingress
규칙을 적용하되,
- 2. http 프로토콜을 통하며,
- 3. /api/hostname-service 라는 경로로 접근하는 요청을
- 4. hostname-service 라는 이름의 Service 의 80 포트로 전달하라는 의미이다.
- 5. Deployment 와 Service 는 미리 생성되어 있다고 가정하며, 위 ingress yaml 은
container host name 을 확인하는 예제이다.
- Ingress 는 단지 Ingress 규칙을 정의하는 선언적인 오브젝트일 뿐, 외부 요청을 받아들이는
실제 서버가 아니기 때문이다.
- Ingress 는 Ingress Controller 라고 하는 특수한 서버 컨테이너에 적용되어야 Ingress 에
적용된 규칙이 활성화된다.
- 즉, Ingress Controller 가 외부로부터 네트워크 요청을 수신했을 때, Ingress 규칙에 기반해
이 요청을 어떻게 처리할지를 결정한다.
Ingress Controller 구성(commandline)
- Ingress-nginx는 Nginx를 reverse proxy와 load balancer로 사용하는 k8s 용 Ingress Controller이다.
- Ingress-nginx Ingress Controller는 아래 사이트를 통해 설치 방법 및 버전을 확인할 수 있다.
- https://kubernetes.github.io/ingress-nginx/
- Ingress Controller를 제공하는 template 파일을 다운로드 받아서 실행한다.
컨트롤러 설치 및 네임스페이스 생성 및 어플리케이션 pod 배포
# 컨트롤러 설치
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.0/deploy/static/provider/baremetal/deploy.yaml
# 만약 컨트롤러의 type 혹은 nodeport를 변경하고 싶다면 kubectl edit svc ingress-nginx-controller -n ingress-nginx 명령어 실행 후 수정하면 된다.
# yang 네임스페이스 생성
$ kubectl create namespace yang
# 어플리케이션 배포
$ vi yang.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: naver
spec:
replicas: 3
selector:
matchLabels:
app: naver
template:
metadata:
labels:
app: naver
spec:
containers:
- name: naver
image: nginx
ports:
- containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
containers:
- name: test
image: nginx
ports:
- containerPort: 80
$ kubectl apply -f yang.yaml -n yang
서비스 노출 – ClusterIP 방식
$ vi service.yaml
apiVersion: v1
kind: Service
metadata:
name: naver
spec:
type: ClusterIP
selector:
app: naver
ports:
- port: 80
targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: test
spec:
type: ClusterIP
selector:
app: test
ports:
- port: 80
targetPort: 80
$ kubectl apply -f service.yaml -n yang
Ingress 규칙
$ vi ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
ingressClassName: nginx
rules:
- host: yangseunghyun.com
http:
paths:
- path: /naver
pathType: Prefix
backend:
service:
name: naver
port:
number: 80
- path: /yangtest
pathType: Prefix
backend:
service:
name: test
port:
number: 80
$ kubectl apply -f ingress.yaml -n yang
hosts 등록
- Host는 별도로 운영체제의 hosts 파일을 설정해 주어야한다.
- (리눅스: /etc/hosts, 윈도우: c:\Windows\System32\Drivers\etc\hosts).
어플리케이션 호출
- 서비스, 파드, 엔드포인트, 인그레스 상세 정보 확인
$ watch -n 1 curl yangseunghyun.com:30001/naver
$ watch -n 1 curl yangseunghyun.com:30001/yangtest
- 어플리케이션을 curl 명령을 이용하여 1초마다 naver, yangtest를 호출합니다.
- Ingress Controller NodePort는 30001번이다.
감사합니다