一、项目概述
k8s工作负载由于容灾自启,业务ip地址会经常在工作节点之间进行漂移,故而需要在k8s外面做Nginx进行负载均衡,这里采用https方式,项目使用Vue打包制作的镜像
二、环境
三、部署流程
3.1 Vue项目镜像打包
3.1.1 Dockerfile
直接将dist文件放在nginx的html下面
#Dockerfile
FROM nginx:latest
COPY dist /usr/share/nginx/html
#打包todolist:v1.0.0
docker build -t todolist:v1.0.0 .
#保存镜像
docker save todolist:v1.0.0>todolist.tar
3.2 Kuboard新建vue项目工作负载
3.2.1 推送到Harbor镜像仓库
详情查看前篇博客:k8s:V1.28拉取Habor镜像 这里使用时k8s:v1.28版本,从1.24版本往上使用containerd,需要使用ctr与nerdctl命令来进行查看镜像,命名空间,进行推送等,k8sV1.24以上版本拉取本地镜像是从containerd镜像库里面拉取的,不是从docker images里面拉取的,如果你没有Harbor,要确保每个工作节点上面k8s.io命名空间有镜像都有镜像,==如果你的k8s版本不是1.24版本以上,请自行使用docker上传到镜像仓库== ;常用ctr命令:
#下载镜像nginx
ctr image pull docker.io/library/nginx:alpine
#查看命名空间
ctr ns ls
#查看default空间镜像
ctr image ls
#查看k8s.io空间镜像
ctr -n k8s.io image ls
#打标签
ctr -n k8s.io images tag docker.io/library/flaskweb:v1.0.0 192.168.2.142:8800/test/flaskweb:v1.0.0
#导入到k8s.io空间镜像
ctr -n k8s.io image import flaskweb.tar.gz
#从镜像仓库下载镜像,http需要如下写法,不然会报错
ctr images pull --plain-http=true --skip-verify --user admin:Harbor12345 192.168.2.142:8800/test/flaskweb:v1.0.0
#推送镜像
ctr -n k8s.io image push --plain-http=true --skip-verify --user admin:Harbor12345 192.168.2.142:8800/test/flaskweb:v1.0.0
#nerdctl命令与docker命令很像
nerdctl images
nerdctl run
加载镜像到containerd
打标签tag
推送到Habror
#加载镜像
ctr -n k8s.io image import todolist.tar
#打标签tag
ctr -n k8s.io images tag docker.io/library/todolist:v1.0.0 192.168.2.142:8800/test/todolist:v1.0.0
#推送镜像
ctr -n k8s.io image push --plain-http=true --skip-verify --user admin:Harbor12345 192.168.2.142:8800/test/todolist:v1.0.0
3.2.2 部署deployment工作负载
3.3 openssl安装更新
#下载openssl
wget --no-check-certificate https://www.openssl.org/source/openssl-1.1.1q.tar.gz
#解压openssl
tar -xzvf openssl-1.1.1q.tar.gz
cd openssl-1.1.1q
#编译
./config
make && make install
如果openssl version报错,可能是软连接出现问题
3.4 服务器证书生成
按照要求填写信息,密码自定义,域名自定义,修改hosts文件
openssl genrsa -des3 -out todolist.key 2048
openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -keyout todolist.key -out todolist.crt
3.5 nginx.conf配置文件编写,启动项目
worker_processes 4;
worker_rlimit_nofile 40000;
events {
accept_mutex on;
multi_accept on;
worker_connections 8192;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
upstream todolist {
least_conn;
server 192.168.2.139:32666 max_fails=3 fail_timeout=5s;
server 192.168.2.140:32666 max_fails=3 fail_timeout=5s;
}
server {
listen 443 ssl;
ssl_certificate /etc/nginx/cert/todolist.crt;
ssl_certificate_key /etc/nginx/cert/todolist.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://todolist;
}
}
#重定向到https
server {
listen 80;
server_name localhost;
return 301 https://$host:8443$request_uri;
}
}
启动项目,挂载nginx日志文件,配置文件,cert证书文件
docker run -itd -e TZ="Asia/Shanghai" --restart=always -p 8888:80 -p 8443:443 -v /opt/todoList/nginxlist.conf:/etc/nginx/nginx.conf -v /opt/todoList/ssl:/etc/nginx/cert -v /opt/todoList/logs:/var/log/nginx --name nginxlist nginx:latest
域名访问
ip地址访问