아 리 클 라 우 드 K8S Ingress Controller 를 통 해 경로 설정 의 동적 업 데 이 트 를 실현 합 니 다.
간단 한 소개
Kubernetes 클 러 스 터 에서 Ingress 는 클 러 스 터 내 서비스 가 대외 적 으로 노출 된 방문 접속 점 으로서 클 러 스 터 내 서비스 방문 의 모든 데 이 터 를 담 고 있다.우 리 는 Nginx Ingress Controller 가 Kubernetes 지역사회 에서 매우 중요 한 서브 프로젝트 라 는 것 을 알 고 있다. 그 내 부 는 주로 고성능 의 부하 균형 소프트웨어 Nginx 를 바탕 으로 Kubernetes Ingress 자원 대상 을 실시 간 으로 자동화 하여 Nginx 배치 규칙 으로 전환 시 켜 대외 적 으로 기대 하 는 권한 방문 입 구 를 제공한다.
현실 문제
Kubernetes 클 러 스 터 에 배 치 된 마이크로 서비스 가 점점 많아 지면 서 대외 적 으로 노출 된 경로 규칙 이 점점 복잡 해 지고 서비스 백 엔 드 포인트 의 변화 가 빈번 해 지면 서 대응 하 는 것 은 Nginx Ingress Controller 구성 요소 내 Nginx 설정 파일 의 변화 가 점점 빈번 해 질 것 이다.한편, 우 리 는 모든 줄 의 Nginx 설정 의 변 화 는 Reload Nginx 가 있어 야 효력 이 발생 한 다 는 것 을 알 고 있다. 이것 은 변화 빈도 가 비교적 낮은 장면 에서 아예 받 아들 일 수 있 지만 고주파 변화 장면 에서 Nginx 의 빈번 한 Reload 를 일 으 킬 수 있다.
한편, Nginx 의 빈번 한 Reload 가 가 져 온 문 제 는 흔히 말 하 는 화제 이다. 그 문제 의 본질은 주로 Nginx 자체 의 최초의 구조 디자인 모델 에서 비롯 된 것 이다.
일반적으로 Linux 서버 에 서 는 Nginx 를 사용 하 는 EPOLL 다 중 프로 세 스 모드 를 설정 합 니 다.우리 가 Nginx 프로필 을 수정 한 후에 통과 해 야 합 니 다.
nginx -s reload
새로운 Nginx 설정 규칙 을 다시 불 러 오 는 명령;
Nginx Master 프로 세 스 가 reload signal 을 받 으 면 지정 한 경로 에서 새로운 Nginx 프로필 내용 을 다시 불 러 오고 설정 규칙 의 유효성 을 검증 합 니 다. 유효한 프로필 로 검사 되면 새로운 프로필 의 worker 에 따라processes 값 fork 에서 지정 한 수량의 새로운 Nginx Worker 프로 세 스 를 내 보 냅 니 다. 이 때 새 fork 에서 나 온 하위 프로 세 스 는 부모 프로 세 스 의 메모리 데이터 ngx 를 완전히 계승 합 니 다.cycle (새로운 분석 후의 Nginx 설정 규칙 을 포함 합 니 다) 설정 에 있 는 모든 Listen Socket FD 를 커 널 의 EPOLL 이벤트 감청 에 등록 합 니 다. 이 때 이 새로운 Nginx Worker 프로 세 스 는 클 라 이언 트 로부터 요청 을 받 을 수 있 습 니 다.
또한 Nginx Master 프로 세 스 는 QUIT signal 을 보 내 오래된 Nginx Worker 프로 세 스 가 부 드 럽 게 종료 되 었 음 을 알 립 니 다. 오래된 Nginx Worker 프로 세 스 가 QTUI 신 호 를 받 은 후에 EPOLL 에 등 록 된 감청 이 벤트 를 제거 합 니 다. 이로써 새로운 클 라 이언 트 요청 을 받 지 않 고 오래된 프로필 에 설 치 된 Workershutdown_timeout 값 으로 타 이 머 를 설정 한 다음 에 받 은 클 라 이언 트 요청 을 계속 처리 합 니 다.workershutdown_timeout 전에 기 존 클 라 이언 트 요청 을 처리 하면 자동 으로 종 료 됩 니 다. 처리 되 지 않 으 면 Kill 에서 강제로 종 료 됩 니 다. 이 경우 클 라 이언 트 요청 응답 이 이상 합 니 다.
따라서 고주파 변화 장면 에서 Nginx 의 잦 은 Reload 는 비교적 뚜렷 한 요청 방문 문 제 를 가 져 올 수 있 습 니 다.
Nginx 의 잦 은 Reload 의 영향 을 완화 하기 위해 서 는 동적 업데이트 방식 으로 Nginx 설정 규칙 을 불 러 와 야 합 니 다. 즉, Fork 새 Nginx Worker 프로 세 스 가 아 닌 상태 에서 메모리 에 불 러 온 Nginx 설정 규칙 을 실시 간 으로 업데이트 해 야 합 니 다.
우선 Nginx 의 프로필 스타일 을 살 펴 보 겠 습 니 다. 주로 아래 의 몇 가지 설정 장 을 포함 합 니 다.
# 1\. main configuration
daemon off;
worker_processes 4;
events {
# 2\. event configuration
multi_accept on;
worker_connections 1024;
use epoll;
}
http {
# 3\. http main configuration
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
upstream {
# 4\. upstream configuration
server 0.0.0.1;
}
server {
# 5\. server configuration
server_name _ ;
listen 80 default_server;
location / {
# 6\. location configuration
proxy_pass http://upstream_balancer;
}
}
한편, Kubernetes 클 러 스 터 에서 한 Ingress 자원 대상 은 주로 Nginx 에 비 친 HTTP Main Block, Server Block, Upstream Block 과 Location Block 등 장절 의 설정 규칙 에 해석 되 기 때문에 우 리 는 이 몇 가지 자주 변화 하 는 설정 내용 을 Shared Memory 방식 으로 메모리 에 통일 적 으로 유지 하 는 동시에 Ingress Controller 내부 에 관리 포트 를 노출 시 킬 수 있다.API 를 통 해 Nginx 경로 규칙 설정 을 실시 간 으로 관리 합 니 다.
K8S Ingress Controller 가 클 러 스 터 내 Ingress 및 연 결 된 자원 의 변 화 를 감시 할 때 Internal API 를 통 해 최신 Nginx 설정 규칙 을 통 일 된 공유 메모리 설정 으로 보 낼 수 있 습 니 다. Reload Nginx 방식 으로 새 설정 을 적용 하지 않 아 도 됩 니 다. 이로써 Nginx 가 새로 받 은 클 라 이언 트 요청 을 처리 할 때,최신 공유 메모리 의 설정 을 기반 으로 규칙 적 인 일치 와 경로 전송 을 할 수 있 습 니 다.
설정 설명
1. 현재 아 리 클 라 우 드 용기 서비스 Kubernetes 클 러 스 터 의 최신 버 전의 Nginx Ingress Controller 구성 요 소 는 기본적으로 Upstream 의 동적 업 데 이 트 를 시 작 했 습 니 다. 또한 응용 서비스의 그 레이스 케 일 발표 와 파란색 발표 기능 을 지원 합 니 다. 구체 적 인 설정 설명 은 여 기 를 참고 할 수 있 습 니 다.
현재 공유 메모리 에 있 는 Nginx Upstream 의 설정 목록 을 다음 명령 으로 볼 수 있 습 니 다.
kubectl -n kube-system exec -it -- curl http://127.0.0.1:18080/configuration/backends
2. HTTPS 인증서 의 동적 업데이트 도 지원 합 니 다. nginx - ingress - controller deployment 의 다음 매개 변수 설정 을 수정 하여 Nginx Ingress Controller 의 인증서 동적 업 데 이 트 를 시작 할 수 있 습 니 다.
- args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --annotations-prefix=nginx.ingress.kubernetes.io
- --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb
- --enable-dynamic-certificates=true ###
- --v=2
HTTPS 인증서 의 동적 업 데 이 트 를 시작 하면 Ingress 의 TLS 인증 서 는 Nginx 의 공유 메모리 에 통일 적 으로 유 지 됩 니 다. 현재 공유 메모리 에 설 정 된 인증서 목록 을 다음 명령 으로 볼 수 있 습 니 다.
kubectl -n kube-system exec -it -- curl http://127.0.0.1:18080/configuration/certs
3. 저 희 는 Nginx Server 와 Location 설정 의 동적 업 데 이 트 를 지원 합 니 다. nginx - ingress - controller deployment 의 다음 매개 변수 설정 을 수정 하여 Nginx Ingress Controller 의 Server 와 Location 의 동적 업 데 이 트 를 시작 할 수 있 습 니 다.
- args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --annotations-prefix=nginx.ingress.kubernetes.io
- --publish-service=$(POD_NAMESPACE)/nginx-ingress-lb
- --enable-dynamic-certificates=true ###
- --enable-dynamic-servers=true ### , enable-dynamic-certificates
- --v=2
마찬가지 로 Nginx Ingress Controller 의 서버 동적 업 데 이 트 를 열 었 을 때 모든 Nginx Server 와 Location 설정 은 공유 메모리 에 통일 적 으로 유 지 됩 니 다. 현재 공유 메모리 의 Server 설정 목록 을 다음 명령 을 통 해 볼 수 있 습 니 다.
kubectl -n kube-system exec -it -- curl http://127.0.0.1:18080/configuration/servers
주의 설명: 서버 의 동적 업데이트 기능 을 켜 면 일부 Ingress Annotation 설정 은 지원 되 지 않 습 니 다. 지원 을 점차적으로 최적화 하고 있 습 니 다. 이에 따라 ConfigMap 방식 으로 직접 설정 할 수 있 습 니 다.
본문 저자: chenqz
원문 을 읽다
본 고 는 운 서 지역사회 의 오리지널 내용 으로 허락 없 이 전재 할 수 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
링크 ux 서버 클 러 스 터 배치: nginx 설정Liux 클 러 스 터 를 몇 대 배치 하려 면 ~ 부하 균형 을 맞 춰 야 합 니 다 ~ ~ 여 기 는 nginx 로 부하 합 니 다 ~ ~ 사실 다른 것 도 있 습 니 다 ~ ~ 많은 회사 에서 nginx 를 사...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.