DevOps/Kubernetes

[ 쿠버네티스 입문: 90가지 예제로 배우는 컨테이너 관리 자동화 표준 ] Chapter 08. 인그레스

noahkim_ 2021. 7. 21. 11:02

8.1 인그레스의 개념

 

클러스터 외부에서 안으로 접근하는 요청들을 어떻게 처리할지 정의해둔 규칙 모음

외부에서 접근해야 할 URL을 사용할 수 있도록 하고, 트래픽 로드밸런싱, SSL 인증서 처리, 도메인 기반 가상 호스팅 제공

실제로 동작시키는 것은 인그레스 컨트롤러

 

직접 인그레스에 인그레스 컨트롤러(ingress-nginx)를 연동해야 함

 

  • Metadata.annotations : 인그레스 설정시 사용하는 필드. 하위필드의 설정은 컨트롤러에 따라 다름.
  • spec.rules[] : 규칙 지정하기
     host : 요청받을 주소
     http.paths[] : 경로
      backend.serviceName : 처리할 서비스의 이름
      backend.servicePort : 서비스 포트

8.2 ingress-nginx 컨트롤러

 

인그레스는 설정일 뿐이고 설정 내용대로 동작하는 실제 주체는 인그레스 컨트롤러.
공식 컨트롤러는 구글 컴퓨트 엔진용 ‘ingress-gce’와 nginx용 ‘ingress-nginx’

 

8.3 인그레스 SSL 설정하기

 

인그레스를 이용하면 요청으로 들어오는 트래픽에 다양한 설정 가능

 

인그레스로 SSL인증서를 설정하면 파드 각각에 SSL 설정을 따로 할 필요가 없음.

인증서 기한이 만료됐을 때도 인그레스에서만 인증서를 업데이트 하면 됨.

 

CA에 인증서 발급 요청시 서명된 인증서를 발급해줌.

발급받은 인증서를 서버에 설정하여 웹 브라우저에서 통신할 때 유효한 인증서인지 확인한 후 SSL 통신함.

 

<openssl로 직접 인증서 만들어 SSL 통신하기>

 

  1. CA의 비밀키, 인증서 만들기
    ‘ openssl req -x509 -nodes -days 365 -newkey rasa:2048 -keyout tls.key -out tls.crt -subj “————“ ‘
    => tls.key, tls.crt 생성됨

  2. 인증서용 시크릿 생성

    시크릿은 보안이 필요한 설정들을 다룰 때 사용함

    ‘kubectl create secret tls “이름“ —key tls.key —cert tls.crt’

  3. 시크릿을 인그레스에 적용

  • spec.tls[].hosts[] : (접속 허용할) 호스트 네임 지정해주기
  • spec.tls[].secretName 필드에 시크릿 이름을 적어줌

8.4 무중단 배포를 할 때 주의할 점

 

새로운 버전의 컨테이너 배포시 요청받을 파드를 교체해야 함.

이때 새로운 파드를 생성시키고 헬스 체크가 성공한 후 트래픽을 v2쪽으로 보냄.

기존의 트래픽 흐름은 중단시키고 v1을 제거함. 단 주의사항 있음

 

  1. maxSurge와 maxUnavailable 필드 설정

    maxSurge : 디플로이먼트에 설정된 기본 파드 개수에 여분의 파드를 몇 개 더 추가할 수 있는지 설정할 수 있음
    maxUnavailable : 디플로이먼트를 업데이트하는 동안 몇 개의 파드를 이용할 수 없어도 되는지 설정

    적절히 조절하여 일정 개수 이상의 파드를 이용하도록 함.

  2. 파드가 readinessProbe를 지원하는지 확인
  • readinessProbe
    실제로 컨테이너가 서비스 요청을 처리할 준비가 되었는지 진단.
  • livenessProbe
    컨테이너가 정상 실행되는지 점검해서 정상 실행상태가 아니면 kubelet에서 실행 중단 시킴

만약 readinessProbe를 사용하기 어려운 환경이라면 spec.minReadySeconds 필드를 사용함

spec.minReadySeconds 필드는 파드가 준비 상태일 때까지의 최소 대기시간을 정함. 이 시간동안은 요청 안받음

 

      3. 쿠버네티스와 컨테이너 안에 그레이스풀 종료 설정


kubelet은 파드 종료 시 SIGTERM 신호를 먼저 보냄.

무중단 배포시에는 SIGTERM 신호를 받으면 기존의 받은 요청만 처리하고 새 요청을 받지 않는 그레이스풀 종료가 설정되어야 함.

 

만약 SIGTERM 신호를 보낸 후 일정 시간동안 그레이스풀 종료가 되지 않으면 강제로 SIGKILL 신호를 보내서 파드를 종료함.

  • .terminationGracePeriodSeconds : 종료 대기시간 설정

만약 그레이스풀을 사용하지 못하는 환경이면 프리스톱 훅을 이용하면 됨.

 

파드의 생명주기 훅을 설정할 있음. 프리스톱 훅은 파드가 종료되기 직전에 실행됨.