[Nacos] k8s 컨테이너화 기반 Nacos 클러스터 배포

최근 여러 소규모 마이크로서비스의 등록 및 구성 센터를 위해 3노드 nacos 클러스터 서비스가 머신에 배포되었습니다. Nginx를 사용하여 이를 간략하게 프록시한 다음 가용성을 약간 향상시키기 위해 클러스터 배포 및 분산 배포에 대한 간략한 연구가 수행되었습니다. . 배포 후 정상적으로 사용할 수 있으나 문제가 발견되었습니다.Nacos 클러스터 노드 목록을 새로 고친 후에는 항상 DOWNh 또는 SUSPICIOUS 상태의 노드가 한두 개 있기 때문에 문제를 찾는 과정이 오래 걸립니다. 시작됩니다. 클러스터는 정상적으로 사용할 수 있으나 각 서비스 애플리케이션에는 항상 Link nacos 서비스 예외가 많이 발생하며, 작동하지 않는 것을 발견한 즉시 다른 노드로 리디렉션되는 것으로 추정됩니다. 결국 특정 노드의 서버 호스트 이름이 잘못된 것으로 밝혀졌고(또 다른 상황은 cluster.conf컨테이너에 있는 콘텐츠가 오래된 데이터였고 원래 콘텐츠도 ENV 구성 중에 추가된 것이었습니다), IP 주소는 해당 서버가 nacos 클러스터에 구성되어 NACOS_INETUTILS_IP_ADDRESS클러스터 노드 간 하트비트 감지가 실패하고 세 번 후에 노드가 자동으로 오프라인이 되거나 신뢰할 수 없는 상태가 됩니다...

지난 업무 요약

아이디어 및 운영과 관련된 메모를 기록합니다.

  • 클러스터 내에서만 액세스
  • 내부망 K8S 환경에서 외부망 포트 개방 조건
  • nacos2.2.X 버전에 관해 자주 묻는 질문

로컬에서 클러스터 환경을 구축하는 것은 쉽습니다. 서버에서 머신 설정을 제공하는 것이 일반적입니다. k8s 환경과 인트라넷의 경우에는 약간 편차가 있습니다. 문제가 없으면 괜찮습니다. 배포가 완료되면 성공하지 못하면 다양한 문제가 발생합니다. 배포가 성공한 후 서비스 실패가 발생합니다. 라인 및 기타
문제가 발생합니다.

  • 질문 1: 인트라넷 R&D 클라우드 k8s를 사용하여 클러스터를 성공적으로 배포한 후 원래 3개 노드 중 네 번째 노드가 나타났습니다.
  • 문제 2: 클러스터 배포는 사용자 정의된 환경 변수를 기반으로 매개변수를 전달하지만 동적 노드가 두 개 이상 있습니다.
  • 문제 3: VIP 주소를 사용하여 원래 내부 클러스터 포트를 매핑하면 서비스 등록이 온라인과 오프라인으로 대량으로 이루어지는 것처럼 보입니다.

일반적인 운영 및 배포는 아니지만 그래도 요약 정리가 필요한 부분이고 주의사항은 추후 검토하도록 하겠습니다. 설정 파일의 관련 내용은 다양한 환경에 맞게 구성할 수 있습니다. 더 많은 부담을 가하지 않고, 등반 구덩이의 문제가 기록됩니다.

아키텍처 구축

여기에 이미지 설명을 삽입하세요.

  • 3개 이상의 Nacos 노드만 클러스터를 형성할 수 있습니다.
  • Nacos Nginx 프록시는 프록시 전달에 사용됩니다.

조판 준비

Nacos2.0 버전은 1.X에 비해 새로운 gRPC 통신 방식이 적용되어 2개의 포트가 더 필요합니다. 구성된 기본 포트(server.port)를 기반으로 특정 오프셋을 사용하여 새 포트가 자동으로 생성됩니다. 출처: 클러스터 모드 배포

포트 마스터 포트로부터의 오프셋 설명하다
8848 0 기본 포트, 클라이언트, 콘솔 및 OpenAPI에서 사용되는 HTTP 포트
9848 1000 클라이언트가 서버에 대한 연결 및 요청을 시작하는 데 사용되는 클라이언트 gRPC 요청 서버 포트
9849 1001 서버 gRPC는 서비스 간 동기화 등을 위해 서버 포트를 요청합니다.
7848 -1000 서버 간 Raft 관련 요청을 처리하는 데 사용되는 Jraft 요청 서버 포트

VIP/nginx 요청을 사용하는 경우 TCP 전달을 구성해야 하며 http2 전달은 구성할 수 없습니다. 그렇지 않으면 nginx에 의해 연결이 끊어집니다. 9849번과 7848번 포트는 서버간 통신용 포트이므로 외부 네트워크 환경 및 클라이언트 테스트에 노출시키지 마시기 바랍니다.
여기에 이미지 설명을 삽입하세요.

