在本文中,我将向您展示如何在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)
image: "piomin/account-vertx-service:latest"
ports:
protocol: "TCP"
replicas: 1 # (2)
triggers: # (3)
imageChangeParams:
automatic: true
containerNames:
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 条评论