| 主机名 | IP 地址 | 角色说明 |
|---|---|---|
| master01 | 10.8.0.10 | K8s 控制平面 + Harbor 私有镜像仓库(复用) |
| node01 | 10.8.0.12 | K8s 工作节点,运行业务、中间件、Ingress 控制器 |
说明:你的集群容器运行时为 Docker(非 containerd),K8s 版本 v1.20.11,以下步骤完全适配你的环境,所有 IP、配置均已对应修改。
阶段一:集群基础组件补全(先把依赖装好)
1.1 确认集群基础状态
先执行确认集群正常:
bash
kubectl get nodes
kubectl get pods -n kube-system

确保两个节点状态均为 Ready,核心控制平面 Pod 正常 Running。
1.2 安装 Ingress-Nginx 控制器(适配 v1.20,国内可用)
之前在线安装失败,改用本地下载 + 国内镜像源:
bash
cd /opt
# 下载v1.1.3版本(完美兼容K8s v1.20)
wget https://gitee.com/mirrors/ingress-nginx/raw/controller-v1.1.3/deploy/static/provider/cloud/deploy.yaml
# 替换镜像为阿里云国内源,解决k8s.gcr.io无法拉取
sed -i 's/k8s.gcr.io\/ingress-nginx\/controller:v1.1.3/registry.cn-hangzhou.aliyuncs.com\/google_containers\/nginx-ingress-controller:v1.1.3/g' deploy.yaml
sed -i 's/k8s.gcr.io\/ingress-nginx\/kube-webhook-certgen:v1.1.1/registry.cn-hangzhou.aliyuncs.com\/google_containers\/kube-webhook-certgen:v1.1.1/g' deploy.yaml
# 执行部署
kubectl apply -f deploy.yaml
验证安装:
bash
# 等待2分钟后查看
kubectl get pods -n ingress-nginx

预期:ingress-nginx-controller-xxx 状态为 1/1 Running,默认调度到 node01 节点。
1.3 安装 metrics-server(HPA 自动扩容依赖)
HPA 必须依赖 metrics-server 采集 CPU / 内存指标,适配 v1.20 版本:
bash
cd /opt
wget https://gitee.com/kubesphere/metrics-server/raw/v0.6.1/deploy/kubernetes/metrics-server.yaml
# 添加跳过证书参数(内网环境)
sed -i '/args:/a\ - --kubelet-insecure-tls' metrics-server.yaml
# 替换镜像为国内源
sed -i 's/k8s.gcr.io\/metrics-server\/metrics-server:v0.6.1/registry.cn-hangzhou.aliyuncs.com\/google_containers\/metrics-server:v0.6.1/g' metrics-server.yaml
# 部署
kubectl apply -f metrics-server.yaml
验证:
bash
# 等待1分钟后测试
kubectl top nodes
能输出节点 CPU、内存使用率即为正常。
阶段二:部署 Harbor 私有镜像仓库(master01 节点执行)
2.1 安装 docker-compose
bash
curl -L https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose -v

2.2 下载并解压 Harbor
bash
cd /opt
# 国内加速下载稳定版v2.7.1
wget https://ghproxy.com/https://github.com/goharbor/harbor/releases/download/v2.7.1/harbor-offline-installer-v2.7.1.tgz
tar -zxf harbor-offline-installer-v2.7.1.tgz
cd harbor

2.3 配置 Harbor
bash
cp harbor.yml.tmpl harbor.yml
vim harbor.yml
修改核心配置(对应你的 master IP):
yaml
hostname: 10.8.0.10 # 固定为master01的IP
http:
port: 8088 # 用8088端口,避免和Ingress的80冲突
# 注释掉所有https相关配置(测试环境用http即可)
harbor_admin_password: Harbor12345 # admin登录密码
data_volume: /data/harbor # 镜像数据存储目录

2.4 执行安装
bash
./prepare
./install.sh

验证:
bash
docker-compose ps

所有组件状态为 Up 即为安装成功。 浏览器访问 http://10.8.0.10:8088,账号 admin / 密码 Harbor12345,登录后新建项目 ruoyi。

阶段三:所有节点配置 Docker 信任 Harbor
master01 和 node01 两台都必须执行,否则拉取私有镜像会报证书错误。
3.1 修改 Docker 配置
bash
vim /etc/docker/daemon.json
完整配置(保留你之前的 cgroup 驱动,新增私有仓库信任):
json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"insecure-registries": ["10.8.0.10:8088"]
}
3.2 重启 Docker 生效
bash
systemctl daemon-reload
systemctl restart docker
3.3 测试登录 Harbor
bash
docker login 10.8.0.10:8088 -u admin -p Harbor12345


