OpenShift是企业级容器平台,在OpenShift的应用必须是容器(Container)形态运行的,因此可以说部署应用就是部署应用容器。我们知道所有运行的容器都是来自镜像(Image),从OpenShift的角度看镜像分为两类:即基础镜像(Base Image,也叫Builder Image。它只包括运行应用所需的基础环境,例如Tomcat镜像中只包括一个标准的Tomcat环境)和应用镜像(App Image - 包括了应用包和所有依赖的运行环境)。两者的关系大致是“基础镜像 + 应用包 + 应用依赖包 = 应用镜像”,其中“应用包”又进一步是由“应用代码”通过编译、打包而生成的结果,而“应用依赖包”指的是应用运行所依赖的文件,例如一个Spring Boot应用运行所依赖各种JAR包。
根据应用资源当前的形态,在OpenShift上主要有几种部署应用的方式:
部署应用镜像:直接部署最终的应用镜像。此过程适合用在生产环境,因为此时的应用镜像已是经过全面测试验证的,该镜像中包括可应用所需要的所有资源。由于部署过程中不会再动态下载任何应用依赖包,因此可直接在离线环境中部署,部署后可直接运行。
部署应用代码:OpenShift提供了一种称为Source 2 Image(S2I)工具,利用它可以直接以应用代码为源部署应用。在此过程中S2I会自动下载应用所需依赖包,然后编译并打包应用,最后将应用包、应用依赖包和基础镜像打包成应用镜像,这样就可以在OpenShift运行该应用镜像了。
由于可以将应用代码自动经过一系列过程变为可运行的应用镜像,因此此过程非常适合用在应用开发测试阶段。尤其是配合开发工具,可以将应用代码部署到OpenShift上进行测试。
部署应用包:类似部署方式2,只不过S2I工具是从应用包开始部署过程的。
部署Dockerfile资源:OpenShift会先根据Dockerfile定义构建应用容器镜像,然后再将生成的容器镜像推送到内部的Image Registry,OpenShift然后再部署该镜像。
下面我们分别介绍上述部署应用的操作过程。
$ oc login OCP_API_URL -u USER-ID -p USER-PW
$ oc get pod
NAME READY STATUS RESTARTS AGE
parksmap-1-2w9mf 1/1 Running 0 4h10m
parksmap-1-deploy 0/1 Completed 0 4h10m
parksmap-1-ph8j2 1/1 Running 0 178m
$ oc get build
NAME TYPE FROM STATUS STARTED DURATION
cakephp-ex-git-1 Source Git@133cb8b Complete 3 hours ago 1m45s
$ oc logs -f build/cakephp-ex-git-1
Cloning "https://github.com/sclorg/cakephp-ex.git" ...
Commit: 133cb8b0b9a79944b1620acf17fe9f07825e0b68 (Get rid off EOL php version)
Author: Petr "Stone" Hracek <[email protected]>
Date: Thu Jan 2 09:48:33 2020 +0100
Caching blobs under "/var/cache/blobs".
Getting image source signatures
Copying blob sha256:1cd26fbb2b2181a18c41ece85dff8b293e399e50dc3abe227b1940450bf6298b
Copying blob sha256:4fbc3bafa3d4400bb97a733c1fe12f2f99bf38b9d5b913d5034f29798739654d
Copying blob sha256:707235ac60367dff674607b0be2e18a83daea6dc2c8fb7330dbf7de29baf094b
Copying blob sha256:0453406be68523ccc82999f84fffc57af64e00d9be0b75169c642c952b9bf7bc
...
...
######以下省略N行
...
...
Pushing image image-registry.openshift-image-registry.svc:5000/user1-cakephp/cakephp-ex-git:latest ...
Getting image source signatures
Copying blob sha256:5fc6b6797fe6bcbd34f4ea77d1d4b4918e49a68d51fa3c2340a7c98837368661
Copying blob sha256:0453406be68523ccc82999f84fffc57af64e00d9be0b75169c642c952b9bf7bc
Copying blob sha256:4fbc3bafa3d4400bb97a733c1fe12f2f99bf38b9d5b913d5034f29798739654d
Copying blob sha256:1cd26fbb2b2181a18c41ece85dff8b293e399e50dc3abe227b1940450bf6298b
Copying blob sha256:707235ac60367dff674607b0be2e18a83daea6dc2c8fb7330dbf7de29baf094b
Copying blob sha256:34971b2d1eb98e410c2802e6bb3a7f499f9c5bff1b870ed329089ecdb21cf856
Copying config sha256:b77051c0a30366462c246e26211394487bb638f0c3648aacaaca553824c056dc
Writing manifest to image destination
Storing signatures
Successfully pushed image-registry.openshift-image-registry.svc:5000/user1-parksmap/cakephp-ex-git@sha256:a90e60a420a64b30c6382cb3e7685e1023a3242311745a9e38679c742b4ea9df
Push successful
$ oc get pod
NAME READY STATUS RESTARTS AGE
cakephp-ex-git-1-build 0/1 Completed 0 144m
cakephp-ex-git-1-deploy 0/1 Completed 0 142m
cakephp-ex-git-1-nvmzz 1/1 Running 0 142m
$ oc get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
cakephp-ex-git cakephp-ex-git-user1-parksmap.apps.cluster-beijing-c70a.beijing-c70a.example.opentlc.com cakephp-ex-git 8080-tcp None
$ oc new-project USER-ID-mywar
直接部署在GitHub上的ROOT.war,然后查看Build日志。注意:在Build日志中可以看到将ROOT.war复制到相关目录中,然后生成App Image并推送到OpenShift内部的Registry上。
$ oc new-app --name=mywar jboss-webserver31-tomcat8-openshift:1.2~https://github.com/liuxiaoyu-git/tomcat-war
$ oc logs -f bc/mywar
。。。
STEP 8: RUN /usr/local/s2i/assemble
Copying all war artifacts from /tmp/src directory into /opt/webserver/webapps for later deployment...
'/tmp/src/ROOT.war' -> '/opt/webserver/webapps/ROOT.war'
Copying all war artifacts from /tmp/src/deployments directory into /opt/webserver/webapps for later deployment
。。。$ oc expose svc/mywar
先将ROOT.war文件下载到本地,然后在指定Builder Image(jboss-webserver31-tomcat8-openshift:1.2)创建应用,最后再根据ROOT.war开始构建App Image。注意:在Build日志中可以看到将ROOT.war复制到相关目录中,然后生成App Image并推送到OpenShift内部的Registry上。
$ curl -LO https://raw.githubusercontent.com/liuxiaoyu-git/tomcat-war/master/ROOT.war
$ oc new-app --name=mywar jboss-webserver31-tomcat8-openshift:1.2~.
$ oc start-build mywar --from-file=ROOT.war
$ oc logs -f bc/mywar
。。。
STEP 8: RUN /usr/local/s2i/assemble
Copying all war artifacts from /tmp/src directory into /opt/webserver/webapps for later deployment...
'/tmp/src/ROOT.war' -> '/opt/webserver/webapps/ROOT.war'
Copying all war artifacts from /tmp/src/deployments directory into /opt/webserver/webapps for later deployment
。。。
$ oc expose svc mywar
$ oc get route mywar
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
mywar mywar-mywar.apps.cluster-beijing-c70a.beijing-c70a.example.opentlc.com mywar 8080-tcp edge None
OpenShift可以直接部署Dockerfile资源,其实OpenShift后台需要先根据Dockerfile构建镜像,然后再部署该镜像。
$ oc new-project USER-ID-dockerfile
$ curl https://raw.githubusercontent.com/liuxiaoyu-git/openshift-dockerfile-example/master/Dockerfile
FROM bash:latest
CMD ["bash", "-c", "while true; do sleep 3; echo 'Sleep.'; done"]
$ oc new-app --name sleep https://github.com/liuxiaoyu-git/openshift-dockerfile-example.git
$ oc logs -f bc/sleep
$ oc get pod -w
NAME READY STATUS RESTARTS AGE
sleep-1-build 0/1 Completed 0 62s
sleep-1-deploy 0/1 Completed 0 30s
sleep-1-qpt5z 1/1 Running 0 16s
$ oc logs pod/sleep-1-qpt5z
Sleep
Sleep
...
Sleep