[udemy] Ingress
Ingress
- 클러스터 외부에서 내부로 접근하는 요청들을 어떻게 처리할 지 정의해둔 규칙들의 모음
- HTTP나 HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출 (OSI 7계층)
- 기능
- 외부 요청 라우팅 : 요청 URL 경로에 따라 트래픽을 적절한 서비스로 라우팅
- 로드밸런싱 : 여러 서비스에 대한 로드 밸런싱을 지원하여, 트래픽을 균등하게 분산
- SSL 인증서 처리 : SSL 인증서를 관리하고, 클라이언트와 Ingress 컨트롤러 간의 SSL 연결 종료
- Ingress는 Rule들을 정의해놓은 리소스이며, 이를 실제 작동시키기 위해 반드시 Ingress Controller가 필요
- 즉, Ingress Controller은 NodePort(80/443)를 열어서 Client 요청을 받은 뒤 Ingress Rules에 따라 서비스를 제공
- Ingress Controller는 자동으로 실행되지 않고 상황에 맞게 적합한 컨트롤러를 선택하여 설치해야 한다.
쿠버네티스에서는 GCE와 NGINX를 오픈소스로 제공하고 있고, 가장 널리 사용된 Ingress Controller는 Nginx, HAProxy, Envoy 등이 있다.
*참고 문서
쿠버네티스(4) - 인그레스
4-1 ingress, ingress controller란? (Feat. Istio Gateway와 API Gateway)인그레스(ingress)는 클러스터 외부에서 내부로 접근하는 요청들을 어떻게 처리할 지 정의해둔 규칙들의 모음이다.인그레스 컨트롤러(Ingress
wale.tistory.com
1. [Kubernetes] 인바운드 트래픽을 처리하는 방법 : 인그레스 (Ingress)
Ingress와 Service와의 차이?
- Ingress는 OSI 7계층(Application 계층, HTTP)으로서, IP / PORT / URL PATH 기반으로 작동
- Service는 OSI 4계층(Transport 계층, TCP/UDP)으로서, IP / PORT 기반으로 작동
- 중요한 차이점은 Ingress는 URL PATH을 식별하므로 라우팅 규칙까지 정의 가능
Ingress Controller 설치
# Helm 설치
brew install helm
# Ingress Controller이 위치할 namespace 생성 (ingress-basic)
kubectl create namespace ingress-basic
# Ingress Controller 설치
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-basic \
--set controller.replicaCount=2 \
--set controller.nodeSelector."kubernetes\.io/os"=linux \
--set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
--set controller.service.externalTrafficPolicy=Local \
# 설치 확인
kubectl get pods -n ingress-basic
---
NAME READY STATUS RESTARTS AGE
pod/ingress-nginx-controller-5486b65c4d-kffbr 1/1 Running 0 75s
pod/ingress-nginx-controller-5486b65c4d-rjlg8 1/1 Running 0 75s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-nginx-controller LoadBalancer 10.0.69.71 20.214.192.69 80:31547/TCP,443:32192/TCP 76s
service/ingress-nginx-controller-admission ClusterIP 10.0.99.139 <none> 443/TCP 76s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-nginx-controller 2/2 2 2 76s
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-nginx-controller-5486b65c4d 2 2 2 75s
Deployment 파일 작성
# 01-NginxApp1-Deployment.yaml 파일 작성
apiVersion: apps/v1
kind: Deployment
metadata:
name: app1-nginx-deployment
labels:
app: app1-nginx
spec:
replicas: 1
selector:
matchLabels:
app: app1-nginx
template:
metadata:
labels:
app: app1-nginx
spec:
containers:
- name: app1-nginx
image: stacksimplify/kube-nginxapp1:1.0.0
ports:
- containerPort: 80
app1-nginx라는 컨테이너를 배포하는 파일 작성
Service 파일 작성
# 02-NginxApp1-ClusterIP-Service.yaml 파일 작성
apiVersion: v1
kind: Service
metadata:
name: app1-nginx-clusterip-service
labels:
app: app1-nginx
spec:
type: ClusterIP
selector:
app: app1-nginx
ports:
- port: 80
targetPort: 80
app1-nginx라는 컨테이너의 서비스를 만드는 파일 작성
Ingress 파일 작성
# 03-Ingress-Basic.yaml 파일 작성
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginxapp1-ingress-service
#annotations:
#kubernetes.io/ingress.class: nginx
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-nginx-clusterip-service
port:
number: 80
Ingress Controller가 작동할 Ingress 작성
즉 Ingress Controller의 External IP로 오는 요청들은, 다 app1-nginx로 보낸다.
생성 및 확인
# 생성
kubectl apply -f kube-manifests/
# 확인
kubectl get all
http://<Ingress Controller의 External IP>/index.html로 접속시
정상적으로 app-nginx 컨테이너로 전달되어, 확인 가능하다.
[참고 영상]
Udemy - Azure Kubernetes Service with Azure DevOps and Terraform
섹션 10 : Ingress-basics
[참고 문서]
https://github.com/stacksimplify/azure-aks-kubernetes-masterclass/tree/master/09-Ingress-Basic