위의 공식 포트 할당 요구 사항에 따라 여기에 배포된 3개의 서버를 사용하여 생성된 Nacos 클러스터의 포트 할당은 다음과 같습니다.

마디 IP 포트(노출 필요) 주목 버전 현재 오프라인 환경 배포 파일 경로
나코스 노드1 192.168.xx.201 호스트: 8858, 9858, 9859, 7858
컨테이너: 8858, 9858, 9859, 7858
나코스 노드 1 nacos/nacos-서버:2.2.4 /루트/나코스-배포/
나코스-node2 192.168.xx.202 호스트: 8858, 9858, 9859, 7858
컨테이너: 8858, 9858, 9859, 7858
Nacos 노드 2 nacos/nacos-서버:2.2.4 /루트/나코스-배포/
나코스-node3 192.168.xx.203 호스트: 8858, 9858, 9859, 7858
컨테이너: 8858, 9858, 9859, 7858
Nacos 노드 3 nacos/nacos-서버:2.2.4 /루트/나코스-배포/
나코스 DB MySQL 192.168.xx.206 호스트: 3306 컨테이너: 3306 나코스 데이터베이스 MySQL:5.7.34 /root/nacos-db-배포
나코스 DB 포스트그레스 192.168.xx.206 호스트: 5432 컨테이너: 5432 나코스 데이터베이스 포스트그레스:12-alpine /root/nacos-db-배포
Nacos Nginx 프록시 192.168.xx.208 호스트: 80 컨테이너: 80 나코스 에이전트 nginx:1.23.2 /root/nacos-proxy-배포
나코스 치크헬스 192.168.xx.208 건강검진 /root/nacos-check-health

k8s 상호 운용 가능한 도메인 이름

[nacos-node1] 참조: 로드 이름
[pigcloud.svc.cluster.local] 참조: 고정 서비스 이름

nacos-node1.pigcloud.svc.cluster.local:8858 
nacos-node2.pigcloud.svc.cluster.local:8858 
nacos-node3.pigcloud.svc.cluster.local:8858

도메인 이름 nginx의 구성 정보 조정이 핵심 역할을 합니다.

Nacos 데이터베이스 생성

Nacos를 실행하기 위해 컨테이너화를 사용하는 경우 데이터베이스를 생성하고 공식 해당 버전에서 기본 데이터베이스 구조의 데이터 파일을 가져와야 합니다.

nacos2.2.4 컴파일

Nacos 2.2.4는 pg 데이터베이스 적응 및 변환을 지원합니다.

MySQL 서비스 생성

  • 도커-mysql.yml
  • yml 실행
docker-compose -f  /root/nacos-db-deploy/docker-mysql.yaml up -d
# 导入官方表数据
docker cp /root/nacos/conf/nacos-mysql.sql nacos-mysql:/tmp
docker exec -it nacos-mysql sh
mysql -uroot -p123456
create database nacos;
use nacos;
source /tmp/nacos-mysql.sql;

포스트그레스 서비스 생성

  • docker-postgres.yml

  • yml 실행

docker-compose -f  /root/nacos-db-deploy/postgres.yaml up -d

나코스 서비스

yaml 파일 생성

mkdir /data/nacos2.2.4_1/logs -p
mkdir /data/nacos2.2.4_2/logs -p
mkdir /data/nacos2.2.4_2/logs -p

mkdir /root/nacos-deploy/

cat << EOF > /root/nacos-deploy/nacos1.yaml
对应内容写入
EOF

cat << EOF > /root/nacos-deploy/nacos2.yaml
对应内容写入
EOF

cat << EOF > /root/nacos-deploy/nacos3.yaml
对应内容写入
EOF

각 구성의 포트는 비표준 포트입니다. NACOS_APPLICATION_PORT환경변수를 비특정 포트로 지정하지 않으면 구성의 기본 환경변수가 지정되므로 주의하세요. 동일한 머신에서 세 개의 노드를 실행할 경우8848 문제가 발생합니다.

나코스를 실행하세요

각 노드는 실행할 수 있습니다

docker-compose -f /root/nacos-deploy/nacos1.yaml up -d
docker-compose -f /root/nacos-deploy/nacos2.yaml up -d
docker-compose -f /root/nacos-deploy/nacos3.yaml up -d

3개의 노드가 개별적으로 페이지에 액세스하는 것이 정상이고, 프록시를 통해 페이지에 액세스하는 것이 정상입니다.

