DevOps & SRE/Docker & kubernetes

[쿠버네티스 공부] Ingress

반응형

쿠버네티스

Ingress

서비스 오브젝트가 외부 요청을 받아들이기 위한 것이였다면, 인그레스는 외부 요청을 어떻게 처리할 것인지 네트워크 7계층 레벨에서 정의하는 쿠버네티스 오브젝트임.


인그레스가 제공하는 기능

  • 외부 요청의 라우팅
  • 가상 호스트 기반의 요청 처리
  • SSL/TLS 보안 연결 처리

NodePort, LoadBalancer 타입의 서비스를 사용해도 되는데 왜 인그레스를 사용하는 가?

애플리케이션이 4개의 Deployment가 생성되어 있고, 각각의 서비스를 하나씩 연결 해줬다고 가정해보자.

이러한 방식은 잘 동작하는 것 같지만, 서비스마다 세부적인 설정을 할 때 추가적인 복잡성이 발생하게 된다.

(SSL/TLS 보안 연결, 접근 도메인 및 클라이언트 상태에 기반한 라우팅 등을 구현하려면 각 서비스와 디플로이먼트에 대해 일일이 설정을 해야 하기 때문에 복잡성이 증가)

이럴 때 인그레스 오브젝트를 사용하면 URI 엔드포인트를 단 하나만 생성함으로써 이러한 번거러움을 쉽게 해결할 수 있음.
인그레스를 이용하면 아래의 사진과 같이 요청이 처리된다.

4개의 각각의 서비스에 대해 4개의 URL이 있는 것이 아니라, 인그레스에 접근하기 위한 단 하나의 URI만 존재한다.
따라서 클라이언트는 인그레스의 URI로만 접근하게 되며, 해당 요청은 인그레스에서 정의한 규칙에 따라 처리된 뒤 적절한 파드로 전달된다.

중요한 점은 라우팅 정의나 보안 연결 등과 같은 세부 설정은 서비스와 디플로이먼트가 아닌 인그레스에 의해 수행된다는 점이다.

각 디플로이먼트에 대해 일일이 설정을 적용할 필요가 없이, 하나의 설정 지점에서 처리 규칙을 정의하기만 하면 되기 때문에 편리하게 관리할 수 있다.


인그레스 컨트롤러 설치

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: potato-ingress
spec:
  rules:
    - http:
        paths:
          - path: /
            backend:
              serviceName: api-service
              servicePort: 8000
  • path: 해당 경로로 들어온 요청을 어느 서비스로 전달할 것인지 정의
  • serviceName, servicePort: path로 들어온 요청이 전달 될 서비스와 포트.

Nginx 서비스의 필요성

하지만 Nginx 인그레스 컨트롤러를 설치하는 YAML 파일은 Nginx 웹 서버를 외부로 노출하기 위한 서비스를 생성해주지는 않습니다. 즉 Nginx Deployment만 생성됐을 뿐 아직 Nginx 포드에 접근할 수 있는 상태은 아니라 서비스는 환경에 맞게 직접 생성해야 한다.

1. NodePort 타입의 서비스 생성 (테스트 용)

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  type: NodePort
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 30000

2. LoadBalancer 타입의 서비스 생성 (AWS, GKE 등의 클라우드 환경)

apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https

출처) 시작하세요! 도커/쿠버네티스

반응형