目 录CONTENT

文章目录

基于k8s从0到1部署商城系统的实战

JamKing
2025-10-23 / 0 评论 / 1 点赞 / 16 阅读 / 0 字

1、简介

2、中间件部署

2.1 mysql部署

2.1.1 下载mysql8.0二进制部署包

#耐心等待即可
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.43-linux-glibc2.28-x86_64.tar.xz

image-UKxV.png

#解压mysql
mkdir /data
tar xf mysql-8.0.43-linux-glibc2.28-x86_64.tar.xz -C /data
cd /data && mv mysql-8.0.43-linux-glibc2.28-x86_64 mysql

2.1.2 配置mysql

创建日志、配置目录

cd /data/mysql
mkdir -p {logs,conf,data}

创建简单启动的配置文件,路径/data/mysql/conf/my.cnf

[mysqld]
datadir=/data/mysql/data
socket=/tmp/mysql.sock
log-error=/data/mysql/logs/mysqld.log
pid-file=/data/mysql/logs/mysqld.pid
# 性能优化参数(根据需求调整)
innodb_buffer_pool_size=1G
max_allowed_packet=64M
lower_case_table_names=1
[client]
socket=/tmp/mysql.sock

创建mysql用户和用户组

groupadd mysql
useradd -r -g mysql -s /bin/false mysql
chown -R mysql:mysql /data/mysql

设置环境变量

echo "export PATH=/data/mysql/bin:$PATH" >> /etc/profile
source /etc/profile

初始化数据库

mysqld --defaults-file=/data/mysql/conf/my.cnf --initialize --user=mysql

image-kLiB.png

2.1.3 启动mysql

配置守护进程

cat > /usr/lib/systemd/system/mysqld.service << EOF
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
Type=simple
TimeoutSec=0
PermissionsStartOnly=true
ExecStart=/data/mysql/bin/mysqld_safe \
          --defaults-file=/data/mysql/conf/my.cnf \
          --datadir=/data/mysql/data \
          --user=mysql
LimitNOFILE = 65565
Restart=on-failure
Restart=always
RestartSec=5
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
EOF

载入守护进程

systemctl daemon-reload

启动mysql

#加入开机自启并快速启动
systemctl enable mysql --now

检查启动情况

netstat -tunlp|grep 3306

image-YMwm.png

2.1.4 数据库环境配置

获取初始密码

grep 'temporary password' /data/mysql/logs/mysqld.log

修改root密码

mysql -uroot -p'你的临时密码'

#改密码sql
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
#刷新权限sql
FLUSH PRIVILEGES;
#退出
exit

创建后端数据库备用

#创建yamidb
CREATE DATABASE yami_shops CHARACTER SET utf8 COLLATE utf8_general_ci;
#创建yami账号并授权远程访问
CREATE USER 'yami'@'%' IDENTIFIED WITH mysql_native_password BY '你的yami账号密码';
#授权yami库
GRANT ALL PRIVILEGES ON yami_shops.* TO 'yami'@'%';
#刷新权限
FLUSH PRIVILEGES;

导入数据

#切换到数据sql目录
cd /data/mall4j-master/db
mysql -uroot -p'你的密码'
#导入sql
source yami_shop.sql

2.2 redis部署

2.2.1 下载redis-6.2.19源码包

#耐心等待即可
wget https://download.redis.io/releases/redis-6.2.19.tar.gz

image-QEbj.png

#解压redis
tar xf redis-6.2.19.tar.gz -C /data

2.2.2 配置redis

准备编译环境

yum -y install gcc gcc-c++ make

编译

cd /data/redis-6.2.19
#速度取决于CPU,出现一下字眼即可
make

image-cmaa.png

编译安装,会在redis目标目录生成bin目录

mkdir -p /data/redis/{conf,logs,data}
cd /data/redis-6.2.19
make PREFIX=/data/redis install

image-uAdy.png

复制配置文件

cp /data/redis-6.2.19/redis.conf /data/redis/conf/

修改配置文件,vim /data/redis/conf/redis.conf

#守护进程模式
daemonize yes
#远程访问
bind 0.0.0.0
#监听端口
port 6379
#pid存储路径
pidfile /data/redis/logs/redis.pid
#日志存储路径
logfile /data/redis/logs/redis.log
#数据存储路径
dir /data/redis/data
#关闭保护模式
protected-mode no
#设置密码
requirepass $your_password

创建redis用户和用户组

groupadd redis
useradd -r -g redis -s /bin/false redis
chown -R redis:redis /data/redis

2.2.3 启动redis

配置守护进程

cat > /usr/lib/systemd/system/redis.service << EOF
[Unit]
Description=Redis
After=network.target

