K8s 部署若依项目 + Harbor 私有仓库(双节点版)

主机名 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-authruoyi-systemruoyi-fileruoyi-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 即可打开若依登录页面。



双节点环境专属注意事项

  1. 容器运行时是 Docker :无需配置 containerd 的 mirrors,修改 daemon.jsoninsecure-registries 即可
  2. 调度规则:业务 Pod 默认都运行在 node01,master 节点因控制平面污点默认不运行业务
  3. 版本适配 :K8s v1.20 下 HPA 用 autoscaling/v2beta2,Ingress 用 networking.k8s.io/v1,不要使用过高版本组件
  4. 端口冲突:Harbor 用 8088 端口,避免和 Ingress 的 80 端口冲突
  5. 数据持久化:MySQL、Redis 用 hostPath 挂载到 node01 本地磁盘,节点故障数据会丢失,生产环境建议使用共享存储
相关推荐
convee_ai1 小时前
Agent 执行为什么需要独立 Sandbox:拆解 Hullwork 的 gVisor 隔离
架构·kubernetes
想要成为老金高手1 小时前
Kubernetes Service 深度实践:从 ClusterIP 到 Ingress 七层代理
云原生·容器·kubernetes
IT大白鼠2 小时前
Kubernetes 持久化存储:PV、PVC、StorageClass 存储体系
云原生·容器·kubernetes
青禾8372 小时前
Docker 从入门到实践:镜像、容器、数据卷与 Docker Compose
运维·docker·容器
GGG7662 小时前
K8s1.28 全栈落地|Jenkins+GitLab+Harbor DevOps 流水线封神实战
kubernetes·gitlab·jenkins
wdfk_prog3 小时前
Docker 开发环境到底要交付什么:镜像、源码与运行脚本
运维·docker·容器
一技安身3 小时前
【Docker】Docker 和 docker‑compose 的核心区别 + 为什么要单独装 compose
docker·容器·eureka
java_logo3 小时前
Docker 部署 SRS:轻松搭建实时音视频流媒体平台
docker·容器·webrtc·实时音视频·rtmp·http-flv·轩辕镜像
名字还没想好☜12 小时前
用 systemd 托管后台服务:Restart 策略、日志接管、资源限制与开机自启全踩一遍
运维·docker·kubernetes