输出 Login Succeeded 即为配置成功。
阶段四:若依项目镜像构建与推送
若依微服务版拆分:
ruoyi-gateway网关、ruoyi-auth认证、ruoyi-system系统、ruoyi-file文件、ruoyi-visual监控、ruoyi-ui前端。
4.1 源码打包
- 后端:每个微服务模块执行
mvn clean package,生成对应 jar 包 - 前端:执行
npm run build,生成dist目录


4.2 构建后端JAR包
# 1. 检查Maven是否安装
mvn --version
# 如果未安装Maven,先安装:
yum install -y maven
# 2. 清理并打包(跳过测试)
mvn clean package -DskipTests
# 3. 验证JAR包是否生成
ls -lh ruoyi-admin/target/ruoyi-admin.jar


4.3 编写后端Dockerfile
# 在master上创建后端Dockerfile
cat > /root/ruoyi/ruoyi-admin/Dockerfile << 'EOF'
FROM openjdk:11-jre-slim
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
WORKDIR /app
COPY target/ruoyi-admin.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Xmx512m", "-Xms256m", "-jar", "/app/app.jar"]
EOF

4.4 构建后端镜像
# 在master上构建镜像
cd /root/ruoyi/ruoyi-admin
docker pull eclipse-temurin:11-jre-alpine
# 备份原有 Dockerfile
cp Dockerfile Dockerfile.bak
# 创建新的 Dockerfile
cat > Dockerfile << 'EOF'
FROM eclipse-temurin:11-jre-alpine
ENV TZ=Asia/Shanghai
RUN apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/$TZ /etc/localtime && \
echo $TZ > /etc/timezone
WORKDIR /app
COPY target/ruoyi-admin.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Xmx512m", "-Xms256m", "-jar", "/app/app.jar"]
EOF
# 查看 Dockerfile
cat Dockerfile
#确认 JAR 包存在
ls -lh /root/ruoyi/ruoyi-admin/target/ruoyi-admin.jar
#构建镜像
docker build -t ruoyi-admin:v1.0.0 .
#验证构建成功
docker images | grep ruoyi-admin

4.5 如果没有若依前端包
cd /root
# 从 GitHub 下载(若依 Vue3)
wget https://github.com/yangzongzhuan/RuoYi-Vue3/archive/refs/heads/master.zip -O ruoyi-ui.zip
# 解压
unzip ruoyi-ui.zip
# 重命名
mv RuoYi-Vue3-master ruoyi-ui
cd ruoyi-ui
ls -la
4.6 构建前端镜像
# 1. 进入前端目录
cd /root/ruoyi/ruoyi-ui
# 2. 检查Node.js是否安装
node --version
# 如果未安装Node.js:
curl -fsSL https://rpm.nodesource.com/setup_16.x | bash -
yum install -y nodejs
# 3. 安装依赖(使用淘宝镜像加速)
npm install --registry=https://registry.npmmirror.com
# 4. 构建生产环境包
npm run build:prod
# 5. 验证构建产物
ls -lh dist/
# 6. 创建前端Dockerfile
cat > Dockerfile << 'EOF'
FROM node:18-alpine as build
WORKDIR /app
COPY package*.json ./
RUN npm install --registry=https://registry.npmmirror.com
COPY . .
RUN npm run build:prod
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
RUN echo 'server { \
listen 80; \
location / { \
root /usr/share/nginx/html; \
try_files $uri $uri/ /index.html; \
} \
location /prod-api/ { \
proxy_pass http://ruoyi-service:8080/; \
proxy_set_header Host $host; \
proxy_set_header X-Real-IP $remote_addr; \
} \
}' > /etc/nginx/conf.d/default.conf
EXPOSE 80
EOF
# 7. 构建前端镜像
docker build -t ruoyi-ui:v1.0.0 .

第五阶段:在master上登录Harbor并推送镜像
5.1 创建命名空间
bash
kubectl create ns ruoyi
5.2 创建 Harbor 镜像拉取密钥
bash
kubectl create secret docker-registry harbor-secret \
--docker-server=10.8.0.10:8088 \
--docker-username=admin \
--docker-password=Harbor12345 \
-n ruoyi

