将Spring Boot应用程序部署到OpenShift

2023/05/11

一、概述

在本教程中,我们将展示如何 使用 Spring Boot 教程将应用程序从Bootstrap a Simple Application部署到Openshift

作为其中的一部分,我们将:

2. 开班配置

首先,我们需要安装 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 ,为 MySQL 数据库名称提供 baeldung_db,并将其他值保留为默认值。

我们现在有一个服务和访问数据库的秘密。记下数据库连接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项目为支持 Openshift 的 Kubernetes 启用云原生 API:

<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>Greenwich.RELEASE</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 Profiles 和 Kubernetes Secrets 作为环境变量注入。

让我们在src/main/fabric8中创建一个 YAML 片段,以便 Fabric8 Maven 插件在创建部署配置时使用它。

我们还需要为 Spring Boot 执行器添加一个部分,因为 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

接下来,我们将在openshift/configmap.yml中保存一个ConfigMap,其中包含 带有 MySQL URL的application.properties的数据:

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 提供了广泛的选项来管理性能和扩展,超出了本文的范围。

七、总结

在本教程中,我们:

  • 安装并配置了 Openshift 开发工具和本地环境
  • 部署了一个MySQL服务
  • 创建了 ConfigMap 和 Deployment 配置以提供数据库连接属性
  • 为我们配置的 Spring Boot 应用程序构建并部署了一个容器,以及
  • 测试并扩展了应用程序。

有关更多详细信息,请查看详细的 Openshift 文档

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章