이 기사는 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/home
nginx_ingress_controller_requests 표시기는 각각 정상입니다.
외부 유형의 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
외부규칙: -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
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
유연한 데모
명령을 사용하여 샘플 앱에 해당하는 액세스 도메인 이름과 경로를 스트레스 테스트하고 탄력성을 정상적으로 트리거하십시오. 도메인 이름과 ELB 주소 간의 매핑을 직접 구성하십시오.
ab -c 50 -n 5000 http://test.example.com/
동일한 방법을 사용하여 테스트 앱을 스트레스 테스트하고 일반적으로 탄력성을 트리거합니다.
ab -c 50 -n 5000 http://test.example.com/home
Linus는 커널 개발자가 탭을 공백으로 대체하는 것을 막기 위해 스스로 노력했습니다. 그의 아버지는 코드를 작성할 수 있는 몇 안되는 리더 중 한 명이고, 둘째 아들은 오픈 소스 기술 부서의 책임자이며, 막내 아들은 오픈 소스 코어입니다. 기고자 Robin Li: 자연 언어 는 새로운 범용 프로그래밍 언어가 될 것입니다. 오픈 소스 모델은 Huawei에 비해 점점 더 뒤쳐질 것입니다 . 일반적으로 사용되는 5,000개의 모바일 애플리케이션을 Hongmeng으로 완전히 마이그레이션하는 데 1년이 걸릴 것입니다. 타사 취약점. 기능, 안정성 및 개발자의 경험이 크게 개선된 Quill 2.0 이 출시되었습니다. Ma Huateng과 Zhou Hongyi는 "원한을 제거하기 위해" 공식적으로 출시되었습니다. Laoxiangji의 소스는 코드가 아닙니다. Google이 대규모 구조 조정을 발표한 이유는 매우 훈훈합니다.