참고: 웹페이지는 클라이언트를 사용하지 않으며, 서버 gRPC가 서비스를 호출하는데, 해당 포트를 프로그램에서 요청해야 하기 때문에 노출시켜야 하며, 비표준 포트를 사용하기 때문에 직접적으로( 위장됨) nginx가 프록시로 사용되는 경우. )는 표준 포트에 매핑될 수 있습니다.

Nginx 프록시 구성

여기서는 컨테이너화가 여전히 사용됩니다.
nginx 프록시 구성

mkdir /root/nacos-proxy-deploy
cat <<EOF > /root/nacos-proxy-deploy/nginx.conf
对应内容写入
EOF
  • 프록시 컨테이너 yaml
cat > /root/nacos-proxy-deploy/nacos-nginx-proxy.yaml << EOF  
对应内容写入
EOF

cd /root/nacos-proxy-deploy
# 容器运行
docker-compose -f nacos-proxy.yaml up -d

설정 후 컨테이너가 정상적으로 실행되고 있는지 확인하고, 인스턴스 서비스 등록이 정상인지 테스트해야 합니다.

환경검사

mkdir /root/nacos-check-healthy -p
cat > /root/nacos-check-healthy/nacos_check_status.py << EOF
对应内容写入
EOF

R&D 클라우드 구성

  • 구성
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.error.include-message=ON_PARAM
server.port=${NACOS_APPLICATION_PORT:8848}
# k8s集群时候使用域名进行固定
nacos.inetutils.ip-address=${NACOS_INETUTILS_IP_ADDRESS:}

# 使用pg数据库配置
spring.datasource.platform=${SPRING_DATASOURCE_PLATFORM:postgresql}
db.num=${PG_DATABASE_NUM:1}
db.jdbcDriverName=${PG_SERVICE_DRIVER:org.postgresql.Driver}
db.url.0=jdbc:${SPRING_DATASOURCE_PLATFORM:postgresql}://${PG_SERVICE_HOST:localhost}:${PG_SERVICE_PORT:5432}/${PG_SERVICE_DB_NAME:strong_db}?currentSchema=${PG_CURRENT_SCHEMA:public}&tcpKeepAlive=true&reWriteBatchedInserts=true
db.user.0=${PG_SERVICE_USER:postgres}
db.password.0=${PG_SERVICE_PASSWORD:123456}

  • 환경 구성

다양한 R&D 클라우드 환경에 따른 다양한 구성은 다음과 같습니다.

KeyValue.JVM_XMS=1g
KeyValue.JVM_XMX=1g
KeyValue.JVM_XMN=512m
KeyValue.JVM_MS=128m
KeyValue.JVM_MMS=320m
KeyValue.PREFER_HOST_MODE=ip
# 这里是针对pg如果使用mysql可以自行添加调整${PARAM_NAME:PARAM_DEF_VALUE}
KeyValue.SPRING_DATASOURCE_PLATFORM=postgresql
KeyValue.PG_SERVICE_HOST=192.168.xx.208
KeyValue.PG_SERVICE_PORT=5432
KeyValue.PG_SERVICE_USER=postgres
KeyValue.PG_SERVICE_PASSWORD=123456
KeyValue.PG_SERVICE_DB_NAME=strong_db
KeyValue.PG_CURRENT_SCHEMA=public
# 如果想使用单击MODE=standalone
KeyValue.MODE=cluster
# 集群配置
KeyValue.NACOS_SERVERS=nacos-node1.pigcloud.svc.cluster.local:8858 nacos-node2.pigcloud.svc.cluster.local:8858 nacos-node3.pigcloud.svc.cluster.local:8858
# 多网卡IP选择
KeyValue.NACOS_INETUTILS_IP_ADDRESS=nacos-node1.pigcloud.svc.cluster.local

일반적인 문제

  • 일반적으로 노드가 서비스를 등록한 후 다른 노드와 동기화됩니다.
  • 각 노드가 리더를 선출할 수 없는 경우
    로그 확인: /data/nacos2.2.4_1/logs/alipay-jraft.log
    인스턴스 서비스 관련 로그: /data/nacos2.2.4_1/naming-raft.log
  • 프록시 전달을 설정한 후에는
    로그를 통해 이를 노출해야 합니다. nacos 클라이언트가 로그인하여 토큰을 얻을 수 있도록 8848 포트가 노출됩니다. 후속 작업에서는 리소스 작업을 위한 토큰을 전달하고 클라이언트의 포트를 위해 9848 포트가 노출됩니다. gRPC 요청이므로 설정된 경우 프록시가 전달되는 경우 반드시 노출해야 합니다. 그렇지 않으면 연결이 실패하고 끊어집니다.

참조 주소

추천

출처blog.csdn.net/u010638673/article/details/131738325