인그레스(Ingress)란?
ingress를 이해하려면 ingress controller를 이해해야 한다.
ingress는 트래픽을 어떻게 라우팅 할 것인가를 정리한 '룰'이고
ingress controller는 ingress의 룰을 적용하여 실제로 라우팅하는 App이다.
정리하면
ingress로 라우팅룰을 설정하면
ingress controller은 ingress를 검증하고 룰을 적용한다.
오픈소스로 공개된 ingress-nginx-controller를 기준으로 보자.( https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml )
K8S 외부의 트래픽은 ingress controller의 로드밸런서 서비스를 통해 K8S 내부로 들어온다. 그리고 트래픽은 ingress controller에 적용된 라우팅 룰에 따라 특정 서비스로 전달된다. 예시를 보자.
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
foo.bar.com을 도메인으로 하는 트래픽이 들어오면
ingress controller는
https://foo.bar.com/foo 트래픽을 service1의 4200번 포트로
https://foo.bar.com/bar 트래픽을 service2의 8080번 포트로 라우팅 시킨다
정리하면
ingress는 라우팅룰을 설정하고
ingress controller는 ingress를 검증하고 룰을 적용한다
그리고
ingress와 ingress controller는 N:1 관계를 맺는다.
실제로 라우팅이 일어나는 곳은 한 곳이지만, 목적과 상황에 따라 라우팅룰을 나누어 관리할 수 있다.
심화로 가보자.
ingress에 대한 생성 및 수정 요청이 오면
API 서버는 webhook으로 ingress가 적합한 포맷인지 검증하라는 요청을 ingress controller로 보낸다.
K8S에서 리소스를 생성 및 수정할 때, 보안을 위한 3가지 과정을 거친다.
적합한 유저가 요청했는가? ( Authentication, 인증 )
적합한 유자가 ingress를 생성 및 수정할 권한을 갖는가? ( Athuorization, 인가 )
유저가 생성한 ingress가 적합한 포맷인가? ( Admission, 검증 )
인증과 인가는 API 서버가 처리하지만
검증은 webhook으로 검증용 서버에 전달하여 처리한다.
검증용 서버가 없다면 인증, 인가만 이루어진다.
ingress의 경우, ingress controller에게 검증되고 ingress가 어떤 ingress controller를 바라보는지 설정해야 한다.
ingress는 ingressClass로 Ingress Controller를 지정한다.
mingu@test-205:~$ kubectl get ingressClass
NAME CONTROLLER PARAMETERS AGE
nginx k8s.io/ingress-nginx <none> 72d
traefik traefik.io/ingress-controller <none> 16h
하나는 Nginx Ingress Controller를 가리키는 Ingress Class이고 다른 하나는 Traefik Ingress Controller를 가리키는 Ingress Class이다. 만약 Ingress Class는 1개인데 Ingress Controller를 2개 배포되면 서로 충돌이 나니 이렇게 배포된 Ingress Controller의 종류에 따라 IngressClass가 존재해야 한다.
아래 링크를 참고하여 Helm 으로 배포하면 알아서 Ingress Class부터 모든 것이 배포되니 굳이 신경쓸 필요가 없기는 하다.
Nginx Ingress Controller
https://docs.nginx.com/nginx-ingress-controller/installation/installing-nic/installation-with-helm/
Installation with Helm | NGINX Documentation
MyF5 Your key to everything F5, including support, registration keys, and subscriptions
docs.nginx.com
Traefik Ingress Controller
https://doc.traefik.io/traefik/getting-started/install-traefik/
Traefik Installation Documentation - Traefik
doc.traefik.io
참고자료
What is a Kubernetes Ingress Controller | Traefik Labs
A Kubernetes Ingress and ingress controller enable traffic from the internet to reach internal cluster Services. Let's look into what they are and how they work.
traefik.io
Ingress
Make your HTTP (or HTTPS) network service available using a protocol-aware configuration mechanism, that understands web concepts like URIs, hostnames, paths, and more. The Ingress concept lets you map traffic to different backends based on rules you defin
kubernetes.io
What is a difference between Ingress and Ingress controller?
I'm using k8s on GCP. It is required to set ingress to setup TLS connection so I set ingress for my application, it works !!! BTW what is Ingress controller like as Nginx Ingress Controller? I'm...
stackoverflow.com
'DevOps > K8S' 카테고리의 다른 글
[Kubernetes] 프론트엔드, 백엔드 서비스 및 디플로이먼트 생성하기 (0) | 2023.10.12 |
---|---|
[Kubernetes] Minikube 설치 및 인그레스 설치 및 설정하기 (0) | 2023.10.12 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(4) - 마스터노드, 워커노드 구성하기 (0) | 2023.09.26 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(3) - 넷필터 브릿지 (0) | 2023.09.25 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(2) - kubeadm, kubelet, kubectl (0) | 2023.09.22 |