当前位置:   article > 正文

Nacos+ApiSix docker 集群环境搭建(docker-compose方式)_apisix nacos

apisix nacos

Nacos ApiSix docker集群环境搭建(docker-compose方式)

集群流程(我采用SLB做负载均衡,也可自行配置nginx做负载):

nginx负载均衡的配置参考如下(仅供参考):

  1. #user nobody;
  2. worker_processes 1;
  3. #error_log logs/error.log;
  4. #error_log logs/error.log notice;
  5. #error_log logs/error.log info;
  6. #pid logs/nginx.pid;
  7. events {
  8. worker_connections 1024;
  9. }
  10. http {
  11. include mime.types;
  12. default_type application/octet-stream;
  13. log_format main '$remote_addr - $remote_user [$time_iso8601] "$request" '
  14. '$status $body_bytes_sent "$http_referer" '
  15. '"$http_user_agent" "$http_x_forwarded_for"';
  16. #access_log logs/access.log main;
  17. sendfile on;
  18. #tcp_nopush on;
  19. #keepalive_timeout 0;
  20. keepalive_timeout 65;
  21. #gzip on;
  22. upstream apisix{
  23. ip_hash;
  24. server 12.10.8.92:9000 weight=1;
  25. server 12.10.8.93:9000 weight=2;
  26. server 12.10.8.93:9000 weight=3;
  27. }
  28. upstream nacos{
  29. ip_hash;
  30. server 12.10.8.92:8848 weight=1;
  31. server 12.10.8.93:8848 weight=2;
  32. server 12.10.8.94:8848 weight=3;
  33. }
  34. server {
  35. listen 8080;
  36. server_name localhost;
  37. #charset koi8-r;
  38. if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
  39. set $time $1;
  40. }
  41. access_log logs/$time.access.log main;
  42. #access_log logs/host.access.log main;
  43. location / {
  44. proxy_pass http://apisix/;
  45. #proxy_set_header Host $host;
  46. proxy_set_header Host $host:$server_port;
  47. proxy_set_header X-Real-IP $remote_addr;
  48. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  49. }
  50. #error_page 404 /404.html;
  51. # redirect server error pages to the static page /50x.html
  52. #
  53. error_page 500 502 503 504 /50x.html;
  54. location = /50x.html {
  55. root html;
  56. }
  57. }
  58. server {
  59. listen 8082 ;
  60. client_max_body_size 20M;
  61. proxy_read_timeout 600s;
  62. #charset koi8-r;
  63. if ($time_iso8601 ~ '(\d{4}-\d{2}-\d{2})') {
  64. set $time $1;
  65. }
  66. access_log logs/$time.access.log main;
  67. #access_log logs/host.access.log main;
  68. location / {
  69. proxy_pass http://nacos/;
  70. }
  71. #error_page 404 /404.html;
  72. # redirect server error pages to the static page /50x.html
  73. #
  74. error_page 500 502 503 504 /50x.html;
  75. location = /50x.html {
  76. root html;
  77. }
  78. }
  79. }

环境安装:

IP地址

需安装服务(仅限docker方式)

备注

12.10.8.92

Docker+docker-compose+Apisix+nacos,etcd, dashboard, Grafana, prometheus

红色为必装服务

12.10.8.93

Docker+docker-compose+Apisix+nacos,etcd,dashboard,Grafana, prometheus等

红色为必装服务

12.10.8.94

Docker+docker-compose+Apisix+nacos,etcd,dashboard,Grafana, prometheus等

红色为必装服务

安装docker:https://blog.csdn.net/BThinker/article/details/123358697

安装docker-compose: https://blog.csdn.net/pushiqiang/article/details/78682323

Docker 配置

  1. mkdir -p /etc/docker/
  2. vim /etc/docker/daemon.json

#需要配置docker和docker-compose的默认网段,避免网段冲突,daemon.json添加以下内容

  1. { "registry-mirrors": ["https://hub-mirror.c.163.com"],
  2.   "bip": "192.168.0.1/24",
  3.   "default-address-pools": [{"base":"10.10.0.0/16","size":24}]
  4. }

docke-compose方式安装APISIX:

创建安装目录:

  1. mkdir -p /data/soft/
  2. cd  /data/soft/

通过 git 命令克隆 apisix-docker 仓库:

  1. git clone https://github.com/apache/apisix-docker.git
  2. cd apisix-docker/example
  3. vim docker-compose.yml

然后在docker-compose.yml里配置etcd集群(由于网上无任何docker安装方式的apisix集群配置,下面配置都是自行研究而来,如有错误还请指正)。

