使用自定义上下文 url 作为环境变量在 minkube 中启动 sprinboot

Mss*_*ssm 2 environment-variables contextpath spring-boot kubernetes minikube

我有一个 springboot 应用程序,我想将其部署在 Kubernetes 上(我使用的是 minikube),并使用从环境变量中获取的自定义上下文路径。

我编译了一个 app.war 文件。在Linux中导出环境变量如下:

export SERVER_SERVLET_CONTEXT_PATH=/app

然后在我的机器上启动我的应用程序,如下所示:

java -jar app.war --server.servlet.context-path=$(printenv CONTEXT_PATH)

它按预期工作,我可以使用 url localhost:8080/app/访问我的应用程序抛出浏览器

我想在 minikube 上实现同样的目标,所以我准备了这些配置文件:


  • Dockerfile:

    FROM openjdk:8
    ADD app.war app.war
    EXPOSE 8080
    ENTRYPOINT ["java", "-jar", "app.war", "--server.servlet.context-path=$(printenv CONTEXT_PATH)"]
    
    Run Code Online (Sandbox Code Playgroud)

  • 部署配置文件:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: esse-deployment-1
      labels:
        app: esse-1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: esse-1
      template:
        metadata:
          labels:
            app: esse-1
        spec:
          containers:
          - image: mysql:5.7
            name: esse-datasource
            ports:
            - containerPort: 3306
            env: 
            - name: MYSQL_ROOT_PASSWORD
              value: root 
          - image: esse-application
            name: esse-app
            imagePullPolicy: Never
            ports:
            - containerPort: 8080
            env:
            - name: server.servlet.context-path
              value: /esse-1
          volumes:
            - name: esse-1-mysql-persistent-storage
              persistentVolumeClaim:
                claimName: mysql-persistent-storage-claim
    
    ---
    
    apiVersion: v1
    kind: Service
    metadata:
      name: esse-service-1
      labels:
        app: esse-1
    spec:
      selector:
        app: esse-1
      ports:
        - protocol: TCP
          port: 8080
          targetPort: 8080
      type: NodePort
    
    Run Code Online (Sandbox Code Playgroud)

但是,pod 内的 java 容器无法启动,这是 spring 抛出的异常:

bean 初始化失败;嵌套异常是 java.lang.IllegalArgumentException: ContextPath 必须以 '/' 开头且不以 '/' 结尾

mch*_*wre 5

利用configmaps

configmap 将保存 springboot 应用程序的 application.properties。

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: esse-config
data:
  application-dev.properties: |
    spring.application.name=my-esse-service
    server.port=8080
    server.servlet.context-path=/esse-1
Run Code Online (Sandbox Code Playgroud)

注意:将覆盖 springboot 应用程序的上下文路径。 server.servlet.context-path=/esse-1

现在在您的部署 yaml 中引用此配置映射。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: esse-deployment-1
  labels:
    app: esse-1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: esse-1
  template:
    metadata:
      labels:
        app: esse-1
    spec:
      containers:
      - image: mysql:5.7
        name: esse-datasource
        ports:
        - containerPort: 3306
        env: 
        - name: MYSQL_ROOT_PASSWORD
          value: root 
      - image: esse-application
        name: esse-app
        imagePullPolicy: Never
        command: [ "java", "-jar", "app.war", "--spring.config.additional-location=/config/application-dev.properties" ]
        ports:
        - containerPort: 8080
        volumeMounts:
        - name: esse-application-config
          mountPath: "/config"
          readOnly: true
      volumes:
      - name: esse-application-config
        configMap:
          name: esse-config
          items:
          - key: application-dev.properties
            path: application-dev.properties
      - name: esse-1-mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-persistent-storage-claim
Run Code Online (Sandbox Code Playgroud)

注意:这里我们将 configmap 安装在 springboot 应用程序容器的/config文件夹中。也--spring.config.additional-location=/config/application-dev.properties指向 application.properties 配置文件。

将来,如果您想添加任何新配置或更新现有配置的值,只需在 configmap 及其中进行更改即可kubectl apply。然后,为了反映这些新的配置更改,只需缩小和扩大部署即可。

希望这可以帮助。