[k8s] ingress-nginx 적용 및 모니터링 기능 적용 (feat: 프로메테우스, 그라파나)

sang yun Lee·2023년 6월 4일
0

Devops 실습

목록 보기
12/21

개요


k8singress-nginx 를 적용하여 nginx 기능을 k8s 에도 적용시킬 수 있다. 이 nginx 기능을 적용하면 라우팅 규칙을 기준으로 로드밸런싱을 진행할 수 있다. (관련 내용)
또한 ingress-nginx메트릭 을 얻을 수 있는데 메트릭을 통해 모니터링이 가능하다. 모니터링 앱에는 프로메테우스그라파나 가 대표적인 앱이다.
이번 글에는 k8singress-nginx 를 적용하여 호스트 네임 기반 라우팅 을 해볼 것이고, 테스트 결과를 프로메테우스그라파나 를 통해 모니터링하는 방법을 공유하려 한다.

ingress-nginx 컨트롤러


  • k8singress 를 사용하려면 ingress-nginx 컨트롤러 가 필요하다. (관련 정보)

실습


사전 조건:

  • k8s 가 실행되어 있어야 함. (나는 미니큐브를 통해 k8s 를 실행하였다)
  • 헬름 설치

🔸 ingress-nginx 를 통해 nginx 를 앱에 적용시키기

STEP 1: ingress-nginx 컨트롤러 설치

  1. helm 을 통해 ingress-nginx 컨트롤러 설치 (공식 설치 정보 (설치 방법 예시 있음))

    # 헬름 저장소 추가
    $ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    
    # 저장소 정보 갱신
    $ helm repo update
    
    # 저장소 리스트 확인
    $ helm repo list
    
    # k8s 에 ingress-nginx 컨트롤러 설치
    # helm install [RELEASE_NAME] ingress-nginx/ingress-nginx
    $ helm install ingress-nginx ingress-nginx/ingress-nginx
  2. ingress-nginx 컨트롤러 환경변수 수정 (관련 정보 사이트)

    # namespace 를 `ingress-nginx` 로 변경하고 프로메테우스가 `ingress-nginx`의 메트릭을 가져올 수 있도록 환경 변수를 설정해준다.
    $ helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
    --namespace ingress-nginx --create-namespace \
    --set controller.metrics.enabled=true \
    --set-string controller.podAnnotations."prometheus\.io/scrape"="true" \
    --set-string controller.podAnnotations."prometheus\.io/port"="10254"


    여기까지 하면 위와 같은 그림까지 진행이 된 것이다.

STEP 2: 앱 관련 리소스 (Ingress, Deployment, Service) 생성

  1. 예제 리소스를 획득한다. (직접 만든거임)

    # 깃허브 리소스 다운
    $ git clone https://github.com/SangYunLeee/simple-node-js-server-for-docker-study.git
    $ cd simple-node-js-server-for-docker-study
    $ cd k8s
  2. [Ingress, Deployment, Service].yaml 들을 적용한다.

    # 총 4개의 yaml 이 있다.
    $ ls -1
    deployment.yaml
    ingress.yaml
    kustomization.yaml
    service.yaml
    
    # deployment.yaml, ingress.yaml, service.yaml 을 모두 적용한다.
    $ kubectl apply --kustomize . # kustomization.yaml 을 사용한 것임
    # 'kubectl kustomize . ' 명령어를 치면 어떻게 반영이 될 예정인 지 확인할 수 있음.
    # service, deployment, ingress 생성됨
    service/simple-app-service created
    deployment.apps/simple-app-deployment created
    ingress.networking.k8s.io/test-ingress created
  3. 적용 확인

    # 리소스 확인
    $ kubectl get all,ingress

여기까지 하면 아래의 그림과 같이 HTTP 인그래스 , node-app 서비스, Pod 리스트 가 만들어진다.

STEP 3: ingress를 통한 접속 테스트

  1. 포트포워딩을 통해 로컬호스트의 포트와 쿠버네틱스의 ingress-controller 의 포트를 연결한다.

    # localhost 의 8080포트에 접속 시 nginx-controller 의 80포트에 전달되도록 한다.
    $ kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80

    여기까지 하면 아래와 같이 port 연결이 된다.

  2. 접속 테스트를 한다.
    서버 소스를 보면 (클릭 시 서버 소스로 이동) GET /testGET / 메소드가 준비되어 있다. 따라서 GET /testGET / 을 호출하여 정상적으로 호출이 되는 지 확인해볼 수 있다.

    • 첫번째 방법: GET /test 터미널 명령어를 통한 확인
      $ curl -X GET localhost:8080/test         
      # 정상적으로 받아진 것이 확인됨.
      reponsed for 'GET /test'
    • 두번째 방법: 브라우저에서 localhost:8080 (GET /) 으로 접속한다.
      아래와 같이 나오면 성공한 것이다.

      참고: ingress.yaml 을 통해 hostname 을 통한 라우팅과 path 를 통한 라우팅이 가능하다.

      아래의 커멘드는 test.comhostname 으로 하는 호스트이름 기반 라우팅 테스트에 사용할 수 있음.
      curl -X GET --resolve test.com:8080:127.0.0.1 test.com:8080

