yinxin
作者yinxin·2019-10-31 16:56
项目经理·某金融机构

在OpenShift上部署Java应用程序的快速指南

字数 5449阅读 5279评论 0赞 0

在本文中,我将向您展示如何在OpenShift( Minishift )上部署应用程序,将它们与其中暴露的其他服务连接起来,还是使用由OpenShift提供的其他一些有趣的部署功能。OpenShift构建在Docker容器和Kubernetes容器集群协调器之上。

运行Minishift

我们使用Minishift在本地机器上运行单节点OpenShift集群。安装MiniShift之前的唯一要求是安装虚拟化工具。我使用Oracle VirtualBox作为管理程序,所以我应该将 --vm-driver参数设置 为virtualbox 在我的运行命令中。

$ minishift start --vm -driver = virtualbox --memory = 3G

运行Docker

事实证明,您可以轻松地重用由Minishift管理的Docker守护进程,以便直接从命令行运行Docker命令而无需任何额外的安装。要实现这一点,只需在启动Minishift后运行以下命令。

@FOR / f “tokens = * delims = ^ L”%i IN('minishift docker-env')DO @call%i

运行OpenShift CLI

在开始Minishift任何实践练习之前,需要使用的最后一个工具是CLI。它在命令下可用oc。要在命令行上启用它,请运行以下命令:

$ minishift oc-env

$ SET PATH = C:\ Users \ minkowp \ .minishift \ cache \ oc \ v 3 .9.0 \ windows;%PATH%

$ REM @FOR / f “tokens = *”%i IN('minishift oc-env')DO @call%i

或者,您可以使用端口 8443 下提供的OpenShift Web控制台。在我的Windows机器上,默认情况下,它是在地址 192.168.99.100 下启动的。

构建示例应用程序的Docker镜像

我准备了用于呈现OpenShift部署过程的两个示例应用程序。这些简单的Java和Vert.x应用程序提供了一个HTTP API并将数据存储在MongoDB中。我们需要用这些应用程序构建Docker镜像。源代码在分支openshift的GitHub上可用。这里有一个示例Dockerfile 。account-vertx-service

FROM openjdk:8-jre-alpine

ENV VERTICLE_FILE account-vertx-service-1.0-SNAPSHOT.jar

ENV VERTICLE_HOME / usr / verticles

ENV DATABASE_USER mongo

ENV DATABASE_PASSWORD mongo

ENV DATABASE_NAME db

EXPOSE 8095

COPY target / $ VERTICLE_FILE $ VERTICLE_HOME /

WORKDIR $ VERTICLE_HOME

入口点[“sh”,“-c”]

CMD [“exec java -jar $ VERTICLE_FILE”]

转到 account-vertx-service目录并运行以下命令以从上面可见的Dockerfile构建一个映像。

$ docker build -t piomin / account-vertx-service。

应执行相同的步骤customer-vertx-service。之后,您将创建两个图像,两个图像都是相同的版本latest,现在可以在Minishift上进行部署和运行。

准备OpenShift部署描述符

在使用OpenShift时,我们应用程序部署的第一步是创建一个YAML配置文件。该文件包含有关部署的基本信息,例如用于运行应用程序 (1) 的容器,扩展 (2) ,响应事件驱动自动部署的触发器 (3) ,或者在平台上部署Pod的策略 (4) 。

kind: "DeploymentConfig"

apiVersion: "v1"

metadata:

name: "account-service"

spec:

template:

metadata:

labels:

name: "account-service"

spec:

containers: # (1)

  • name: "account-vertx-service"

image: "piomin/account-vertx-service:latest"

ports:

  • containerPort: 8095

protocol: "TCP"

replicas: 1 # (2)

triggers: # (3)

  • type: "ConfigChange"
  • type: "ImageChange"

imageChangeParams:

automatic: true

containerNames:

  • "account-vertx-service"

from:

kind: "ImageStreamTag"

name: "account-vertx-service:latest"

strategy: # (4)

type: "Rolling"

paused: false

revisionHistoryLimit: 2

部署配置可以oc像使用其他资源一样使用该命令进行管理。您可以使用该 oc apply命令创建新配置或更新现有配置 。

$ oc apply -f account-deployment.yaml

你可能会有点惊讶,但这个命令不会触发任何构建,也不会启动这个窗格。实际上,您只创建了deploymentConfig描述部署过程的类型资源。您可以使用其他一些oc命令来启动此过程,但首先,让我们仔细查看应用程序所需的资源。

注入环境变量

正如我之前提到的,我们的示例应用程序使用外部数据源。他们需要打开与现有MongoDB实例的连接,以便存储使用应用程序公开的HTTP端点传递的数据。这里是我们的 MongoVerticle类,它负责与MongoDB建立客户端连接。它使用环境变量来设置安全证书和数据库名称。