[Service]
User=redis
Group=redis
Type=forking
TimeoutSec=0
PIDFile=/data/redis/logs/redis.pid
ExecStart=/data/redis/bin/redis-server /data/redis/conf/redis.conf
Restart=on-failure
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

载入守护进程

systemctl daemon-reload

启动mysql

#加入开机自启并快速启动
systemctl enable mysql --now

检查启动情况

netstat -tunlp|grep 6379

image-matO.png

2.2.4 测试连接redis

./redis-cli -a 你的密码

image-JSYn.png

2.3 nginx部署

2.3.1 下载nginx源码

wget https://nginx.org/download/nginx-1.28.0.tar.gz

2.3.2 编译nginx

解压nginx源码

tar xf https://nginx.org/download/nginx-1.28.0.tar.gz

编译

cd nginx-1.28.0
#确保有openssl和pcre库,若不通外网,需要源码编译
yum install -y openssl openssl-devel pcre pcre-devel

#加入一些常用模块
./configure --prefix=/data/nginx --sbin-path=/data/nginx/sbin/nginx --modules-path=/data/nginx/modules --conf-path=/data/nginx/conf/nginx.conf --error-log-path=/data/nginx/log/error.log --http-log-path=/data/nginx/log/access.log --pid-path=/data/nginx/log/nginx.pid --lock-path=/data/nginx/log/nginx.lock --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module

#编译
make && make install

2.3.3 配置nginx

/data/nginx/nginx.conf文件核心内容

server {
         listen       80;
         server_name  127.0.0.1;
         #前端目录
         root /data/nginx/mall;
         location / {
         } 
         # 跨域配置
         location /apis {
                rewrite  ^/apis/(.*)$ /$1 break;
                proxy_pass   http://127.0.0.1:8111;
         }
   }

创建前端目录备用

mkdir -p /data/nginx/mall

2.3.4 启动nginx

/data/nginx/sbin/nginx

#此时访问会404,为正常,因为前端还没有就绪

3、编译后端

3.1 准备jdk环境

下载openjdk


解压openjdk

tar xf OpenJDK17U-jdk_x64_linux_hotspot_17.0.15_6.tar.gz -C /data
cd /data
mv jdk-17.0.15+6 jdk

设置环境变量

export JAVA_HOME=/data/jdk
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

验证java

java -version

image-qApq.png

3.2 准备maven环境

下载maven二进制包

wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz

解压maven

tar xf apache-maven-3.9.11-bin.tar.gz -C /data
cd /data
mv apache-maven-3.9.11 mvn

设置环境变量

echo "export MAVEN_HOME=/data/mvn" >> /etc/profile
echo "export PATH=$PATH:$MAVEN_HOME/bin" >> /etc/profile
source /etc/profile

验证maven

image-EJSI.png

3.3 上传商城后端源码包

上传源码包到/data/mall4j-master

3.4 编译jar包

修改配置,数据库账号密码,端口号

vim yami-shop-admin/src/main/resources/application-prod.yml

image-LvAL.png

修改配置,项目地址

vim yami-shop-admin/src/main/resources/logback/logback-prod.xml

image-ZbPR.png

修改配置,数据库账号密码,端口号

vim yami-shop-api/src/main/resources/application-prod.yml

image-mGQP.png

修改配置,项目地址

vim yami-shop-api/src/main/resources/logback/logback-prod.xml

image-nlgY.png

编译jar

mvn clean package -DskipTests

image-MLBL.png

3.5 复制jar到目标目录

mkdir -p /data/mall
#商城后台接口
cp yami-shop-admin/target/yami-shop-admin-0.0.1-SNAPSHOT.jar /data/mall/
#商城前端接口
cp yami-shop-api/target/yami-shop-api-0.0.1-SNAPSHOT.jar /data/mall

image-XDTD.png

3.6 测试启动jar

/data/jdk/bin/java -jar -Dspring.profiles.active=prod yami-shop-admin-0.0.1-SNAPSHOT.jar

image-rJzv.png

/data/jdk/bin/java -jar -Dspring.profiles.active=prod yami-shop-api-0.0.1-SNAPSHOT.jar

image-uwBM.png

4、编译前端

4.1 部署node.js


curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash

\. "$HOME/.nvm/nvm.sh"

nvm install 18

corepack enable pnpm

node -v 

npm -v

pnpm -v

4.2 修改npm镜像源

#npm的镜像源更改为淘宝的镜像源
npm config set registry https://registry.npmmirror.com

4.3 安装依赖

cd front-end/mall4v
pnpm install

image-gWji.png

image-FJls.png

4.4 打包前端

