Nginx Ingress 지표를 기반으로 지정된 백엔드에서 HPA 수행

이 기사는 Huawei Cloud 커뮤니티 " Nginx Ingress 지표를 기반으로 지정된 백엔드에서 HPA 수행 "에서 공유되었습니다. 작성자: 친구를 사귈 수 있습니다.

배경

프로덕션 시나리오에서 Nginx Ingress 트래픽은 결국 도메인 이름과 경로를 통해 다른 애플리케이션으로 전달됩니다. 때로는 CPU와 메모리가 nginx의 성능 병목 현상이 아닌 경우 nginx_ingress_controller_requests지표를 기반으로 해당 애플리케이션에 대해 HPA를 구성하여 탄력적으로 달성할 수 있습니다. 다양한 도메인 이름 및 경로의 요청량을 기반으로 백엔드 워크로드를 지정합니다.

소개

환경 준비

  • nginx-ingress가 배포되었습니다.
  • 클라우드 네이티브 모니터링 플러그인 kube-prometheus-stack이 설치되었습니다(서버 모드). 이 플러그인은 기본적으로 nginx-ingress를 모니터링합니다. 오픈 소스 환경의 경우 직접 모니터링을 구성하세요.
  • kubectl 명령 구성 또는 cloudshell 사용

scaleTargetRef참고: HPA 규칙 과 두 필드 에 네임스페이스를 지정할 수 없으므로 describedObject표시기 소스, HPA 및 탄력적 대상은 동일한 네임스페이스에 있어야 하지만 nginx-ingress 및 비즈니스 워크로드는 일반적으로 서로 다른 네임스페이스에 있어야 합니다. HPA 유형, 표시기 소스의 네임스페이스는 무시할 수 있습니다.

단계

데모에 필요한 탄력적 대상 워크로드, 서비스 및 수신 생성

api버전: 앱/v1
종류: 배포
metadata:
  이름: test-hpa
  라벨:
    앱: 테스트 앱
투기:
  복제본: 1
  선택자:
    일치 라벨:
      앱: 테스트 앱
  주형:
    metadata:
      라벨:
        앱: 테스트 앱
    투기:
      컨테이너:
      - 이미지: skto/sample-app:v2
        이름: 측정항목 제공자
        포트:
        - 이름: http
          컨테이너 포트: 8080
---
api버전: v1
종류: 서비스
metadata:
  이름: 테스트앱
  네임스페이스: 기본값
  라벨:
    앱: 테스트 앱
투기:
  포트:
    - 포트: 8080
      이름: http
      프로토콜: TCP
      타겟 포트: 8080
  선택자:
    앱: 테스트 앱
  유형: ClusterIP

---
api버전: 앱/v1
종류: 배포
metadata:
  이름: 샘플앱
  라벨:
    앱: 샘플 앱
투기:
  복제본: 1
  선택자:
    일치 라벨:
      앱: 샘플 앱
  주형:
    metadata:
      라벨:
        앱: 샘플 앱
    투기:
      컨테이너:
      - 이미지: skto/sample-app:v2
        이름: 측정항목 제공자
        포트:
        - 이름: http
          컨테이너 포트: 8080
---
api버전: v1
종류: 서비스
metadata:
  이름: 샘플앱
  네임스페이스: 기본값
  라벨:
    앱: 샘플 앱
투기:
  포트:
    - 포트: 80
      이름: http
      프로토콜: TCP
      타겟 포트: 8080
  선택자:
    앱: 샘플 앱
  유형: ClusterIP
---
API버전:networking.k8s.io/v1
종류: 인그레스
metadata:
  이름: 테스트 수신
  네임스페이스: 기본값
투기:
  ingressClassName: nginx
  규칙:
    - 호스트: test.example.com
      http:
        경로:
          - 백엔드:
              서비스:
                이름: 샘플앱
                포트:
                  번호: 80
            길: /
            경로 유형: 구현별
          - 백엔드:
              서비스:
                이름: 테스트앱
                포트:
                  번호: 8080
            경로: /home
            경로 유형: 구현별

쿼리 test.example.com/test.example.com/homenginx_ingress_controller_requests 표시기는 각각 정상입니다.

이미지.png

이미지.png

외부 유형의 apiservices 리소스를 생성합니다. 생성 후 apiservices 상태가 false인 것은 정상입니다.

api버전: apiregistration.k8s.io/v1
종류: API서비스
metadata:
  이름: v1beta1.external.metrics.k8s.io
투기:
  그룹: external.metrics.k8s.io
  그룹우선순위최소: 100
  insecureSkipTLSVerify: true
  service: #prometheus-adapter에 해당하는 서비스를 지정합니다. Huawei CCE 플러그인의 어댑터 이름은 custom-metrics-apiserver입니다.
    이름: custom-metrics-apiserver
    네임스페이스: 모니터링
    포트: 443
  버전: v1beta1
  버전우선순위: 100

어댑터의 configmap에 externalRules 규칙을 추가한 후 prometheus-adapter 서비스를 다시 시작해야 합니다.