这里遇到一个问题,官方配置apache/apisix:latest拉取的版本和etcd版本由冲突,需要修改docker-compose.yml下APISIX镜像的版本,如:apache/apisix:3.0.0-centos

  1. apisix:
  2. image: apache/apisix:3.0.0-centos
  3. restart: always
  4. volumes:
  5. - ./apisix_log:/usr/local/apisix/logs
  6. - ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
  7. depends_on:
  8. - etcd
  9. ##network_mode: host
  10. ports:
  11. - "9180:9180/tcp"
  12. - "9080:9080/tcp"
  13. - "9091:9091/tcp"
  14. - "9443:9443/tcp"
  15. - "9092:9092/tcp"
  16. networks:
  17. apisix:

节点1 ETCD集群配置: 

  1. etcd:
  2.     image: bitnami/etcd:3.4.15
  3.     restart: always
  4.     volumes:
  5.       - etcd_data:/bitnami/etcd
  6.     environment:
  7.       ETCD_NAME: "etcd1"
  8.       ETCD_ENABLE_V2: "true"
  9.       ALLOW_NONE_AUTHENTICATION: "yes"
  10.       ETCD_INITIAL_CLUSTER_STATE: "new"
  11.       ETCD_ADVERTISE_CLIENT_URLS: "http://12.10.8.92:2379"
  12.       ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://12.10.8.92:2380"
  13.       ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
  14.       ETCD_INITIAL_CLUSTER_TOKEN: "etcd-cluster"
  15.       ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
  16.       ETCD_INITIAL_CLUSTER: "etcd1=http://12.10.8.92:2380,etcd2=http://12.10.8.93:2380,etcd3=http://12.10.8.94:2380"
  17.     ports:
  18.       - "2379:2379/tcp"
  19.       - "2380:2380/tcp"
  20.     networks:
  21.       apisix:

节点2 ETCD集群配置:

  1.   etcd:
  2.     image: bitnami/etcd:3.4.15
  3.     restart: always
  4.     volumes:
  5.       - etcd_data:/bitnami/etcd
  6.     environment:
  7.       ETCD_NAME: "etcd2"
  8.       ETCD_ENABLE_V2: "true"
  9.       ALLOW_NONE_AUTHENTICATION: "yes"
  10.       ETCD_INITIAL_CLUSTER_STATE: "new"
  11.       ETCD_ADVERTISE_CLIENT_URLS: "http://12.10.8.93:2379"
  12.       ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://12.10.8.93:2380"
  13.       ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
  14.       ETCD_INITIAL_CLUSTER_TOKEN: "etcd-cluster"
  15.       ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
  16.       ETCD_INITIAL_CLUSTER: "etcd1=http://12.10.8.92:2380,etcd2=http://12.10.8.93:2380,etcd3=http://12.10.8.94:2380"
  17.     ports:
  18.       - "2379:2379/tcp"
  19.       - "2380:2380/tcp"
  20.     networks:
  21.       apisix:

节点3 ETCD集群配置:

  1.   etcd:
  2.     image: bitnami/etcd:3.4.15
  3.     restart: always
  4.     volumes:
  5.       - etcd_data:/bitnami/etcd
  6.     environment:
  7.       ETCD_NAME: "etcd3"
  8.       ETCD_ENABLE_V2: "true"
  9.       ALLOW_NONE_AUTHENTICATION: "yes"
  10.       ETCD_INITIAL_CLUSTER_STATE: "new"
  11.       ETCD_ADVERTISE_CLIENT_URLS: "http://12.10.8.94:2379"
  12.       ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://12.10.8.94:2380"
  13.       ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
  14.       ETCD_INITIAL_CLUSTER_TOKEN: "etcd-cluster"
  15.       ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
  16.       ETCD_INITIAL_CLUSTER: "etcd1=http://12.10.8.92:2380,etcd2=http://12.10.8.93:2380,etcd3=http://12.10.8.94:2380"
  17.     ports:
  18.       - "2379:2379/tcp"
  19.       - "2380:2380/tcp"
  20.     networks:
  21.       apisix:

注意:各个节点etcd的2379和2380需要互通。ETCD_LISTEN_PEER_URLS和ETCD_LISTEN_CLIENT_URLS的IP最好是0.0.0.0如果按网上或者官方的配置会导致启动失败。

配置APISIX的配置文件(三个节点都需要修改):

/data/soft/apisix-docker/example/apisix_conf/config.yaml

修改config.yaml的etcd如下: 

  1. etcd:
  2.     host:
  3.       - "http://12.10.8.92:2379"
  4.       - "http://12.10.8.93:2379"
  5.       - "http://12.10.8.94:2379"
  6.         # multiple etcd address
  7.     prefix: "/apisix"               # apisix configurations prefix
  8. timeout: 30                     # 30 seconds