🔸 프로메테우스 적용

STEP 1: 프로메테우스 설치 (참고 자료)

  • k8s 에 프로메테우스를 배포한다.

    $ kubectl apply --kustomize github.com/kubernetes/ingress-nginx/deploy/prometheus/
    
    # 해당 소스 경로: https://github.com/kubernetes/ingress-nginx/tree/main/deploy/prometheus
  • k8s 에 프로메테우스가 정상적으로 설치되었는 지 확인한다.
    $ kubectl get all -n ingress-nginx | grep prometheus
    # 프로메테우스가 정상적으로 설치되었음을 확인할 수 있다.
    pod/prometheus-server-5875d5bb-qmv9x ...
    service/prometheus-server ...
    deployment.apps/prometheus-server ...
    replicaset.apps/prometheus-server-5875d5bb ...

STEP 2: 프로메테우스 접속

  1. 프로메테우스쿠버네틱스와 연결된 Port (30598) 를 확인한다.
    $ kubectl get svc -n ingress-nginx
  2. 쿠버네틱스IP (192.168.49.2) 를 확인한다.
    $ kubectl get nodes -o wide
  3. 프로메테우스에 접속한다. (쿠버네틱스의 IP + 프로메테우스의 Port)
    => 192.168.49.2:30598

    여기까지 하면 아래까지 진행된 것이다.
  4. 프로메테우스ingress-controller로부터 메트릭 정보를 받아올 수 있는 지 확인한다.
  • 위에서 ingress-nginx 컨트롤러 환경변수 설정 을 진행하였었다면 확인이 가능해야한다.

    nginx_ingress_controller_success 검색 시 GET / 등의 메소드 성공 관련 정보를 받을 수 있다.

SRE 에서는 아래의 메트릭이 4가지 황금 시그널로 불린다.

  • 트래픽, 오류
    nginx_ingress_controller_requests
  • 대기 시간
    nginx_ingress_controller_request_duration_seconds_count
    nginx_ingress_controller_request_duration_seconds_bucket
  • 포화 수준
    node_cpu_seconds_total

🔸 그라파나 적용

STEP 1: 그라파나 설치 (참고 자료)

  • k8s그라파나를 배포한다.
    $ kubectl apply --kustomize github.com/kubernetes/ingress-nginx/deploy/grafana/
    # 결과:
    service/grafana created
    deployment.apps/grafana created
  • k8s그라파나가 정상적으로 설치되었는 지 확인한다.
    $ kubectl get all -n ingress-nginx | grep grafana
    # 프로메테우스가 정상적으로 설치되었음을 확인할 수 있다.
    pod/grafana-6c477d948b-fktz4 ...
    service/grafana ...
    deployment.apps/grafana ...
    replicaset.apps/grafana-6c477d948b ...

STEP 2: 그라파나 접속

  1. 그라파나쿠버네틱스와 연결된 Port (31759) 를 확인한다.

    $ kubectl get svc -n ingress-nginx

  2. 쿠버네틱스IP (192.168.49.2) 를 확인한다.

    $ kubectl get nodes -o wide

  3. 그라파나 에 접속한다. (쿠버네틱스의 IP + 그라파나의 Port)
    => 192.168.49.2:31759

    id, password 는 admin, admin 이다

그라파나 대시보드는 아래 다음을 보고 가져올 수 있다.
https://kubernetes.github.io/ingress-nginx/user-guide/monitoring/#grafana

STEP 3: 프로메테우스 값 가져오기

  1. Data sourcesPrometheus 를 선택한다.

  2. URLhttp://prometheus-server.ingress-nginx.svc:9090 을 입력한다.

 # {서비스명}.{namespace}.svc:{port}
 => prometheus-server.ingress-nginx.svc:9090


2. Save & test 를 눌러 저장한다.

STEP 4: 그라파나 대시보드 불러오기

해당 가이드는 https://kubernetes.github.io/ingress-nginx/user-guide/monitoring/#grafana 를 참고했다.

  1. 아래의 링크의 json 값을 저장한다.
https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/grafana/dashboards/nginx.json
  1. 대시보드를 Import 하기 클릭
  2. 복사했던 json 값을 아래에 붙여넣고 Load 를 클릭한다.
  3. 다음과 같은 그라파나 대시보드 정보를 획득할 수 있다.

참고자료


0개의 댓글