kubectl -n 모니터링 편집 configmap user-adapter-config

이미지.png

외부규칙:
-metricQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
  이름:
    다음과 같이: ${1}_per_second
    일치: ^(.*)
  자원:
    네임스페이스: false #표시기 소스의 네임스페이스를 무시합니다. 이 구성은 규칙을 적용하지 않습니다.
  시리즈 쿼리: nginx_ingress_controller_requests

 

seriesQuery : 원본 지표. 지표 이름을 직접 작성하거나 {labelKey=labelValue}를 사용하여 원본 지표를 필터링할 수 있습니다.

metricQuery : PromQL을 사용하여 지표를 필터링하고 집계합니다. .Series원래 지표를 나타내고 .LabelMatchers지표의 레이블 필터링을 나타내며 hpa에서 특정 필터링 규칙을 구성할 수 있습니다.

name : 표시기의 이름을 바꿉니다.

resources : hpa가 표시기를 쿼리할 때 API를 통해 호출되며 호출 경로는 다음과 같습니다.

 

리소스의 기능은 경로의 ${namespace}를 표시기의 네임스페이스 태그 값으로 바꾸는 것이며, 우리 솔루션은 표시기 소스 네임스페이스를 무시해야 합니다.

custom-metrics-apiserver 서비스를 다시 시작한 후 약 1분 정도 기다린 후 명령을 실행하여 표시기가 정상인지 확인해야 합니다.

kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_requests_per_second

이미지.png

HPA 규칙 만들기

api버전: 자동 크기 조정/v2
종류: HorizonPodAutoscaler
metadata:
  이름: 샘플-hpa
투기:
  scaleTargetRef:
    api버전: 앱/v1
    종류: 배포
    이름: 샘플앱
  최소 답변: 1
  최대복제본: 10
  측정항목:
    - 유형: 외부
      외부:
        측정항목:
          이름: nginx_ingress_controller_requests_per_second
          선택자:
            matchLabels: # 이 필드를 통해 표시기를 필터링할 수 있습니다. 여기의 라벨 필터링 조건은 externalRules의 <<.LabelMatchers>>에 추가됩니다.
              내보내기_서비스: 샘플 앱 #백엔드 서비스가 샘플 앱인 요청을 필터링합니다.
              호스트: test.example.com # 도메인 이름 test.example.com에 대한 액세스 요청을 필터링합니다.
        표적:
          유형: AverageValue #외부 지표 유형은 Value 및 AverageValue 유형의 대상 값만 지원합니다.
          평균값: 30
---
api버전: 자동 크기 조정/v2
종류: HorizonPodAutoscaler
metadata:
  이름: test-hpa
투기:
  scaleTargetRef:
    api버전: 앱/v1
    종류: 배포
    이름: 테스트앱
  최소 답변: 1
  최대복제본: 10
  측정항목:
    - 유형: 외부
      외부:
        측정항목:
          이름: nginx_ingress_controller_requests_per_second
          선택자:
            일치 라벨:
              수출_서비스: 테스트-앱
              호스트: test.example.com
        표적:
          유형: 평균값
          평균값: 30

이미지.png

유연한 데모

명령을 사용하여 샘플 앱에 해당하는 액세스 도메인 이름과 경로를 스트레스 테스트하고 탄력성을 정상적으로 트리거하십시오. 도메인 이름과 ELB 주소 간의 매핑을 직접 구성하십시오.

ab -c 50 -n 5000 http://test.example.com/

이미지.png

동일한 방법을 사용하여 테스트 앱을 스트레스 테스트하고 일반적으로 탄력성을 트리거합니다.

ab -c 50 -n 5000 http://test.example.com/home

이미지.png

 

화웨이 클라우드의 신기술에 대해 빨리 알아보고 팔로우하려면 클릭하세요~

 

Linus는 커널 개발자가 탭을 공백으로 대체하는 것을 막기 위해 스스로 노력했습니다. 그의 아버지는 코드를 작성할 수 있는 몇 안되는 리더 중 한 명이고, 둘째 아들은 오픈 소스 기술 부서의 책임자이며, 막내 아들은 오픈 소스 코어입니다. 기고자 Robin Li: 자연 언어 새로운 범용 프로그래밍 언어가 될 것입니다. 오픈 소스 모델은 Huawei에 비해 점점 더 뒤쳐질 것입니다 . 일반적으로 사용되는 5,000개의 모바일 애플리케이션을 Hongmeng으로 완전히 마이그레이션하는 데 1년이 걸릴 것입니다. 타사 취약점. 기능, 안정성 및 개발자의 경험이 크게 개선된 Quill 2.0 출시되었습니다. Ma Huateng과 Zhou Hongyi는 "원한을 제거하기 위해" 공식적으로 출시되었습니다. Laoxiangji의 소스는 코드가 아닙니다. Google이 대규모 구조 조정을 발표한 이유는 매우 훈훈합니다.
{{o.이름}}
{{이름}}

추천

출처my.oschina.net/u/4526289/blog/11053992