k8S部署芋道项目

zxbandzby
1
2025-09-26

一、项目介绍以及后端服务构建

这里部署的项目地址是 https://gitee.com/zhijiantianya/yudao-cloud

一个开源的后端管理系统

项目是前后端分离的

后端使用spring cloud,前端使用vue3

这篇文章先把后端环境配置好,能够成功构建服务

这里使用的系统是ubuntu:22.04

下载JDK21

由于openJDK22版本GA了,所以21版本需要到历史版本中下载https://jdk.java.net/archive/

PixPin 2024 05 29 09 38 54

配置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

项目构建时长跟网络和机器配置有关 03.md.webp

至此,我们已经部署好了后端环境,成功构建了后端项目 后续我们会继续部署这个项目,直到项目部署到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命名空间,按图填写

04.md.webp 05.md.webp

修改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)

  1. 创建screen会话 这个命令可以在一个终端窗口中创建多个虚拟终端,能让程序在虚拟终端中保持前台执行.哪怕你的终端窗口关闭也不受影响

    screen -R gateway
    
  2. 启动服务

    java -jar yudao-gateway/target/yudao-gateway.jar
    
  3. 查看服务启动结果 启动成功的话打印日志,如图 06.md.webp

  4. 访问页面端口 这里我的虚拟机ip地址为192.168.163.135

    此服务默认端口为48080,所以访问页面的地址为http://192.168.163.135:48080

    显示如下界面就是正常的

    07.webp

  5. 按下按键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

08.webp

启动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/

09.webp

这一节中启动了3个最基本的后端服务,下一节中再启动前端服务,整个项目也就算是搭建完成可以测试了

四、启动前端项目

安装环境

前端项目先启动到windows上,用于测试调整

需要安装几个软件git,node.js还有vscode

几个软件的安装就不写在文档中了,有需要的可以查看视频的安装步骤

Vue后台管理项目

d盘下创建一个gitdir目录

进入目录下面按图操作

10.webp

下载项目源码

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

11.md.webp

vscode打开整个项目

12.md.webp

13.md.webp

更改完之后保存文件

14.md.webp

能成功的话,说明系统基本功能没有问题了

五、服务容器化

之前我们已经成功启动服务了,但是启动方式比较麻烦

需要启动多个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下使用的包

15.md.webp

解压之后将命令添加到环境变量中

下载好的文件为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

16.md.webp

页面一切正常,到此关键服务都运行在docker中了

六、镜像仓库

Harbor搭建很简单,根据视频操作即可

七、搭建K8S集群

环境介绍

使用3台机器搭建一个1个master节点,2个node节点的集群

使用的操作系统为ubuntu:22.04

k8s版本为1.29

docker版本为26.0

角色

ip

master

192.168.163.11

node

192.168.163.12

node

192.168.163.13

确保每台机器的时间一致,并且主机名不同

安装最新版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上下载对应的包

17.md.webp

下载后将其解压复制到/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节点加入集群

使用时注意更改成对应的iphash

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:整个集群的出口,相当于最集群前端的nginx

  • meatllb:让服务的LoadBalancer可以绑定局域网ip

Helm

GitHub上下载最新包

18.md.webp

下载后上传到服务器,解压复制到/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的情况

19.md.webp

查看日志有连不上数据库的情况,需要重启一下对应的数据库,可能跟服务器开机自启动docker有关

20.md.webp

配置域名解析

之前我们使用的是ip地址加端口号的方式,使用ingress之后必须使用域名,这样才能把对应的路径的请求转发到后端服务

这里需要配置两个域名,通过更改hosts文件的方式来改变电脑的域名解析

文件位置如图(C:\Windows\System32\drivers\etc)

21.md.webp

查看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

22.md.webp

前端服务的启动

因为之后要使用域名访问,所以前端访问后端服务的地址也要改成域名的方式,需要更改重新构建前端项目

编辑前端项目下的.env.local文件

修改内容如图

23.md.webp

重新构建镜像并上传

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/

能够登录,说明部署没有任何问题

24.md.webp

到此为止,成功将项目部署到K8S上了

本次实战课结束了,但是运维的工作才刚刚开始,部署只是一个开头

后面的工作还有CICD发布,监控,日志收集,链路追踪等等一系列的内容

十一、简易CICD

whiteboard_exported_image-1.md.png

安装软件

这里我们用到几个软件,需要安装下载一下

  • python

  • vscode

  • git

新人小白可以参考视频完成安装

克隆项目

这里我们在gitee上创建一个项目,复制一个github项目:https://github.com/squidfunk/mkdocs-material

安装git之后生成公钥,上传到账户的ssh公钥中

ssh-keygen -t ed25519
# 查看复制公钥内容粘贴到gitee中
cat ~/.ssh/id_ed25519.pub

设置git使用的nameemail

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是否触发

之后再查看站点内容是否更新

动物装饰