Spring Cloud 中间件在 Kubernetes 上的最佳实践

前提说明

  1. 业务程序使用 Spring Cloud 框架开发

  2. 如果采用离线部署的方式,所有相关镜像需要提前 push 到镜像仓库,本文略过

  3. 部署架构图

  1. 整体部署架构涉及的中间件包含以下组件

    • Nacos

    • RocketMQ

    • Redis

    • xxl-job

    • SkyWalking

    • MySQL

    • Nginx

  2. 部署架构说明

    • K8s 集群之外采用了 Nginx 作为网关代理,将外部流量引入 K8s 集群

    • K8s 集群对外暴露服务使用了 NodePort 的方式,暂时没有引入 Ingress(因为不会,后期学会了再引入)

    • 其他的中间件都是部署在 K8s 集群之内

    • 本文并没有写日志配置的相关内容,后续会有专门的文档介绍

    • 本文没有介绍业务模块的配置内容,相关内容会在 业务模块自动化发布 文档中专门介绍

网关代理安装配置

环境说明

  • 操作系统 CentOS7.9

  • Nginx 1.20.2 的 RPM 包

部署步骤

# 下载rpm离线包,这里选择官方的最新稳定版1.20.2
$ wget http:/nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.20.2-1.el7.ngx.x86_64.rpm

# 安装
$ rpm -ivh nginx-1.20.2-1.el7.ngx.x86_64.rpm
warning: nginx-1.20.2-1.el7.ngx.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:nginx-1:1.20.2-1.el7.ngx         ################################# [100%]

# 查看已安装的nginx
$ rpm -qa | grep nginx
nginx-1.20.2-1.el7.ngx.x86_64

# 根据需要修改/etc/nginx/nginx.conf(主要用于自定义nginx服务器的各种配置等)
$ vi /etc/nginx/nginx.conf
示例配置见配置文件参考

