k8s 에 ingress-nginx 를 적용하여 nginx 기능을 k8s 에도 적용시킬 수 있다. 이 nginx 기능을 적용하면 라우팅 규칙을 기준으로 로드밸런싱을 진행할 수 있다. (관련 내용)
또한 ingress-nginx 의 메트릭 을 얻을 수 있는데 메트릭을 통해 모니터링이 가능하다. 모니터링 앱에는 프로메테우스 와 그라파나 가 대표적인 앱이다.
이번 글에는 k8s 에 ingress-nginx 를 적용하여 호스트 네임 기반 라우팅 을 해볼 것이고, 테스트 결과를 프로메테우스 와 그라파나 를 통해 모니터링하는 방법을 공유하려 한다.
k8s 가 ingress 를 사용하려면 ingress-nginx 컨트롤러 가 필요하다. (관련 정보)
사전 조건:
k8s 가 실행되어 있어야 함. (나는 미니큐브를 통해 k8s 를 실행하였다)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-nginxingress-nginx 컨트롤러 환경변수 수정 (관련 정보 사이트)
# namespace 를 `ingress-nginx` 로 변경하고 프로메테우스가 `ingress-nginx`의 메트릭을 가져올 수 있도록 환경 변수를 설정해준다.
$ helm upgrade ingress-nginx ingress-nginx/ingress-nginx \
--install \
--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"

여기까지 하면 위와 같은 그림까지 진행이 된 것이다.
예제 리소스를 획득한다. (직접 만든거임)
# 깃허브 리소스 다운
$ git clone https://github.com/SangYunLeee/simple-node-js-server-for-docker-study.git
$ cd simple-node-js-server-for-docker-study
$ cd k8s[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적용 확인
# 리소스 확인
$ kubectl get all,ingress
 여기까지 하면 아래의 그림과 같이 HTTP 인그래스 , node-app 서비스, Pod 리스트 가 만들어진다. 
포트포워딩을 통해 로컬호스트의 포트와 쿠버네틱스의 ingress-controller 의 포트를 연결한다.
# localhost 의 8080포트에 접속 시 nginx-controller 의 80포트에 전달되도록 한다.
$ kubectl port-forward --namespace=ingress-nginx service/ingress-nginx-controller 8080:80여기까지 하면 아래와 같이 port 연결이 된다.

접속 테스트를 한다.
서버 소스를 보면 (클릭 시 서버 소스로 이동) GET /test 와 GET / 메소드가 준비되어 있다. 따라서 GET /test 와 GET / 을 호출하여 정상적으로 호출이 되는 지 확인해볼 수 있다.
GET /test 터미널 명령어를 통한 확인 $ curl -X GET localhost:8080/test         
# 정상적으로 받아진 것이 확인됨.
reponsed for 'GET /test'localhost:8080 (GET /) 으로 접속한다.
참고: ingress.yaml 을 통해 hostname 을 통한 라우팅과 path 를 통한 라우팅이 가능하다.
아래의 커멘드는test.com을hostname으로 하는 호스트이름 기반 라우팅 테스트에 사용할 수 있음.
curl -X GET --resolve test.com:8080:127.0.0.1 test.com:8080
k8s 에 프로메테우스를 배포한다.
$ kubectl apply --kustomize github.com/kubernetes/ingress-nginx/deploy/prometheus/
# 해당 소스 경로: https://github.com/kubernetes/ingress-nginx/tree/main/deploy/prometheus$ 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 ...
프로메테우스 의 쿠버네틱스와 연결된 Port (30598)  를 확인한다.$ kubectl get svc -n ingress-nginx
쿠버네틱스 의 IP (192.168.49.2) 를 확인한다.$ kubectl get nodes -o wide
쿠버네틱스의 IP + 프로메테우스의 Port)192.168.49.2:30598

프로메테우스가 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
k8s 에 그라파나를 배포한다.$ kubectl apply --kustomize github.com/kubernetes/ingress-nginx/deploy/grafana/
# 결과:
service/grafana created
deployment.apps/grafana createdk8s 에 그라파나가 정상적으로 설치되었는 지 확인한다.$ kubectl get all -n ingress-nginx | grep grafana
# 프로메테우스가 정상적으로 설치되었음을 확인할 수 있다.
pod/grafana-6c477d948b-fktz4 ...
service/grafana ...
deployment.apps/grafana ...
replicaset.apps/grafana-6c477d948b ...
그라파나 의 쿠버네틱스와 연결된 Port (31759)  를 확인한다.
$ kubectl get svc -n ingress-nginx
쿠버네틱스 의 IP (192.168.49.2) 를 확인한다.
$ kubectl get nodes -o wide
그라파나 에 접속한다. (쿠버네틱스의 IP + 그라파나의 Port)
=> 192.168.49.2:31759
id, password 는 admin, admin 이다

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

URL 에 http://prometheus-server.ingress-nginx.svc:9090 을 입력한다.
 # {서비스명}.{namespace}.svc:{port}
 => prometheus-server.ingress-nginx.svc:9090
2. Save & test 를 눌러 저장한다.

해당 가이드는
https://kubernetes.github.io/ingress-nginx/user-guide/monitoring/#grafana를 참고했다.
https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/grafana/dashboards/nginx.jsonImport 하기 클릭
Load 를 클릭한다.
