Py学习  »  NGINX

在K8s上通过KubeVela部署Nginx和Java服务并使用K8s多种资源

院长技术 • 7 月前 • 176 次点击  

加入技术交流群

图片

 

通俗理解KubeVela

KubeVela 是 简化 Kubernetes 应用部署的工具,不用写复杂的 Deployment、Service 等原生 YAML,而是用统一的「应用清单」描述服务、环境变量、配置、健康检查等需求,底层自动转换成 K8s 资源,小白也能快速上手。

部署 Nginx + Java 服务

以下是可直接验证的 KubeVela 应用清单(app.yaml),包含环境变量、健康探针、启动钩子、ConfigMap 所有需求,每部分附详细解释:

应用元信息:指定名称和命名空间

apiVersion: core.oam.dev/v1beta1
kind:
 Application
metadata:

  name:
 nginx-java-app
  namespace:
 default
spec:

  components:

    ###########################################################################

    # 1. Nginx 服务配置

    ###########################################################################

    -
 name: nginx-service
      type:
 webservice  # KubeVela 内置类型:长期运行的Web服务
      properties:

        # 基础配置

        image:
 nginx:1.25  # 镜像版本(稳定版,可直接使用)
        ports:

          -
 port: 80  # 容器端口
            expose:
 true  # 对外暴露端口(自动创建Service)
        
        # 环境变量(两种方式:直接指定 + 引用ConfigMap)

        env:

          -
 name: NGINX_ENV  # 直接定义的环境变量
            value:
 "production"
          -
 name: NGINX_CONF_PATH  # 引用ConfigMap的环境变量
            valueFrom:

              configMapKeyRef:

                name:
 app-config  # 关联下面的ConfigMap名称
                key:
 nginx.conf.path
        
        # 健康探针(存活探针 + 就绪探针)

        livenessProbe:
  # 存活探针:检测容器是否运行,失败则重启
          httpGet:

            path:
 /  # 访问Nginx根路径
            port:
 80
          initialDelaySeconds:
 10  # 容器启动10秒后开始探测
          periodSeconds:
 5  # 每5秒探测一次
        readinessProbe:
  # 就绪探针:检测容器是否就绪,就绪后才接收流量
          httpGet:

            path:
 /  # 访问Nginx根路径
            port:
 80
          initialDelaySeconds:
 5
          periodSeconds:
 3
        
        # 启动钩子(容器启动后执行的命令,比如修改Nginx配置)

        lifecycle:

          postStart:
  # 启动后钩子(容器启动成功后执行)
            exec:

              command:
 ["/bin/sh", "-c", "echo 'Welcome to Nginx' > /usr/share/nginx/html/index.html"]
        
        # 资源限制(可选,避免资源占用过高)

        resources:

          cpu:
 "100m"  # 最小100毫核
          memory:
 "128Mi"  # 最小128MB内存
          limits:

            cpu:
 "500m"
            memory:
 "256Mi"

    ###########################################################################

    # 2. Java 服务配置(以Spring Boot为例)

    ###########################################################################

    -
 name: java-service
      type:
 webservice
      properties:

        # 基础配置

        image:
 openjdk:17-jdk-slim  # Java 17基础镜像(适配大部分Spring Boot项目)
        command:
 ["java", "-jar", "/app/spring-boot-app.jar"]  # 启动命令(假设Jar包在/app目录)
        ports:

          -
 port: 8080
            expose:
 true
        
        # 环境变量(引用ConfigMap + 自定义变量)

        env:

          -
 name: SPRING_PROFILES_ACTIVE  # Spring环境配置
            value:
 "prod"
          -
 name: DB_URL  # 从ConfigMap读取数据库地址
            valueFrom:

              configMapKeyRef:

                name:
 app-config
                key:
 db.url
          -
 name: DB_USERNAME  # 敏感信息建议用Secret,这里演示ConfigMap
            valueFrom:

              configMapKeyRef:

                name:
 app-config
                key:
 db.username
        
        # 健康探针(Spring Boot默认健康检查端点/actuator/health)

        livenessProbe:

          httpGet:

            path:
 /actuator/health/liveness
            port:
 8080
          initialDelaySeconds:
 30  # Java服务启动慢,延长探测等待时间
          periodSeconds:
 10
        readinessProbe:

          httpGet:

            path:
 /actuator/health/readiness
            port:
 8080
          initialDelaySeconds:
 20
          periodSeconds:
 5
        
        # 启动钩子(启动前执行:创建/app目录 + 复制Jar包,实际场景可替换为挂载存储)

        lifecycle:

          preStart:
  # 启动前钩子(容器启动前执行)
            exec:

              command:
 ["/bin/sh", "-c", "mkdir -p /app && echo 'Jar包将挂载到/app目录' > /app/note.txt"]
        
        # 挂载ConfigMap(将配置文件直接挂载到容器目录)

        configs:

          -
 name: app-config  # 关联下面的ConfigMap
            mountPath:
 /app/config  # 挂载到容器的/app/config目录(Spring Boot默认读取配置目录)
        
        # 资源限制(Java服务内存需求较高,适当调高)

        resources:

          cpu:
 "200m"
          memory:
 "512Mi"
          limits:

            cpu:
 "1000m"
            memory:
 "1Gi"

    ###########################################################################

    # 3. 共享ConfigMap(存储两个服务的公共配置)

    ###########################################################################

  configs:

    -
 name: app-config  # ConfigMap名称,与上面的env/configs关联
      type:
 configmap
      properties:

        data:

          nginx.conf.path:
 "/etc/nginx/conf.d"  # Nginx配置文件路径
          db.url:
 "jdbc:mysql://mysql-service:3306/myapp"  # 数据库连接地址(假设mysql-service是数据库服务名)
          db.username:
 "app_user"  # 数据库用户名

