Ingress에 대해서 - nginx ingress controller

양승현·2023년 5월 30일
3

kubernetes

목록 보기
18/18

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번이다.

1개의 댓글

comment-user-thumbnail
2023년 7월 20일

감사합니다

답글 달기