大家对k8s动态多节点 动态扩缩容向往已久,实际上也是非常基础的一个构建需求。

笔者这里有个非常简单的Springboot项目(boonya-game-lab),如果要把他发布到k8s集群应该怎么做呢?使用Docker的都知道镜像,k8s按照自己的配置设置好镜像和副本数量就可以实现了。

现在我们分三步来管理我们的k8s服务。即:构建镜像、推送镜像、发布k8s集群服务。

如果能够科学上网,Windows就可以使用Docker Desktop 快速安排k8s环境。

构建镜像

需要编写Dockerfile来构建本地镜像

# 选择一个轻量级的Java基础镜像
FROM openjdk:17.0.1-jdk-slim
# 使用 RUN 命令创建目录
RUN mkdir -p /app
# 将打包好的jar包复制到镜像中,并重命名(方便引用)
COPY target/boonya-game-lab-0.0.1-SNAPSHOT.jar /app/app.jar
# 切换工作目录/app
WORKDIR /app
# 声明容器运行时暴露的端口(与你的SpringBoot应用端口一致)
EXPOSE 8080
# 设置容器启动时执行的命令
ENTRYPOINT ["java", "-jar", "app.jar"]

镜像构建完了之后还要做容器服务的启动校验:

docker run --name boonya-game-lab -p 8080:8080 docker.io/boonyadocker/boonya-game-lab:latest

启动成功访问首页:

推送镜像

推送镜像需要登录对应的Docker 仓库。

登录命令:

docker login docker.io

推送命令:

docker push docker.io/boonyadocker/boonya-game-lab:latest

验证仓库镜像:

也可以在Docker Desktop上看:

K8s部署脚本

编写deployment.yaml文件,注意要是配置了/actutor/health部分,需要加入相应的

apiVersion: apps/v1
kind: Deployment
metadata:
  name: boonya-game-lab
spec:
  replicas: 3 # 希望运行的Pod副本数
  selector:
    matchLabels:
      app: boonya-game-lab
  template:
    metadata:
      labels:
        app: boonya-game-lab
    spec:
      containers:
        - name: boonya-game-lab
          image: docker.io/boonyadocker/boonya-game-lab:latest # 替换为你的镜像地址
          ports:
            - containerPort: 8080 # 容器端口
          env: # 可选:设置环境变量
            - name: JAVA_OPTS
              value: "-Xmx512m"
          # 可以添加资源限制和健康检查
          resources:
            requests:
              memory: "512Mi"
              cpu: "250m"
            limits:
              memory: "1Gi"
              cpu: "500m"
          livenessProbe:
            httpGet:
              path: /actuator/health # 假设使用Spring Actuator的健康检查端点
              port: 8080
            initialDelaySeconds: 90 # 容器启动后多久开始探测
            periodSeconds: 10 # 执行探测的频率
          readinessProbe:
            httpGet:
              path: /actuator/health
              port: 8080
            initialDelaySeconds: 30
            periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: boonya-game-lab-service
spec:
  selector:
    app: boonya-game-lab
  ports:
    - protocol: TCP
      port: 80 # Service端口
      targetPort: 8080 # 容器端口
  # type: ClusterIP # 默认类型,集群内访问
  type: LoadBalancer # 如果希望从集群外部访问,可以使用LoadBalancer(云提供商通常支持)或NodePort

发布集群:

kubectl apply -f deployment.yaml

删除集群:

kubectl delete -f deployment.yaml

部署完成的效果:

集群访问方式

获取浏览器访问IP地址方式
kubectl get svc boonya-game-lab-service
或
kubectl get svc boonya-game-lab-service -w
  1. 在浏览器中访问
    打开浏览器,直接访问第 3 步中获取到的 EXTERNAL-IP

    http://123.456.789.101

    (请将 123.456.789.101 替换为你实际获取到的 IP 地址)

      重要提示

  • 如果你的 Kubernetes 集群运行在本地环境(如 Minikube, Docker Desktop, Kind),它们无法提供云厂商那样的外部负载均衡器。此时 EXTERNAL-IP 会一直显示为 <pending>

    • 对于 Minikube:你需要使用 minikube service 命令来访问:

      minikube service boonya-game-lab-service

      这条命令会自动打开浏览器并导航到正确的地址。

    • 对于 Docker Desktop:它可以直接使用 localhost 或 127.0.0.1 访问。kubectl get svc 显示的端口(例如 80:32123/TCP 中的 32123)就是 NodePort。访问地址为:

      http://localhost:32123

如果访问不通大概率是启动Pod失败,查看命令:

kubectl get pods

查看READY状态是1/1 还是0/1 ,后者表示启动未成功,探测失败。

对于没有设置访问Service type的情况 有以下几种选择:

  1. 立即测试:使用 方法一(kubectl port-forward),这是最快的方式:

    bash

    kubectl port-forward svc/boonya-game-lab-service 8080:80

    然后访问 http://localhost:8080

  2. 长期使用:使用 方法二(修改为 NodePort),编辑 Service 配置:

    bash

    kubectl edit svc boonya-game-lab-service

    将 type: ClusterIP 改为 type: NodePort,然后使用分配的端口访问。

  3. 生产环境:考虑使用 Ingress,但这在本地开发环境中配置相对复杂。

记住,在 Docker Desktop 环境中,localhost 就是你的 Kubernetes 节点地址,所以不需要查找节点 IP,直接使用 localhost 加上端口号即可访问。

接下来我们用NodePort模式重新发布集群:

Kuboard可视化

kuboard是k8s常用的可视化工具之一。

数据库支持: Mysql/MariaDB /OpenGauss 

https://github.com/eip-work/kuboard-press

https://kuboard.cn/v4/install/#%E8%87%B4-kuboard-v3-%E7%94%A8%E6%88%B7

导入集群:

注:这里实际上是可以通过配置导入的方式来管理集群。后面再补充怎么操作

开源项目分享

按照上面的步骤你也可以实现k8s的集群快速发布

https://github.com/boonyachengdu/boonya-game-lab/tree/master

最新发布情况

最近对该项目做了规划,boonya-game-lab太狭隘了,已更名metaforge 元构工坊。

 元构工坊 (MetaForge) 作为新品牌名称,原因如下:

  1. 完全原创:彻底避免抄袭质疑

  2. 深度寓意:"元构"体现架构本质,有哲学深度

  3. 专业形象:适合架构师个人品牌和技术影响力建设

  4. 扩展性强:可涵盖从游戏到企业级架构的完整技术栈

  5. 国际化:MetaForge在英文语境中也有良好含义

这是设计这款开源的初衷。

目前k8s方面的已移入对应的meta-k8s模块,前端效果也进行了美化。

项目结构还在调整中:

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