# 根据需要修改/etc/nginx/conf.d/***.conf(主要用于自定义nginx的各种转发规则等)
$ vi /etc/nginx/conf.d/***.conf
示例配置见配置文件参考

# 检测nginx配置文件
$ nginx -t

# 启动nginx,并配置开机自启
$ systemctl start nginx && systemctl enable nginx

配置文件参考

  1. nginx.conf (/etc/nginx/nginx.conf)

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 10240;
}

http {
    server_tokens off;                                                # 隐藏版本号
    client_header_timeout 60;                                        # 客户端向服务端发送一个完整的 request header 的超时时间。如果客户端在指定时间内没有发送一个完整的 request header,Nginx 返回 HTTP 408(“Request timed out”)
    client_body_timeout 60;                                            # 该指令设置请求正文即请求体(request body)的读超时时间。超时仅设置为两个连续读取操作之间的时间段,而不是整个请求主体的传输。如果客户端在此时间内未传输任何内容,请求将以408(请求超时)错误终止
    limit_conn_zone $binary_remote_addr zone=one:10m;                # 限制可以存储多少个并发连接数(1m 可以储存 32000 个并发会话)
    limit_conn one 50;                                                # 限制每个 IP 只能发起 50 个并发连接
    limit_rate 2000k;                                                # 控制下载速度
    send_timeout 10;                                                # 服务端向客户端传输数据的超时时间,单位(s)
    keepalive_timeout   65;                                            # 每个 TCP 连接的超时时间
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format  debug  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" '
                      '"debug-cors" $cors_origin "debug-origin" $http_origin ';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;                                            # sendfile 是个比 read 和 write 更高性能的系统接口, 不过需要注意的是,sendfile 是将 in_fd 的内容发送到 out_fd 。而 in_fd 不能是 socket , 也就是只能文件句柄。所以当 Nginx 是一个静态文件服务器的时候,开启 SENDFILE 配置项能大大提高 Nginx 的性能.
    tcp_nopush          on;                                            # 可以配置一次发送数据包的大小。也就是说,数据包累积到一定大小后就发送,tcp_nopush 必须和 sendfile 配合使用.
    tcp_nodelay         on;                                            # 会增加小包的数量,但是可以提高响应速度。在及时性高的通信场景中应该会有不错的效果
    types_hash_max_size 4096;                                        # nginx 使用了一个散列表来保存MIME type 与文件扩展名之间的映射,该参数就是指定该散列表桶的大小的

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;
    error_page  400 404 413 502 504  /index.html;

    # 开启 gzip 压缩
    gzip  on;
    # 不压缩临界值,大于 1K 的才压缩
    gzip_min_length 1k;
    # buffer
    gzip_buffers 4 16k;
    # 用了反向代理的话,末端通信是 HTTP/1.0,默认是 HTTP/1.1
    #gzip_http_version 1.0;
    # 压缩级别,1-10,数字越大压缩的越好,时间也越长
    gzip_comp_level 2;
    # 进行压缩的文件类型,缺啥补啥
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascriptapplication/x-httpd-php image/jpeg image/gif image/png;
    # 跟 Squid 等缓存服务有关,on 的话会在 Header 里增加 "Vary: Accept-Encoding"
    gzip_vary off;
    # IE6 对 Gzip 不友好,不进行 Gzip 压缩
    gzip_disable "MSIE [1-6]\.";

    client_max_body_size 100m;                                    # nginx 对上传文件大小的限制
    proxy_buffer_size  128k;                                    # Nginx 使用该大小申请 read_buf,即大小指定了 upstream header 最大长度,如果响应头超过了这个长度,Nginx 会报 upstream sent too big header 错误,然后 client 收到的是 502
    proxy_buffers   32 32k;                                        # 设置存储被代理服务器响应的 body 所占用的 buffer 个数和每个 buffer 大小
    proxy_busy_buffers_size 128k;                                # proxy_busy_buffers_size 不是独立的空间,他是 proxy_buffers 和 proxy_buffer_size 的一部分。nginx 会在没有完全读完后端响应就开始向客户端传送数据,所以它会划出一部分 busy 状态的 buffer 来专门向客户端传送数据(建议为 proxy_buffers 中单个缓冲区的 2 倍),然后它继续从后端取数据。proxy_busy_buffer_size 参数用来设置处于 busy 状态的 buffer 有多大

    fastcgi_buffers 16 256k;                                    # 设定用来读取从 FastCGI 服务器端收到的响应信息的缓冲区大小和缓冲区数量
    fastcgi_buffer_size 128k;                                    # Nginx FastCGI 的缓冲区大小,用来读取从 FastCGI 服务器端收到的第一部分响应信息的缓冲区大小
    fastcgi_busy_buffers_size 256k;                                # 用于设置系统很忙时可以使用的 proxy_buffers 大小

    map $http_upgrade $connection_upgrade {  # 开启 websocket 升级代理功能,可选
        default upgrade;
        '' close;
    }

    include /etc/nginx/conf.d/*.conf;

    server {                                                    # http(80)转 https(443)配置
        listen       80;
        listen       [::]:80;
        server_name  www.abc.com;
        rewrite ^(.*)$ https://${server_name}$1 permanent;
        #root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}
  1. default.conf(/etc/nginx/conf.d/default.conf)

配置文件里只是一个后端模块的配置,请根据实际情况增加对应的 location

server {
listen 80;
  server_name www.abcd.com;
   access_log  /var/log/nginx/abc.access.log  main;                # 自定义专属日志文件
  
  location / {
    root /usr/share/nginx/dist;
    index  index.html index.htm;
  }

    location ^~ /api/ {                                            # 转发示例
        proxy_pass http://192.168.1.1:8003/;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

K8s 部署 MySQL5.7

Nacos 需要使用 MySQL 存储配置数据,由于使用量不大,因此没有考虑高可用部署,也可以采用已有的 MySQL 数据库。

部署步骤

创建 MySQL 相关部署文件

  1. 创建 MySQL 存储 PVC yaml 文件

$ vi mysql-pvc.yaml
  • mysql-pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-pvc
  namespace: test                                          #注意修改命名空间
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: glusterfs
  1. 创建 MySQL 配置 configmap yaml 文件

$ vi mysql-config.yaml
  • mysql-config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-cm
  namespace: test                                        #注意修改命名空间
data:
  mysqld.cnf: |
    [mysqld]
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
    bind-address    = 0.0.0.0
    port = 3306
    log-bin = mysql-bin
    server-id = 1
  1. 创建 MySQL 服务 Service yaml 文件

$ vi mysql-service.yaml
  • mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: test                                            #注意修改命名空间
spec:
  type: NodePort
  ports:
  - port: 3306
    targetPort: 3306
    nodePort: 30850
  selector:
    app: mysql
  1. 创建 MySQL 配置副本 Deployment yaml 文件

$ vi mysql.yaml
  • mysql.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: test                                                    #注意修改命名空间
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值