部署与验证步骤

1. 前提条件

• 已安装 Kubernetes 集群(如 Minikube、Kind)
• 已安装 KubeVela CLI(参考:https://kubevela.io/docs/installation/cli)

2. 部署应用

1. 应用清单(创建服务 + ConfigMap)
vela up -f app.yaml

2. 查看应用状态(确认是否运行正常)

vela status nginx-java-app -n default

3. 核心验证点(确保配置生效)

验证目标
执行命令
预期结果
查看服务是否运行
kubectl get pods
出现 nginx-service-xxx 和 java-service-xxx,状态为 Running
验证环境变量
kubectl exec nginx-service-xxx -- env | grep NGINX_
显示 Nginx 相关的环境变量配置
验证 ConfigMap 挂载
kubectl exec java-service-xxx -- ls /app/config
看到 ConfigMap 的配置文件(如 nginx.conf.path 等)
验证 Nginx 启动钩子
kubectl exec nginx-service-xxx -- cat /usr/share/nginx/html/index.html
输出 Welcome to Nginx
验证 Java 健康探针
kubectl describe pod java-service-xxx | grep Readiness
显示就绪探针的配置信息
访问 Nginx 服务
vela port-forward nginx-java-app 80:80
本地访问 http://localhost,看到 Welcome to Nginx
访问 Java 服务
vela port-forward nginx-java-app 8080:8080
本地访问 http://localhost:8080/actuator/health,返回 {"status": "UP"}


关键配置解释

  1. 1. 环境变量优先级:直接定义的 env.value > ConfigMap 引用,敏感信息(如密码)建议用 secret 类型(替换 configmap 即可)。
  2. 2. 健康探针参数:Java服务启动慢,initialDelaySeconds 需设为30+,避免误判重启;Nginx启动快,设为5-10秒即可。
  3. 3. 启动钩子:preStart 是容器启动前执行(如创建目录、下载文件),postStart 是启动后执行(如修改配置),命令需用绝对路径(如 /bin/sh)。
  4. 4. 端口暴露:expose: true 会自动创建 NodePort 类型的 Service,本地可通过 vela port-forward 访问,生产环境可替换为 LoadBalancer 类型。

扩展说明

• 如果Java服务有 Jar 包,可通过 volumes 挂载本地文件或云存储(如 S3、NFS),替换 preStart 钩子中的占位命令。
• 若需修改配置,直接编辑 app.yaml 后重新执行 vela up -f app.yaml,KubeVela 会自动更新服务。

 

🎉购书籍,做大牛🎉

院长书籍链接:

https://deanit.cn/DeanBooks/

图片

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/189718