5.3 部署 MySQL
新建 mysql-deploy.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
namespace: ruoyi
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "123456"
- name: MYSQL_DATABASE
value: "ry-vue"
volumeMounts:
- name: mysql-data
mountPath: /var/lib/mysql
volumes:
- name: mysql-data
hostPath:
path: /data/mysql
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: mysql
namespace: ruoyi
spec:
selector:
app: mysql
ports:
- port: 3306
targetPort: 3306
执行部署:
bash
kubectl apply -f mysql-deploy.yaml

5.4 部署 Redis
新建 redis-deploy.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
namespace: ruoyi
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:6
ports:
- containerPort: 6379
volumeMounts:
- name: redis-data
mountPath: /data
volumes:
- name: redis-data
hostPath:
path: /data/redis
type: DirectoryOrCreate
---
apiVersion: v1
kind: Service
metadata:
name: redis
namespace: ruoyi
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379
执行部署:
bash
kubectl apply -f redis-deploy.yaml

注意:若依配置文件中,数据库地址填
mysql:3306,Redis 地址填redis:6379,通过 K8s 内部 DNS 自动解析服务名。
阶段六:K8s 部署若依微服务
6.1 网关服务 ruoyi-gateway.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-gateway
namespace: ruoyi
spec:
replicas: 2
selector:
matchLabels:
app: ruoyi-gateway
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: ruoyi-gateway
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: ruoyi-gateway
image: 10.8.0.10:8088/ruoyi/ruoyi-gateway:v1.0
imagePullPolicy: Always
ports:
- containerPort: 8080
resources:
requests:
cpu: 200m
memory: 512Mi
limits:
cpu: 1000m
memory: 1Gi
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 20
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: ruoyi-gateway-svc
namespace: ruoyi
spec:
selector:
app: ruoyi-gateway
ports:
- port: 8080
targetPort: 8080
type: ClusterIP
执行:
bash
kubectl apply -f ruoyi-gateway.yaml

6.2 其余微服务
ruoyi-auth、ruoyi-system、ruoyi-file、ruoyi-visual 仿照网关模板,替换镜像名、端口、服务名即可。
6.3 前端服务 ruoyi-ui.yaml
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ruoyi-ui
namespace: ruoyi
spec:
replicas: 2
selector:
matchLabels:
app: ruoyi-ui
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: ruoyi-ui
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: ruoyi-ui
image: 10.8.0.10:8088/ruoyi/ruoyi-ui:v1.0
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 20
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: ruoyi-ui-svc
namespace: ruoyi
spec:
selector:
app: ruoyi-ui
ports:
- port: 80
targetPort: 80
执行:
bash
kubectl apply -f ruoyi-ui.yaml

6.4 查看所有 Pod 状态
bash
kubectl get pods -n ruoyi -o wide
所有 Pod 1/1 Running,且运行在 node01 节点即为正常。
阶段七:HPA 自动扩容配置
新建 hpa.yaml(以网关为例):
yaml
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: ruoyi-gateway-hpa
namespace: ruoyi
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: ruoyi-gateway
minReplicas: 2
maxReplicas: 5
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
执行:
bash
kubectl apply -f hpa.yaml

每个微服务对应创建一个 HPA。
验证:
bash
kubectl get hpa -n ruoyi
阶段八:Ingress 对外访问配置
新建 ruoyi-ingress.yaml:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ruoyi-ingress
namespace: ruoyi
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: ruoyi.test.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: ruoyi-ui-svc
port:
number: 80
- path: /prod-api
pathType: Prefix
backend:
service:
name: ruoyi-gateway-svc
port:
number: 8080
执行:
bash
kubectl apply -f ruoyi-ingress.yaml

本地访问配置
本地电脑 hosts 文件添加解析:
plaintext
10.8.0.12 ruoyi.test.com

浏览器访问 http://ruoyi.test.com 即可打开若依登录页面。

双节点环境专属注意事项
- 容器运行时是 Docker :无需配置 containerd 的 mirrors,修改
daemon.json的insecure-registries即可 - 调度规则:业务 Pod 默认都运行在 node01,master 节点因控制平面污点默认不运行业务
- 版本适配 :K8s v1.20 下 HPA 用
autoscaling/v2beta2,Ingress 用networking.k8s.io/v1,不要使用过高版本组件 - 端口冲突:Harbor 用 8088 端口,避免和 Ingress 的 80 端口冲突
- 数据持久化:MySQL、Redis 用 hostPath 挂载到 node01 本地磁盘,节点故障数据会丢失,生产环境建议使用共享存储