配置dashboard的配置文件(三个节点都需要修改):

/data/soft/apisix-docker/example/dashboard_conf/conf.yaml

  1.   etcd:
  2.     endpoints:
  3.       - "http://12.10.8.92:2379"
  4.       - "http://12.10.8.93:2379"    
  5.       - "http://12.10.8.94:2379"    

配置完成,启动APISIX(三个节点都需要启动):

  1. cd /data/soft/apisix-docker/example
  2. docker-compose -p docker-apisix up -d

安装完成后,你可以在运行 Docker 的宿主机上执行 curl 命令访问 Admin API,根据返回数据判断 APISIX 是否成功启动。X-API-KEY在apisix_conf/config.yaml配置文件里可找到。

# 注意:请在运行 Docker 的宿主机上执行 curl 命令。

curl "http://127.0.0.1:9180/apisix/admin/services/" -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'

如果返回数据如下所示,则表示 APISIX 成功启动:

  1. {
  2.   "count":0,
  3.   "node":{
  4.     "key":"/apisix/services",
  5.     "nodes":[],
  6.     "dir":true
  7.   }
  8. }

验证etcd集群:

  1. 进入etcd 容器内:
  2. docker exec -it *****  /bin/bash
  3. 运行下面命令查看节点状态
  4. etcdctl member list

  5. 显示以下内容etcd集群成功:

b99e84a8f163a77, started, etcd1, http://12.10.8.92:2380, http://12.10.8.92:2379, false

78d14fd665ac2577, started, etcd2, http://12.10.8.93:2380, http://12.10.8.93:2379, false

d72f728605b522c2, started, etcd3, http://12.10.8.94:2380, http://12.10.8.94:2379, false

验证APISIX集群:

1.后台查看docker服务日志看看是否有报错

Docker logs docker-apisix_apisix_1

2.登录:http://12.10.8.92:9000/serverinfo 三个节点能正常显示则代表集群安装成功。

3.停止其中一个节点的容器服务:

docker-compose -p docker-apisix  stop

查看其它容器的etcd日志,发现已经在重新选举:

#集群测试验证(停止其中一台node后会重新选举主席)

raft2023/01/09 00:50:52 INFO: b99e84a8f163a77 [term: 18] received a MsgVote message with higher term from d72f728605b522c2 [term: 19]

raft2023/01/09 00:50:52 INFO: b99e84a8f163a77 became follower at term 19

raft2023/01/09 00:50:52 INFO: b99e84a8f163a77 [logterm: 18, index: 80, vote: 0] cast MsgVote for d72f728605b522c2 [logterm: 18, index: 80] at term 19

raft2023/01/09 00:50:52 INFO: raft.node: b99e84a8f163a77 lost leader 78d14fd665ac2577 at term 19

raft2023/01/09 00:50:52 INFO: raft.node: b99e84a8f163a77 elected leader d72f728605b522c2 at term 19

2023-01-09 00:50:52.680807 W | rafthttp: lost the TCP streaming connection with peer 78d14fd665ac2577 (stream MsgApp v2 reader)

2023-01-09 00:50:52.681175 W | rafthttp: lost the TCP streaming connection with peer 78d14fd665ac2577 (stream Message reader)

2023-01-09 00:50:52.683499 E | rafthttp: failed to dial 78d14fd665ac2577 on stream MsgApp v2 (peer 78d14fd665ac2577 failed to find local node b99e84a8f163a77)

2023-01-09 00:50:52.683509 I | rafthttp: peer 78d14fd665ac2577 became inactive (message send to peer failed)

启动刚刚停止的容器。

APISIX集群搭建完成。

Nacos集群搭建:

官网的集群搭建步骤不适合我们本地,所以我自己写了docker-compose.yml。官网的配置步骤不够明确,所以不作为参考。我是直接把nacos 的docker-compose配置写在了 apisix 的docker-compose.yml里面,为了方便不再重新创建新的docker-compose。

修改config.yaml,把nacos集成到apisix(三个节点都需要配置)

在文件 /data/soft/apisix-docker/example/apisix_conf/config.yaml

