외부에서 내부로 향하는 트래픽

인그레스 오브젝트의 기능


1. 외부 요청의 라우팅

/apple /apple/red 같은 특정 경로로 들어온 요청에 어떠한 서비스를 전달할지 정의하는 라우팅 규칙

2. 가상 호스트 기반의 요청 처리

같은 IP를 대상으로 각각 다른 도메인 이름으로 요청했을 때, 어떻게 처리할 것인지 정의

3.SSL/TLS 보안 연결 처리

여러 개의 서비스로 요청을 라우팅할 때, 보안 연결을 위한 인증서를 쉽게 적용

인그레스를 사용하는 이유


image“디플로이먼트를 사용 시”

기존 디플로이먼트에다가 NodePort나 LoadBalancer를 적용해도 유사 기능을 구현한다. 하지만 SSL/TLS 보안 연결 및 접근 도메인 및 클라이언트 상태에 기반한 라우팅을 구현하려면 각 서비스와 디플로이먼트에 대해 일일이 설정을 해야 한다.

그러나, 인그레스 오브젝트를 사용하면, URL 엔드포인트 하나로 번거로움을 없앨 수 있다.

image“인그레스 사용 시”

한마디로 인그레스는 디플로이먼트를 포괄할 수 있는 오브젝트이다.

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

인그레스 구조 


인그레스 목록

kubectl get ingress //인그레스 목록 띄우기 
kubectl get ing // 약자로도 가능

인그레스 생성

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: alicek106.example.com                   # [1] 
    http:
      paths:
      - path: /echo-hostname                     # [2]
        pathType: Prefix
        backend: 
          service: 
            name: hostname-service               # [3]
            port: 
              number: 80
  • host : 해당 도메인 이름으로 접근하는 요청에 대한 처리규칙 정의
  • path: 해당 경로에 들어온 요청을 어느 서비스로 전달할 것인지 정의. /echo-hostname이라는 경로의 요청을 backend에 정의된 서비스로 전달
  • serviceName, servicePort: path로 들어온 요청이 전달될 서비스와 포트. 위 예시에서는 /echo-hostname이라는 경로로 들어온 요청을 hostname-service의 80번 포트로 전달

인그레스를 생성해도, 요청을 처리하는 규칙을 정의하는 오브젝트이므로 아무 일도 발생하지 않음. 인그레스는 인그레스 컨트롤러라고 하는 특수한 서버에 적용해야만 그 규칙을 사용할 수 있다.

인그레스 컨트롤러


인그레스 컨트롤러는 인그레스 규칙을 적용하고 직접적으로 Deployment를 관리하기 위한 오브젝트이다.

인그레스 컨트롤러 종류로는

  1. NGINX 웹 서버 인그레스 컨트롤러
  2. KONG
  3. 구글 쿠버네티스 엔진

등이 있다.

인그레스 컨트롤러를 사용하려면 먼저 인그레스 컨트롤러를 위한 리소스를 설치한다.

image

한 번에 인그레스 컨트롤러를 위한 리소스를 설치한다. ingress-nginx라는 네임스페이스에 NGINX 웹 서버 디플로이먼트와 컨피그맵들을 설치 (서비스는 로드밸런서)

인그레스 컨트롤러 동작 개요


image “인그레스를 생성하면 인그레스 컨트롤러는 자동으로 로드하고, Nginx 웹 서버에 적용한다.”

Nginx 인그레스 컨트롤러 SSL/TLS 보안 연결 적용


1. 인증서와

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout tls.key -out tls.crt -subj "/CN=alicek106.example.com/0=alicek106"
CN에는 Nginx 인그레스 컨트롤러에 접근하기 위한 PUBLIC DNS 이름을 연결해야 한다.\
tls.key라는 키와 tls.crt 라는 인증서가 생성된다.

2.TLS타입의 시크릿 생성

현재 디렉터리에 tls.key와 tls.crt가 있을 경우
kubectl create secret tls tls-secret --key tls.key --cert tls.crt

3. 인그레스

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
  - hosts:
    - alicek106.example.com            # 도메인 이름을 입력해야 합니다.
    secretName: tls-secret
  rules:
  - host: alicek106.example.com          # 도메인 이름을 입력해야 합니다.
    http:
      paths:
      - path: /echo-hostname
        pathType: Prefix
        backend: 
          service: 
            name: hostname-service
            port: 
              number: 80

4.HTTPS 요청 보내기

#curl의 -k 옵션은 신뢰할 수 없는 인증서로 보안 연결을 하기 위함
curl https://alicek106.example.com/echo-hostname -k
http로 해도 자동으로 https로 반환이 된다 why? 인그레스 컨트롤러가 자동으로 https로
리다이렉트 하는 주석인 ssl-redirect를 true로 하기 때문이다