知識庫 / DevOps RSS 訂閱

將 Spring Boot 應用程序部署到 OpenShift

DevOps,Spring
HongKong
6
01:36 PM · Dec 06 ,2025

1. 概述

在本教程中,我們將演示如何從“使用 Spring Boot 啓動一個簡單應用程序”教程中部署應用程序到 Openshift

在其中,我們將:

  • 安裝和配置 Openshift 開發工具。
  • 創建 Openshift 項目和 MySQL 部署。
  • 配置應用程序以針對 Spring Cloud Kubernetes 進行配置。
  • 使用 Fabric8 Maven 插件 創建和部署應用程序到容器中,並測試和擴展應用程序。

2. Openshift 配置

首先,我們需要安裝 Minishift,本地單節點 Openshift 集羣,以及 Openshift 客户端

在使用 Minishift 之前,我們需要為開發者用户配置權限:

minishift addons install --defaults
minishift addons enable admin-user
minishift start
oc adm policy --as system:admin add-cluster-role-to-user cluster-admin developer

現在,我們想使用 Openshift 控制枱創建 MySQL 服務。我們可以使用以下 URL 啓動瀏覽器:

minishift console

如果您尚未自動登錄,請使用 developer/developer

創建一個名為 baeldung-demo 的項目,然後從“目錄”創建 MySQL 數據庫服務。 提供 baeldung-db 作為數據庫服務,baeldung_db 作為 MySQL 數據庫名稱,並將其他值留為默認值。

現在我們擁有用於訪問數據庫的服務和密鑰。 請注意數據庫連接 URL:mysql://baeldung-db:3306/baeldung_db

我們還需要允許應用程序讀取配置,例如 Kubernetes Secrets 和 ConfigMaps:

oc create rolebinding default-view --clusterrole=view \
  --serviceaccount=baeldung-demo:default --namespace=baeldung-demo

3. Spring Cloud Kubernetes 依賴項

我們將使用 Spring Cloud Kubernetes 項目,以啓用 Kubernetes 的雲原生 API,這些 API 支撐了 Openshift:

<profile>
  <id>openshift</id>
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-kubernetes-dependencies</artifactId>
        <version>0.3.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2023.0.0</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
  
  <dependencies>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  </dependencies>
</profile>

我們將使用 Fabric8 Maven 插件 來構建和部署容器:

<plugin>
    <groupId>io.fabric8</groupId>
    <artifactId>fabric8-maven-plugin</artifactId>
    <version>3.5.37</version>
    <executions>
      <execution>
        <id>fmp</id>
        <goals>
          <goal>resource</goal>
          <goal>build</goal>
        </goals>
      </execution>
    </executions>
</plugin>

4. 應用配置

現在我們需要提供配置,以確保正確的 Spring 配置文件和 Kubernetes 密鑰作為環境變量注入

讓我們在 src/main/fabric8 中創建一個 YAML 片段,以便 Fabric8 Maven 插件在創建部署配置時使用它

我們還需要添加一個 Spring Boot Actuator 部分,因為 Fabric8 的默認配置仍然嘗試訪問 /health 而不是 /actuator/health

spec:
  template:
    spec:
      containers:
      - env:
        - name: SPRING_PROFILES_ACTIVE
          value: mysql
        - name: SPRING_DATASOURCE_USER
          valueFrom:
            secretKeyRef:
              name: baeldung-db
              key: database-user
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: baeldung-db
              key: database-password
        livenessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 180
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30

接下來,我們將保存一個 ConfigMapopenshift/configmap.yml 中,其中包含應用程序的 application.properties 的數據,以及 MySQL URL:

apiVersion: v1
kind: ConfigMap
metadata:
  name: spring-boot-bootstrap
data:
  application.properties: |-
    spring.datasource.url=jdbc:mysql://baeldung-db:3306/baeldung_db

在通過命令行客户端與Openshift交互之前,我們需要先登錄。在Web控制枱右上角,有一個用户圖標,從中我們可以選擇“複製登錄命令”的下拉菜單。然後,在shell中使用:

oc login https://192.168.42.122:8443 --token=<some-token>

讓我們確保我們正在使用正確的項目:

oc project baeldung-demo

然後,我們上傳 ConfigMap

oc create -f openshift/configmap.yml

5. 部署

在部署過程中,Fabric8 Maven插件會嘗試確定配置的端口。我們示例應用程序中的現有 application.properties 文件使用表達式定義端口,該插件無法解析。因此,我們需要註釋該行:

#server.port=${port:8080}

從當前的 application.properties 中獲取。

我們現在已準備好部署:

mvn clean fabric8:deploy -P openshift

我們可以在部署進度到我們看到應用程序運行時進行觀察:

oc get pods -w

應提供一個列表:

NAME                            READY     STATUS    RESTARTS   AGE
baeldung-db-1-9m2cr             1/1       Running   1           1h
spring-boot-bootstrap-1-x6wj5   1/1       Running   0          46s

在測試應用程序之前,我們需要確定路由:

oc get routes

將打印當前項目的路線:

NAME                    HOST/PORT                                                   PATH      SERVICES                PORT      TERMINATION   WILDCARD
spring-boot-bootstrap   spring-boot-bootstrap-baeldung-demo.192.168.42.122.nip.io             spring-boot-bootstrap   8080                    None

現在,讓我們通過添加一本書來驗證我們的應用程序是否正常工作:

http POST http://spring-boot-bootstrap-baeldung-demo.192.168.42.122.nip.io/api/books \
  title="The Player of Games" author="Iain M. Banks"

預期輸出如下:

HTTP/1.1 201 
{
    "author": "Iain M. Banks",
    "id": 1,
    "title": "The Player of Games"
}

6. 擴展應用程序

讓我們擴展部署以運行 2 個實例:

oc scale --replicas=2 dc spring-boot-bootstrap

我們可以使用之前相同的步驟來監控部署過程,獲取路由信息,並測試端點。

OpenShift 提供廣泛的選項,用於管理和擴展性能,這些選項超出了本文檔的範圍:https://docs.openshift.com/container-platform/3.11/scaling_performance/index.html

7. 結論

在本教程中,我們:

  • 安裝並配置了 Openshift 開發工具和本地環境
  • 部署了一個 MySQL 服務
  • 創建了一個 ConfigMap 和 Deployment 配置,以提供數據庫連接屬性
  • 構建並部署了一個用於我們配置的 Spring Boot 應用程序的容器,以及
  • 測試和擴展了該應用程序。

欲瞭解更多詳細信息,請參閲 Openshift 詳細文檔

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.