kubernetes/udemy

[udemy] Ingress

bbiyak2da 2025. 2. 18. 17:00

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 등이 있다.

 

*참고 문서

1. 쿠버네티스(4) - 인그레스

 

쿠버네티스(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