학습 내용

8-1. Ingress 개념과 Ingress Controller 설치

Ingress란? Pod, Controller, Service와 같은 종류의 쿠버네티스 API 리소스. HTTP/HTTPS를 통해 클러스터 내부의 서비스를 외부로 노출한다.

주요 기능:

  • Service에 외부 URL을 제공 (웹서비스에 유용)
  • 트래픽을 로드밸런싱
  • SSL 인증서 처리
  • Virtual Hosting 지정 (도메인 기반 라우팅)

동작 구조: 외부 요청 → Ingress Controller(예: nginx) → Ingress Rule에 따라 → 해당 Service → Pod

Ingress 리소스 자체는 규칙(rule)만 정의하고, 실제 트래픽 처리는 Ingress Controller(예: nginx ingress controller)가 담당한다. Ingress Controller를 먼저 설치해야 Ingress가 동작한다.

Ingress Rule 구조:

  • URL path 기반으로 서로 다른 Service에 라우팅
  • 예: / → marvel-service, /pay → pay-service

실습 예제 (GitHub 237summit)

Ingress Controller 배포 — deploy.yaml

nginx ingress controller를 배포하는 매니페스트. Namespace, ServiceAccount, RBAC(ClusterRole/RoleBinding), ConfigMap, Deployment, Service(NodePort 30100/30200) 등이 포함된 대규모 YAML이다.

핵심 부분:

# Ingress Controller를 NodePort로 외부 노출
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: NodePort
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
      nodePort: 30100
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
      nodePort: 30200
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/component: controller

Ingress Rule — ingress.yaml

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: marvel-ingress
spec:
  rules:
  - http:
      paths:
      - path: /
        backend:
          serviceName: marvel-service
          servicePort: 80
      - path: /pay
        backend:
          serviceName: pay-service
          servicePort: 80

백엔드 서비스 — marvel-home.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: marvel-home
spec:
  replicas: 1
  selector:
    matchLabels:
      name: marvel
  template:
    metadata:
      labels:
        name: marvel
    spec:
      containers:
      - image: smlinux/marvel-collection
        name: marvel-container
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: marvel-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    name: marvel

백엔드 서비스 — pay.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: pay-rc
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: pay
    spec:
      containers:
      - image: smlinux/pay
        name: pay
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: pay-service
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: pay

pay-service는 Service port 80으로 받아서 컨테이너의 8080으로 전달하는 구조. Ingress에서는 serviceName + servicePort로 연결.


핵심 정리

  • Ingress = HTTP/HTTPS 라우팅 규칙 정의. 실제 동작은 Ingress Controller가 담당.
  • Ingress Controller를 먼저 설치해야 Ingress 리소스가 작동한다 (예: nginx ingress controller).
  • path 기반 라우팅으로 하나의 진입점에서 여러 서비스로 분기 가능.
  • Service의 NodePort와 달리 L7 레이어에서 동작하므로 URL path, 호스트명 기반 라우팅, SSL 종료 등이 가능.

체크리스트

  • Ingress와 Ingress Controller의 역할 차이를 설명할 수 있는가?
  • Ingress Rule에서 path 기반 라우팅 YAML을 작성할 수 있는가?
  • Service(L4)와 Ingress(L7)의 차이를 이해했는가?

참고 링크