cd /data/mall4j-master/front-end/mall4v
npm run build

image-Fvql.png

编译完成后,会在当前项目目录mall4v下生成dist目录,把dist目录的内容迁到nginx下

mv dist/* /data/nginx/mall

5、访问商城系统

部署就绪后,验收成果,浏览器访问http://172.16.10.128

image-KgbE.png

image-kFCZ.png

image-TKYV.png

6、构建docker镜像

由上可见,纯linux物理部署已经成功运行了商城系统,接着要进行容器化,k8s化

6.1 准备docker环境

yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl start docker

6.2 Dockerfile构建

创建dockerfile目录和拷贝jar包

mkdir -p /data/dockerfile/{admin,api}
cp /data/mall/yami-shop-admin-0.0.1-SNAPSHOT.jar /data/dockerfile/admin/
cp /data/mall/yami-shop-api-0.0.1-SNAPSHOT.jar /data/dockerfile/api/

6.2.1 admin镜像

admin的Dockerfile

cd /data/dockerfile/admin
vim Dockerfile
#内容如下
#拉取基础openjdk镜像
FROM eclipse-temurin:17-jre-alpine-3.21
  
#构建时admin服务变量
ARG SVC_NAME=yami-shop-admin-0.0.1-SNAPSHOT.jar

#声明暴露
EXPOSE 8111

#创建工作目录
RUN mkdir -p /data/mall-admin

#容器工作目录
WORKDIR /data/mall-admin

#拷贝本地服务到镜像内
COPY ${SVC_NAME} ./app.jar

#启动时运行命令
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod","app.jar"]

执行构建

docker build -t mall-admin:v1 .

image-XTFo.png

6.2.2 api镜像

api的Dockerfile

cd /data/dockerfile/api
vim Dockerfile
#内容如下
#拉取基础openjdk镜像
FROM eclipse-temurin:17-jre-alpine-3.21
  
#构建时admin服务变量
ARG SVC_NAME=yami-shop-api-0.0.1-SNAPSHOT.jar

#声明暴露
EXPOSE 8112

#创建工作目录
RUN mkdir -p /data/mall-api

#容器工作目录
WORKDIR /data/mall-api

#拷贝本地服务到镜像内
COPY ${SVC_NAME} ./app.jar

#启动时运行命令
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod","app.jar"]

执行构建

docker build -t mall-api:v1 .

image-STNu.png

6.3 docker运行后端镜像

6.3.1 试运行admin镜像

docker run -itd --name admin -p 8111:8111 mall-admin:v1

查看启动日志,结果运行成功

docker logs -f admin

image-INnj.png

6.3.2 试运行api镜像

docker run -itd --name api -p 8112:8112 mall-api:v1

查看启动日志,结果运行成功

docker logs -f api

image-XfXp.png

6.4 推送至harbor仓库

7、基于k8s运行商城系统

前提在已经部署的k8s集群上运行,详情可参考k8s

7.1 创建部署yaml文件

7.1.1 admin

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mall-admin
  namespace: mall
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mall-admin
  template:
    metadata:
      labels:
        app: mall-admin
    spec:
      containers:
        - name: mall-admin
          image: mall-admin:v1
          ports:
            - containerPort: 8111
              hostPort: 8111
          volumeMounts: []
      volumes: []
      restartPolicy: Always
      dnsPolicy: ClusterFirst
---
apiVersion: v1
kind: Service
metadata:
  name: mall-admin
  namespace: mall
spec:
  selector:
    app: mall-admin
  ports:
    - name: mall-admin-8111
      protocol: TCP
      port: 8111
      targetPort: 8111
      nodePort: 30081
  type: NodePort

7.1.2 api

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mall-api
  namespace: mall
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mall-api
  template:
    metadata:
      labels:
        app: mall-api
    spec:
      containers:
        - name: mall-api
          image: mall-api:v1
          ports:
            - containerPort: 8112
              hostPort: 8112
          volumeMounts: []
      volumes: []
      restartPolicy: Always
      dnsPolicy: ClusterFirst
---
apiVersion: v1
kind: Service
metadata:
  name: mall-api
  namespace: mall
spec:
  selector:
    app: mall-api
  ports:
    - name: mall-api-8111
      protocol: TCP
      port: 8112
      targetPort: 8112

7.2 运行yaml文件

kubectl create ns mall
kubectl apply -f admin.yaml
kubectl apply -f api.yaml

image-xhYK.png

image-fqDS.png

7.3 修改nginx配置

修改映射的admin的后端nodePort端口

image-UXdP.png

7.4 验收k8s化商城系统

image-xaMz.png

至此,mall商城从0到1,从物理机部署到k8s容器部署已经实现。

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区