前提说明
-
业务程序使用 Spring Cloud 框架开发
-
如果采用离线部署的方式,所有相关镜像需要提前 push 到镜像仓库,本文略过
-
部署架构图
-
整体部署架构涉及的中间件包含以下组件
-
Nacos
-
RocketMQ
-
Redis
-
xxl-job
-
SkyWalking
-
MySQL
-
Nginx
-
-
部署架构说明
-
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
配置文件参考
-
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 {
}
}
}
-
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 相关部署文件
-
创建 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
-
创建 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
-
创建 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
-
创建 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