中添加以下配置(域名下来后host只需要配置一个,如:https://nacos.qx.com):

  1. discovery:
  2.   nacos:
  3.     host:
  4.        - "http://12.10.8.92:8848"
  5.        - "http://12.10.8.93:8848"
  6.        - "http://12.10.8.94:8848"
  7.     prefix: "/nacos/v1/"
  8.     fetch_interval: 30    # default 30 sec
  9.     weight: 200           # default 100
  10.     timeout:
  11.       connect: 3000       # default 2000 ms
  12.       send: 3000          # default 2000 ms
  13.       read: 6000          # default 5000 ms

修改docker-compose.yml(三个节点都需要配置),NACOS_SERVER_IP 需要改为当前宿主机IP

在/data/soft/apisix-docker/example/docker-compose.yml中services下添加以下配置:

  1.   nacos:
  2.     image: nacos/nacos-server:v2.2.0
  3.     container_name: nacos
  4.     environment:
  5.       - MODE=cluster # 集群模式
  6.       - NACOS_SERVERS=12.10.8.92:8848,12.10.8.93:8848,12.10.8.94:8848 # IP1,IP2是对应的宿主服务器IP,PORT1,PORT2是对应的nacos服务端口
  7.       - PREFER_HOST_MODE=ip
  8.       - NACOS_SERVER_IP=12.10.8.92 # 服务器外网
  9.       - SPRING_DATASOURCE_PLATFORM=mysql
  10.       - MYSQL_SERVICE_HOST=***** # mysql数据库对应的ip
  11.       - MYSQL_SERVICE_PORT=3306    # mysql数据库对应的端口
  12.       - MYSQL_SERVICE_DB_NAME=***  # mysql数据库
  13.       - MYSQL_SERVICE_USER=**# mysql数据库对应的用户名
  14.       - MYSQL_SERVICE_PASSWORD=***# mysql数据库对应的密码
  15.       - MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=10000&socketTimeout=10000&autoReconnect=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true # mysql8数据库必须配置参数否则报错
  16.       - MYSQL_DATABASE_NUM=1 # 数据源为1个
  17.     volumes:
  18.       - ./nacos/nacos_log:/home/nacos/logs # 日志的挂在
  19.     ports:
  20.       - "8848:8848"
  21.       - "9848:9848"
  22.       - "9849:9849"
  23.       - "7848:7848"
  24.     restart: always
  25.     networks:
  26.       apisix:
  27.   apisix-dashboard:
  28.     image: apache/apisix-dashboard:2.15.0-alpine
  29.     restart: always
  30.     volumes:
  31.     - ./dashboard_conf/conf.yaml:/usr/local/apisix-dashboard/conf/conf.yaml
  32.     ports:
  33.     - "9000:9000"
  34.     networks:
  35.       apisix:

初始化nacos SQL:

在官网指定版本,如releases v2.2,下找到最新的SQL初始化文件,一般在conf目录下面:

https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.zip,

在nacos数据库执行SQL初始化数据。如果没有执行这一步会导致启动报错。

启动容器服务(三个节点都需要):

docker-compose -p docker-apisix up -d

验证集群:http://12.10.8.92:8848/nacos/

用户密码:nacos/nacos

Nacos Docker 快速开始

遇到的问题:

Nacos

  1. NACOS DOCKER 官方镜像启动失败报错 nacos Error creating bean with name 'memoryMonitor' defined in URL,需要初始化SQL,和配置数据库连接参数,因为我的是mysql8,所以需要配置。
  2. nacos节点状态正常,但是添加服务各种报错。Fail to get leader of group naming_instance_metadata,无法选举的报错,后面查看日志发现是端口 - "9849:9849" - "7848:7848" 未开放,未映射,官网和网上文档也并未提及。

APISIX

1.更新apisix集群需要删除数据,并重新创建文件夹,否则集群无法启动

rm -rf /var/lib/docker/volumes/docker-apisix_etcd_data

mkdir -p /var/lib/docker/volumes/docker-apisix_etcd_data

2. ETCD_LISTEN_PEER_URLS和ETCD_LISTEN_CLIENT_URLS的IP最好是0.0.0.0如果按网上或者官方的配置会导致etcd启动失败。

3. 官方配置apache/apisix:latest拉取的版本和etcd版本由冲突,需要修改docker-compose.yml下APISIX镜像的版本,如:apache/apisix:3.0.0-centos

4. 各个节点服务最好在几分钟内都能启动

5.     docker-compose.yml下etcd的2380端口也需要映射出来,不然集群无法启动。

6.     ETCD_LISTEN_CLIENT_URLS 按网上或者官方的配置会报错etcd bind: cannot assign requeste d address,IP需设置为0.0.0.0

7.     apisix  [error]failed to set upstream: no valid upstream node 接口服务没有配置好,网上文档有问题,端口是9180,不是9080。

8. etcd_ cluster 的版本不对导致集群启动失败,需要更新etcd_cluster的版本。

参考资料:

https://blog.51cto.com/waringid/5845100

https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html

https://www.bookstack.cn/read/apisix-3.0-zh/7c42ab4f372353b1.md

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/728179
推荐阅读
相关标签
  

闽ICP备14008679号