一、项目介绍以及后端服务构建
这里部署的项目地址是 https://gitee.com/zhijiantianya/yudao-cloud
一个开源的后端管理系统
项目是前后端分离的
后端使用spring cloud
,前端使用vue3
这篇文章先把后端环境配置好,能够成功构建服务
这里使用的系统是ubuntu:22.04
下载JDK21¶
由于openJDK22版本GA了,所以21版本需要到历史版本中下载https://jdk.java.net/archive/
配置JAVA环境
上传到linux系统中,之后解压,这里我将压缩包放到了/opt
目录下
cd /opt
tar xvf openjdk-21.0.2_linux-x64_bin.tar.gz
编辑文件~/.bashrc
在文件最后添加三行内容
export JAVA_HOME=/opt/jdk-21.0.2
export CLASSPATH=.:${JAVA_HOME}/lib
export PATH=${CLASSPATH}:${JAVA_HOME}/bin:$PATH
重新加载配置
source ~/.bashrc
查看JAVA版本
java --version
如果版本为openjdk 21.0.2,说明没有问题
安装配置maven¶
apt install maven
配置国内源,更改配置文件/etc/maven/settings.xml
找到<mirrors>
标签行,将下面内容添加到此标签内
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public </url>
</mirror>
下载后端源码¶
mkdir -p /opt/gitdir
cd /opt/gitdir
git clone https://gitee.com/zhijiantianya/yudao-cloud.git
切换分支 由于官方更新了项目,将master-jdk21
分支替换为了master-jdk17
,所以这里跟视频不一样。又因为官方更新速度比较快,有时候新代码无法通过构建,使用时无需追求最新的代码而是选择一个稳定能够通过的代码。项目提供了tag,可以切换到最新的tag来成功构建。可以在项目下执行git tag
来查看项目所有的tag,这里使用最新的tag:
cd yudao-cloud/
git checkout v2.1.0\(jdk17/21\)
构建项目¶
mvn clean package -Dmaven.test.skip=true
至此,我们已经部署好了后端环境,成功构建了后端项目 后续我们会继续部署这个项目,直到项目部署到k8s集群中并能正常访问
二、中间件服务搭建
要将服务都启动起来需要一些基础设施,也就是中间件
这里必须搭建的有3个
Mysql
:数据库Redis
:缓存Nacos
:注册中心配置中心
由于现在官方docker无法直接下载,所以之后的镜像地址都提供可以直接使用的地址,大家复制粘贴即可直接使用。
Mysql¶
这里我的虚拟机ip为192.168.163.135
,之后代码中相关配置,注意要更改为自己机器的ip地址
部署mysql¶
使用Docker部署mysql数据库
docker run -d -p 3306:3306 \
--restart=unless-stopped \
--name=yudao_mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-v "/etc/localtime:/etc/localtime" \
-v yc_mysql:/var/lib/mysql \
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/mysql:8.4.2
导入数据¶
使用mysql创建数据库ruoyi-vue-pro
导入后端项目下sql目录中的ruoyi-vue-pro.sql
进行初始化
可以使用以下命令初始化:
cd /opt/gitdir/yudao-cloud/sql/mysql
docker exec -i yudao_mysql mysql -uroot -p123456 -e 'CREATE DATABASE `ruoyi-vue-pro`;'
docker exec -i yudao_mysql mysql -uroot -p123456 ruoyi-vue-pro < ./ruoyi-vue-pro.sql
修改后端配置中数据库地址¶
数据库连接配置在application-local.yaml
文件中,默认是使用127.0.0.1:3306
端口,并且账号是root
,密码是123456
我们需要修改其ip地址,因为文件比较多,我们使用shell批量替换
以下所有的查找替换操作都是在项目的根目录下执行的
查找所有application-local.yaml查看其中的数据库配置
find ./ -name application-local.yaml -exec grep -l 'jdbc:mysql://127.0.0.1:3306' {} +
更改数据库配置中的ip地址,注意更换为自己的ip地址
find ./ -name application-local.yaml -print0 | xargs -0 sed -i 's|jdbc:mysql://127.0.0.1:3306|jdbc:mysql://192.168.163.135:3306|g'
查看更改后的内容
find ./ -name application-local.yaml -exec grep 'jdbc:mysql://192.168.163.135:3306' {} +
Redis¶
部署redis¶
使用Docker部署redis
docker run -d \
--restart=unless-stopped \
--name=yudao_redis \
-v "/etc/localtime:/etc/localtime" \
-p 6379:6379 \
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/redis:7.2.5
修改Redis配置¶
修改后端配置中redis的地址
find ./ -name application-local.yaml -print0 | xargs -0 sed -i 's|host: 127.0.0.1 # 地址|host: 192.168.163.135 # 地址|g'
查看更改后内容
find ./ -name application-local.yaml -exec grep 'host: 192.168.163.135 # 地址' {} +
Nacos¶
部署Nacos¶
使用Docker部署Nacos
docker run -d \
-p 8848:8848 \
-p 9848:9848 \
--restart=unless-stopped \
--name=yudao_nacos \
-e MODE=standalone \
-v "/etc/localtime:/etc/localtime" \
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nacos/nacos-server:v2.4.0
创建命名空间¶
创建dev命名空间,按图填写
修改Nacos配置¶
修改后端配置中Nacos的地址
find ./ -name bootstrap-local.yaml -print0 | xargs -0 sed -i 's|server-addr: 127.0.0.1:8848|server-addr: 192.168.163.135:8848|g'
三、启动基础后端服务
之前我们构建了后端服务
又部署了中间件服务:mysql
,redis
,nacos
由于默认项目下的配置文件中使用的地址是127.0.0.1
我们上个文档中已经改好了ip地址,现在需要重新构建后端服务,这样服务才能正确使用修改后的配置文件
重新构建¶
重新构建后端项目
# 进入项目根目录
cd /opt/gitdir/yudao-cloud
mvn clean install package '-Dmaven.test.skip=true'
启动主要后端服务¶
启动gateway服务¶
这个服务的主要提供API 服务网关,提供用户认证、服务路由、灰度发布、访问日志、异常处理等功能。
构建完成后yudao-gateway/target/
目录下会有一个yudao-gateway.jar
文件,使用java -jar xxx.jar
启动这个文件即可,注意要写对路径
之后的后端服务也是一样的方式启动,文档演示时的当前目录为项目的根目录(就是/opt/gitdir/yudao-cloud
)
创建screen会话 这个命令可以在一个终端窗口中创建多个虚拟终端,能让程序在虚拟终端中保持前台执行.哪怕你的终端窗口关闭也不受影响
screen -R gateway
启动服务
java -jar yudao-gateway/target/yudao-gateway.jar
访问页面端口 这里我的虚拟机ip地址为
192.168.163.135
此服务默认端口为
48080
,所以访问页面的地址为http://192.168.163.135:48080
显示如下界面就是正常的
按下按键Ctrl+A,松开后再按一下D,就能分离
screen
窗口,回到之前的终端
启动system服务¶
之后不再复述screnn的操作,每个服务都需要一样的操作,或者启动多个窗口保持前台运行
此服务主要是实现系统功能的模块
启动服务
java -jar yudao-module-system/yudao-module-system-biz/target/yudao-module-system-biz.jar
启动成功的日志输出内容也跟上面的gateway服务类似
默认端口为48081
这里访问两个页面,这两个页面一个是实际的服务页面,一个是经过网关的页面
http://192.168.163.135:48080/admin-api/system
http://192.168.163.135:48081/admin-api/system
启动infra服务¶
此服务与系统的基础设施相关
启动服务
java -jar yudao-module-infra/yudao-module-infra-biz/target/yudao-module-infra-biz.jar
默认端口为48082
启动后访问两个页面
http://192.168.163.135:48080/admin-api/infra/
http://192.168.163.135:48082/admin-api/infra/
这一节中启动了3个最基本的后端服务,下一节中再启动前端服务,整个项目也就算是搭建完成可以测试了
四、启动前端项目
安装环境¶
前端项目先启动到windows上,用于测试调整
需要安装几个软件git,node.js还有vscode
几个软件的安装就不写在文档中了,有需要的可以查看视频的安装步骤
Vue后台管理项目¶
在d
盘下创建一个gitdir
目录
进入目录下面按图操作
下载项目源码
git clone https://gitee.com/yudaocode/yudao-ui-admin-vue3.git
构建项目
cd yudao-ui-admin-vue3
git checkout v2.1.0
# 设置国内npm源
npm config set registry https://registry.npmjs.org
# 安装pnpm
npm install -g pnpm
# 设置国内源
pnpm config set registry https://registry.npmmirror.com
# 安装项目包
pnpm install
更改配置
sed -i 's|api-dashboard.yudao.iocoder.cn|192.168.163.135:48080|g' .env.dev
运行项目
pnpm dev
用vscode
打开整个项目
更改完之后保存文件
能成功的话,说明系统基本功能没有问题了
五、服务容器化
之前我们已经成功启动服务了,但是启动方式比较麻烦
需要启动多个screen虚拟终端,要么就启动多个窗口
这节将前后端服务都制作成docker镜像,这样启动和管理就会方便很多
部署到其他机器上都不用考虑环境的问题,无论宿主机上是否有java21
只要有docker,那么启动就不会有任何问题
制作后端Docker镜像¶
后端有3个服务,gateway
,system
,infra
分别进入各自的子目录,项目自己提供了Dockerfile文件,不需要我们生成。可以更改FROM基于的镜像下载更快。
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/eclipse-temurin:21-jre
之后制作镜像:
# 制作gateway镜像
cd /opt/gitdir/yudao-cloud/yudao-gateway
docker build -t yudao_gateway .
# 制作system镜像
cd /opt/gitdir/yudao-cloud/yudao-module-system/yudao-module-system-biz
docker build -t yudao_system .
# 制作infra镜像
cd /opt/gitdir/yudao-cloud/yudao-module-infra/yudao-module-infra-biz
docker build -t yudao_infra .
启动后端容器¶
在启动之前要先停止之前启动的服务,停止之后再启动docker
服务启动的时候会自动注册地址到nacos
中
如果使用docker
的网络注册到nacos
中的地址就是docker
内部地址
如果3个服务在同一个机器上还好,如果在不同的机器上,是无法通过docker
内部地址访问的
这里为了方便,我们使用host
的网络方式
这样docker
使用宿主机的ip地址,注册时也是宿主机的ip地址
之后服务启动到k8s
中不会有这个问题,因为k8s
使用网络插件可以打通多个节点之间的网络,使用内部ip地址也可以进行通信
通过下面命令启动3个后端服务
docker run -d \
--network=host \
--name yudao_gateway \
-v "/etc/localtime:/etc/localtime" \
yudao_gateway
docker run -d \
--network=host \
--name yudao_system\
-v "/etc/localtime:/etc/localtime" \
yudao_system
docker run -d \
--network=host \
--name yudao_infra\
-v "/etc/localtime:/etc/localtime" \
yudao_infra
启动之后,可以通过docker logs来查看服务的日志,参数-f可以实时查看日志的更新,查看完毕后使用Ctrl+C来退出查看
docker logs -f yudao_gateway
docker logs -f yudao_system
dcoker logs -f yudao_infra
制作前端docker镜像¶
需要我们到linux上下载项目之后构建
先安装环境,到nodejs官网下载linux下使用的包
解压之后将命令添加到环境变量中
下载好的文件为node-v20.12.0-linux-x64.tar.xz
上传到机器的/opt/
目录下
cd /opt
tar xvf node-v20.12.0-linux-x64.tar.xz
添加配置到~/.bashrc
最下面
export PATH=$PATH:/opt/node-v20.11.1-linux-x64/bin
重新加载配置
source ~/.bashrc
克隆前端项目
cd /opt/gitdir
git clone https://gitee.com/yudaocode/yudao-ui-admin-vue3.git
git checkout v2.1.0
cd yudao-ui-admin-vue3
sed -i 's|api-dashboard.yudao.iocoder.cn|192.168.163.135:48080|g' .env.dev
注意上面配置文件.env.dev
内容中的ip地址,改为自己的后端ip地址
...
# 请求路径
VITE_BASE_URL='http://192.168.163.135:48080'
# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持 S3 服务
VITE_UPLOAD_TYPE=server
# 上传路径
VITE_UPLOAD_URL='http://192.168.163.135:48080/admin-api/infra/file/upload'
....
构建项目
pnpm config set registry https://registry.npmmirror.com
pnpm install
pnpm build:dev
需要注意的是,构建这个前端项目需要7G左右的内存,否则会失败。
之后项目会将编译好的前端静态页面存放到当前目录下的dist
目录中
制作镜像,新建Dockerfile文件,写入以下内容
Dockerfile
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/nginx:1.27
ADD ./dist/ /usr/share/nginx/html/
构建镜像
docker build -t yudao_ui_admin .
启动容器
docker run --name yudao_ui_admin -d -p 8080:80 yudao_ui_admin
访问页面http://192.168.163.135:8080
页面一切正常,到此关键服务都运行在docker中了
六、镜像仓库
Harbor搭建很简单,根据视频操作即可
七、搭建K8S集群
环境介绍¶
使用3台机器搭建一个1个master
节点,2个node
节点的集群
使用的操作系统为ubuntu:22.04
k8s版本为1.29
docker版本为26.0
确保每台机器的时间一致,并且主机名不同
安装最新版Docker¶
必须使用v25以上版本的docker
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
关闭swap分区¶
到/etc/fstab
中注释掉swap相关挂载
之后执行
swapoff -a
每台机器安装容器运行时¶
安装docker¶
apt install docker
安装cri-docker¶
到GitHub上下载对应的包
下载后将其解压复制到/usr/bin
下
tar xvf cri-dockerd-0.3.12.amd64.tgz
install -o root -g root -m 0755 ./cri-dockerd/cri-dockerd /usr/bin/cri-dockerd
创建文件/etc/systemd/system/cri-docker.service
cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
创建文件/etc/systemd/system/cri-docker.socket
cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
启动cri-docker
systemctl daemon-reload
systemctl enable --now cri-docker.socket
安装对应软件包¶
kubeadm
:用于初始化集群kubelet
:在集群中每个节点上用来启动pod和容器kubectl
:与集群通信的命令行工具
使用国内源安装
apt-get update && apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl # 锁定版本,apt upgrade时不会更新
master节点配置kubeadm¶
创建文件kubeadm_init.yaml
kubeadm_init.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.163.11
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/cri-dockerd.sock
imagePullPolicy: IfNotPresent
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.29.1
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}
下载镜像
kubeadm config images pull --config ./kubeadm_init.yaml
初始化K8S集群¶
kubeadm init --config ./kubeadm_init.yaml
复制复制config文件到指定目录
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
配置集群网络¶
配置最简单的Flannel
网络
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
运行命令检查coreDNS pod
是否处于Running
状态
kubectl get pods -A
node节点加入集群¶
使用时注意更改成对应的ip
和hash
kubeadm join 192.168.171.91:6443 --cri-socket /var/run/cri-dockerd.sock \
--token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:a9898b3ff7733b7f7fbb3c51d62a88c8850e0c4a7e5961cf8399f27a4be7a0a0
执行命令查看集群中所有的节点
kubectl get nodes
八、安装K8S组件
搭建完k8s集群之后,我们还需要安装一些组件
有4个组件需要安装
helm
:类似apt那样的包管理工具dashboard
:仪表盘,更直观的查看k8s中的资源情况nginx ingress
:整个集群的出口,相当于最集群前端的nginxmeatllb
:让服务的LoadBalancer可以绑定局域网ip
Helm¶
到GitHub上下载最新包
下载后上传到服务器,解压复制到/usr/bin/
目录下
tar xvf helm-v3.14.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
Dabshboard¶
7.0
之后的版本只能使用helm
安装
# 添加存储库
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/
# 安装或者升级dashboard
helm upgrade --install kubernetes-dashboard kubernetes-dashboard/kubernetes-dashboard --create-namespace --namespace kubernetes-dashboard
创建服务账户 新建文件dashboard-adminuser.yaml
dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
应用到集群
kubectl apply -f dashboard-adminuser.yaml
创建令牌,用于页面登录
kubectl -n kubernetes-dashboard create token admin-user
复制输出的内容,这个就是登录要用到的令牌
ingress¶
下载yaml
文件
# 下载配置文件
wget -O nginx_ingress.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.10.0/deploy/static/provider/cloud/deploy.yaml
替换其中用到的镜像
sed -i 's$registry.k8s.io/ingress-nginx/controller:v1.10.0.*$registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.10.0$' nginx_ingress.yaml
sed -i 's$registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.0.*$registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.4.0$' nginx_ingress.yaml
应用到集群
kubectl apply -f nginx_ingress.yaml
查看pod
启动状态
kubectl get pod -n ingress-nginx
2个状态为Completed,1个状态为Running即为成功,如下
$ kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-bgpx5 0/1 Completed 0 2m17s
ingress-nginx-admission-patch-djm8b 0/1 Completed 0 2m16s
ingress-nginx-controller-d854966d-2q5q2 1/1 Running 0 2m17s
Meatllb¶
使用helm
进行安装
# 添加repo源
helm repo add metallb https://metallb.github.io/metallb
# 安装
helm install metallb metallb/metallb
创建配置meatllb.yaml
meatllb.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
spec:
addresses:
- 192.168.163.200-192.168.163.220
--- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: example
应用到集群
kubectl apply -f meatllb.yaml
4个组件安装完毕
九、K8S配置镜像仓库
之前我们已经生成了前后端的镜像,也安装了Harbor
镜像仓库
现在需要将相关镜像推送到镜像仓库中
K8S
再从镜像仓库中拉取服务的镜像启动
节点信任镜像仓库¶
因为我们没有为镜像仓库配置证书,所以我们需要在docker的配置中设置信任镜像仓库才能够正常的使用镜像仓库
需要编辑docker的配置文件/etc/docker/daemon.json
添加以下内容,这个ip地址是我镜像仓库的ip地址,如果镜像仓库不是使用的80端口,还需要添加对应的端口
{
"insecure-registries" : ["192.168.163.135"]
}
如果我们之前添加过国内镜像仓库,那么配置文件看起来就是这样
{
"insecure-registries" : ["192.168.163.135"],
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
更改完之后,需要重新启动docker服务
systemctl restart docker
这个操作需要在K8S
集群的node
节点和镜像上传节点上操作,对应本次实战项目就是12
, 13
,135
三台机器,因为master
不需要运行应用服务,所以不用修改
推送前后端镜像到镜像仓库¶
镜像推送到镜像仓库,需要使用docker tag生成新的镜像名称和版本
使用下面命令更改镜像名称
docker tag yudao_ui_admin 192.168.163.135/library/yudao_ui_admin
docker tag yudao_infra 192.168.163.135/library/yudao_infra
docker tag yudao_system 192.168.163.135/library/yudao_system
docker tag yudao_gateway 192.168.163.135/library/yudao_gateway
上传到镜像仓库
docker push 192.168.163.135/library/yudao_ui_admin
docker push 192.168.163.135/library/yudao_infra
docker push 192.168.163.135/library/yudao_system
docker push 192.168.163.135/library/yudao_gateway
之后到harbor站点上查看镜像是否上传成功
启动一个服务查看是否能成功拉取镜像
kubectl create deployment yudao-ui-admin --image=192.168.163.135/library/yudao_ui_admin
十、K8S中启动项目
我们所有的前置工作都做完了,可以进行服务的启动了
中间件服务(mysql
,redis
,nacos
)就沿用之前搭建的服务
因为是有状态服务所以就不放到k8s中了
后端服务的启动¶
后端3个服务(gateway,system,infra)
直接启动
kubectl create deployment yudao-gateway --image=192.168.163.135/library/yudao_gateway
kubectl create deployment yudao-system --image=192.168.163.135/library/yudao_system
kubectl create deployment yudao-infray --image=192.168.163.135/library/yudao_infra
如果有服务启动失败,有Errot和CrashLoopBackOff的情况
查看日志有连不上数据库的情况,需要重启一下对应的数据库,可能跟服务器开机自启动docker有关
配置域名解析¶
之前我们使用的是ip
地址加端口号的方式,使用ingress
之后必须使用域名,这样才能把对应的路径的请求转发到后端服务
这里需要配置两个域名,通过更改hosts文件的方式来改变电脑的域名解析
文件位置如图(C:\Windows\System32\drivers\etc
)
查看ingress
暴露的ip
地址,这里暴露的地址是192.168.163.200
kubectl get svc ingress-nginx-controller -n ingress-nginx
#---
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.101.148.148 192.168.163.200 80:31482/TCP,443:31823/TCP 25h
将域名解析到192.168.163.200
在hosts文中添加以下内容,注意域名自己
192.168.163.200 api.xxxx.net
192.168.163.200 www.xxxx.net
前端服务的启动¶
因为之后要使用域名访问,所以前端访问后端服务的地址也要改成域名的方式,需要更改重新构建前端项目
编辑前端项目下的.env.local
文件
修改内容如图
重新构建镜像并上传
npm run build:local-dev
docker build -t 192.168.163.135/library/yudao_ui_admin:v1 .
docker push 192.168.163.135/library/yudao_ui_admin:v1
因为上一节最后的时候我们再]在k8s中启动了ui服务
这里我们先删除之前启动的服务,再重新创建
kubectl delete deployment yudao-ui-admin
kubectl create deployment yudao-ui-admin --image=192.168.163.135/library/yudao_ui_admin:v1
为2个服务创建SVC¶
需要为gateway
服务和前端服务创建一个SVC
,方便ingress
调用
创建文件svc_yudao.yaml
svc_yudao.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: yudao-gateway
name: yudao-gateway
spec:
ports:
- port: 48080
protocol: TCP
targetPort: 48080
selector:
app: yudao-gateway
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: yudao-ui-admin
name: yudao-ui-admin
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: yudao-ui-admin
type: ClusterIP
Ingress的配置¶
在ingress中配置两个域名指向的服务
创建配置ingress_yudao.yaml
ingress_yudao.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
creationTimestamp: null
name: yudao
spec:
ingressClassName: nginx
rules:
- host: api.xxxx.net
http:
paths:
- backend:
service:
name: yudao-gateway
port:
number: 48080
path: /
pathType: Prefix
- host: www.xxxx.net
http:
paths:
- backend:
service:
name: yudao-ui-admin
port:
number: 80
path: /
pathType: Prefix
之后就可以访问页面http://www.xxxx.net/
能够登录,说明部署没有任何问题
到此为止,成功将项目部署到K8S
上了
本次实战课结束了,但是运维的工作才刚刚开始,部署只是一个开头
后面的工作还有CICD
发布,监控,日志收集,链路追踪等等一系列的内容
十一、简易CICD
安装软件¶
这里我们用到几个软件,需要安装下载一下
python
vscode
git
新人小白可以参考视频完成安装
克隆项目¶
这里我们在gitee上创建一个项目,复制一个github项目:https://github.com/squidfunk/mkdocs-material
安装git之后生成公钥,上传到账户的ssh公钥中
ssh-keygen -t ed25519
# 查看复制公钥内容粘贴到gitee中
cat ~/.ssh/id_ed25519.pub
设置git使用的name
和email
git config --global user.name "自己的名称"
git config --global user.email "自己的邮箱"
之后克隆项目,到gitee上复制ssh的克隆方式,这里我所处的目录为d盘
中的gitdir
目录
git clone git@gitee.com:xxxxx/mkdocs-material.git
更改项目配置¶
使用vscode
打开项目
更改项目根目录下的mkdocs.yml
配置文件,将google
相关的内容删除
# 删除下面三行
analytics:
provider: google
property: !ENV GOOGLE_ANALYTICS_KEY
启动构建项目¶
打开PowerShell(管理员)
,这样可以将包安装到python的安装目录下
cd D:\gitdir\mkdocs-material
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
pip install mkdocs-material mkdocs-minify-plugin -i https://mirrors.aliyun.com/pypi/simple/
启动项目
mkdocs serve
访问本地地址http://127.0.0.1:8000/mkdocs-material/
查看效果
构建项目(可跳过)
mkdocs build
构建完后,会在本地项目下生成一个site
目录,这个项目的静态资源文件都会生成到这个目录中
构建查看效果之后可以删除site
目录,下一节我们将此项目发布到服务器上并制作为Docker
镜像
开通一个公网机器¶
到阿里云上开通一个有公网的机器,具体的操作参考视频完成
在服务器上相关操作¶
生成密钥,并设置到gitee账号中
ssh-keygen -t ed25519
# 查看复制公钥内容粘贴到gitee中
cat ~/.ssh/id_ed25519.pub
克隆项目,应为不需要在服务器长对项目更新push,所以值配置密钥能clone就行, 不需要设置账号和邮箱
git clone git@gitee.com:xxxxx/mkdocs-material.git
使用Dockerfile构建镜像
Dockerfile
FROM squidfunk/mkdocs-material AS build
ADD ./mkdocs-material /doc
WORKDIR /doc
RUN mkdocs build
FROM nginx
RUN rm -rf /usr/share/nginx/html/*
COPY --from=build /doc/site/ /usr/share/nginx/html
构建镜像
docker build -t mysite .
启动容器
docker run -d --name mysite -p 80:80 mysite
之后就可以通过服务器的公网ip来访问到此站点了
03.配置WebHook触发更新项目¶
这是本项目的最后一节了
需要再实现几个功能
更新Docker镜像的脚本
调用上面脚本的API接口
更新代码后调用API接口的Webhook
更新Docker镜像的脚本¶
在/opt/gitdir
中创建以下文件
upsite.sh
#!/bin/bash
cd /opt/gitdir/mkdocs-material
git pull
cd /opt/gitdir
docker build -t mysite .
docker rm -f mysite
docker run -d --name mysite -p 80:80 mysite
docker rmi -f `docker images -f dangling=true -q`
为文件添加可执行权限
chmod +x ./upsite.sh
Fastapi脚本¶
在/opt/gitdir
中创建以下文件
api.py
from fastapi import FastAPI, BackgroundTasks
import uvicorn
from starlette.requests import Request
import asyncio
import subprocess
app = FastAPI()
script_path = '/opt/gitdir/upsite.sh'
async def run_script(script_path):
# 执行耗时任务
await asyncio.create_subprocess_shell(
script_path,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True
)
@app.post("/")
async def handle_post(request: Request, background_tasks: BackgroundTasks):
body = await request.json()
if body.get('password') == '12345678':
background_tasks.add_task(run_script, script_path)
# 立即返回响应,不等待任务完成
return {"message": "script started"}
else:
return {"message": "OK!"}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=23456)
之后安装python包并启动此服务
python3 -m pip install fastapi "uvicorn[standard]" -i https://mirrors.aliyun.com/pypi/simple/
python3 api.py
创建Webhook¶
到对应的gitee
仓库中,开启Webhook
,填写服务启动的公网ip以及端口号
这里我的云服务器的公网ip为47.251.56.237
,那我填写的地址为http://47.251.56.237:23456
更新文件提交更改¶
更改项目中的文档内容,之后提交更改
查看gitee
上的Webhook
是否触发
之后再查看站点内容是否更新