publicclassMongoVerticleextendsAbstractVerticle {

@Override

publicvoidstart() throwsException {

ConfigStoreOptionsenvStore=newConfigStoreOptions()

.setType("env")

.setConfig(newJsonObject().put("keys", newJsonArray().add("DATABASE_USER").add("DATABASE_PASSWORD").add("DATABASE_NAME")));

ConfigRetrieverOptionsoptions=newConfigRetrieverOptions().addStore(envStore);

ConfigRetrieverretriever=ConfigRetriever.create(vertx, options);

retriever.getConfig(r-> {

Stringuser=r.result().getString("DATABASE_USER");

Stringpassword=r.result().getString("DATABASE_PASSWORD");

Stringdb=r.result().getString("DATABASE_NAME");

JsonObjectconfig=newJsonObject();

config.put("connection_string", "mongodb://"+user+":"+password+"@mongodb/"+db);

finalMongoClientclient=MongoClient.createShared(vertx, config);

finalAccountRepositoryservice=newAccountRepositoryImpl(client);

ProxyHelper.registerService(AccountRepository.class, vertx, service, "account-service");

});

}

}

MongoDB在OpenShift预定义的Docker镜像目录中提供。只需单击 “目录” 选项卡中的 “MongoDB” 图标,即可轻松将其部署到Minishift实例上 。如果您在部署设置期间未提供您的用户名和密码,它们将自动生成。所有属性都可用作部署环境变量,并存储为,其中是部署的名称。

secrets/mongodbmongodb

使用该oc set命令可以将环境变量轻松注入到其他任何部署中 ,因此,在执行部署过程后将它们注入到容器中。以下命令将分配给mongodb部署的所有秘密注入到 示例应用程序部署的配置中。

$ oc set env --from = secrets / mongodb dc / account-service

将Docker映像导入OpenShift

部署配置已准备就绪。所以,理论上我们可以开始部署过程。但是,让我们回到 步骤5中 部署描述符部分中定义的部署配置 。我们定义了两个触发器,这些触发器会导致创建新的复制控制器,从而导致部署新版本的pod。第一个配置更改触发器会在部署配置(ConfigChange)的pod模板中检测到更改时触发。

其中的第二个,图像更改触发器(ImageChange),将新版本的Docker镜像推送到存储库时触发。为了能够查看存储库中的图像是否已更改,我们必须定义并创建图像流。这样的图像流不包含任何图像数据,但呈现相关图像的单个虚拟视图,类似于图像存储库。在部署配置文件中,我们引用了图像流account-vertx-service,因此应该在图像流定义中提供相同的名称。反过来,在设置spec.dockerImageRepository字段时,我们为图像定Docker拉取规范。

apiVersion: "v1"

kind: "ImageStream"

metadata:

name: "account-vertx-service"

spec:

dockerImageRepository: "piomin/account-vertx-service"

最后,我们可以在OpenShift平台上创建资源。

$ oc apply -f account-image.yaml

运行部署

一旦准备好部署配置,并且Docker镜像已成功导入由OpenShift实例管理的存储库中,我们可以使用以下oc命令触发构建。

$ oc推出最新的dc /账户服务

$ oc推出最新的dc / customer-service

如果一切正常,则应该为已定义的部署启动新的豆荚。您可以使用OpenShift Web控制台轻松检查出来。

更新图像流

我们已经创建了两个与Docker存储库相关的图像流。以下是来自OpenShift Web控制台的屏幕,其中显示了可用图像流的列表。

为了能够将新版本的图像推送到OpenShift的内部Docker注册表中,我们应该首先docker login使用用户的身份验证令牌执行 针对此注册表的操作。要从OpenShift获取令牌,请使用该 oc whoami 命令,然后 docker login 使用该 -p 参数将其传递到您的命令 。

$ oc whoami -t

Sz9_TXJQ2nyl4fYogR6freb3b0DGlJ133DVZx7-vMFM

$ docker login -u developer -p Sz9_TXJQ2nyl4fYogR6freb3b0DGlJ133DVZx7-vMFM https://172.30.1.1:5000

现在,如果您在应用程序中执行任何更改并使用 latest标记重建Docker镜像,则 必须将该镜像推送到OpenShift上的图像流中。内部注册表的地址已由OpenShift自动生成,您可以在图像流的详细信息中查看它。对我来说,这是 172.30.1.1:5000 。

$ docker tag piomin / account-vertx-service 172 .30.1.1:5000 / sample-deployment / account-vertx-service:latest

$ docker push 172 .30.1.1:5000 / sample-deployment / account-vertx-service

在将新版Docker镜像推送到图像流后,应用程序的部署将自动启动。以下是来自OpenShift Web控制台的屏幕,其中显示了 帐户服务 部署的历史记录。

结论

我已经向您展示了在OpenShift平台上部署应用程序的步骤。基于连接到数据库的示例Java应用程序,我演示了如何为开发人员完全透明地向该应用程序的pod注入凭据。我还执行应用程序Docker镜像的更新,以显示如何在更改镜像时触发新部署。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广