kubernetes - 인그레스(ingress)

2020. 2. 19. 20:36devops/kubernetes

ingress

kubernetes에 특별한 요청이 올 때 어떻게 처리할 것인지 도와주는 기능을 합니다.

 

기능

1. 외부 요청의 라우팅: /apple, /apple/red 등과 같이 특정 경로로 들어온 요청을 어떠한 서비스로 전달하는 라우팅ㅇ 규칙을 설정할 수 있습니다. 

2. 가상 호스트 기반의 요청 처리: 같은 IP에 대해 다른 도메인 이름으로 요청이 도착했을 때, 어떻게 처리할 것인지 정의할 수 있습니다.

3. SSL/TLS 보안 연결 처리: 여러 개의 서비스로 요청을 라우팅할 때 보안 연결을 위한 인증서를 쉽게 적용할 수 있습니다. 

 

하지만 기존의 NodePart, LoadBalancer 등의 서비스로도 충분히 위기능을 이용할 수 있을 것 같은데 ingress는 왜 사용해야 할까요?

만약 위와 같이 ingress없이 service 두개를 이용한다면 두개 모두에게 라우팅 규칙 및 TLS/SSL 등의 상세한 옵션들을 모두 적용해야 합니다. 

 

하지만 아래와 같이 Ingress Controller를 적용해주면 해당 설정들을 Ingress Controller에만 적용시켜주면 되고 추가로 서비스에 이용할 필요 없습니다. 

 

즉 외부 요청에 대한 처리 규칙을 쿠버네티스 자체의 기능으로 편리하게 관리할 수 있다는 것이 인그레스의 핵심입니다.

 

인그레스의 구조

인그레스 생성하기

apiVersion: networking.k8s.io/v1beta1
king: Ingress
metadata:
  name: ingress-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules: 
  - host: hoony.example.com
    http:
        paths:
        - path: /capital
        backend:
          serviceName: test-svc
          servicePort: 80

yaml 파일을 위와 같이 작성했습니다. anotations는 추후에 설명하고 spec의 내용에 집중해야하합니다. host에는 해당 주소로 접속할 경우 규칙을 적용합니다. 

http 방법으로 적용하며 path는 hoony.example.com/capital 로 요청을 보낼경우 응답한다. 

backend는 요청을 어떤 서비스와 port에 전달해줄지 결정합니다. 

kubectl apply -f 파일 이름 // ingress 만들기
kubectl get ingress                                                                                                             
NAME              HOSTS               ADDRESS   PORTS   AGE
ingress-example   hoony.example.com             80      28s

위와 같이 ingress를 만들었다고 특별한 일이 일어나는 것은 아닙니다. 인그레스는 인그레스 컨트롤러라는 특수한 서버에 적용해야만 사용할 수 있습니다. 실제로 그 요청을 받아 들이는 것은 컨트롤러입니다. 

 

인그레스 컨트롤러에는 여러가지가 있는데 Nginx, Kong, GKE에서 제공되는 클라우드 엔진이 있습니다. 이 포스트에서는 nginx를 사용해보겠습니다. 

 

nginx 설치 // pod, deployment가 시작하는데 시간이 걸릴 수 있습니다. 필자의 경우 9분정도 걸렸습니다. 

kubectl apply -f \                                                                                                                               
https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

GKE 설치

https://github.com/kubernetes/ingress-gce

 

kubernetes/ingress-gce

Ingress controller for Google Cloud. Contribute to kubernetes/ingress-gce development by creating an account on GitHub.

github.com

kubectl get pods,deployment -n ingress-nginx                                                                                                      
NAME                                            READY   STATUS              RESTARTS   AGE
pod/nginx-ingress-controller-68d6b775d8-6pg22   0/1     ContainerCreating   0          2m50s

NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/nginx-ingress-controller   0/1     1            0           2m50s