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-nginx
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"
여기까지 하면 위와 같은 그림까지 진행이 된 것이다.
예제 리소스를 획득한다. (직접 만든거임)
# 깃허브 리소스 다운
$ 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 created
k8s
에 그라파나
가 정상적으로 설치되었는 지 확인한다.$ 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.json
Import
하기 클릭Load
를 클릭한다.