第 3 章 创建应用程序
3.1. 使用模板 复制链接链接已复制到粘贴板!
下面章节介绍模板概述以及模板的创建和使用方法。
3.1.1. 了解模板 复制链接链接已复制到粘贴板!
模板描述了一组可参数化和处理的对象,用于生成对象列表,供 OpenShift Container Platform 用于创建。可对模板进行处理,以创建您有权在项目中创建的任何内容,如服务、构建配置和部署配置。模板还可定义一系列标签(label),以应用到该模板中定义的每个对象。
您可以使用 CLI 从模板创建对象列表,或者如果模板已上传至项目或全局模板库,则可使用 web 控制台来创建。
3.1.2. 上传模板 复制链接链接已复制到粘贴板!
如果您有定义模板的 JSON 或 YAML 文件,您可以使用 CLI 将模板上传到项目。此操作将模板保存到项目,供任何有适当权限访问该项目的用户重复使用。本主题后面会提供有关编写自己的模板的说明。
流程
使用以下方法之一上传模板:
将模板上传到当前项目的模板库,并使用以下命令传递 JSON 或 YAML 文件:
oc create -f <filename>
$ oc create -f <filename>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
-n选项与项目名称将模板上传到不同项目:oc create -f <filename> -n <project>
$ oc create -f <filename> -n <project>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
现在可使用 web 控制台或 CLI 选择该模板。
3.1.3. 使用 web 控制台创建应用程序 复制链接链接已复制到粘贴板!
您可使用 web 控制台从模板创建应用程序。
流程
- 进入到您的项目并点 +Add
- 点 Developer Catalog 标题中的 All services。
点 Type 下的 Builder Images 以查看可用的构建器镜像。
注意只有其注解中列出
builder标签的 imagestreamtag 才会出现在此列表中,如下所示:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 此处包含
builder可确保该镜像流标签作为构建程序出现在 web 控制台中。
- 修改新应用程序屏幕中的设置,以配置对象来支持您的应用程序。
3.1.4. 使用 CLI 从模板创建对象 复制链接链接已复制到粘贴板!
您可以使用 CLI 来处理模板,并使用所生成的配置来创建对象。
3.1.4.1. 添加标签 复制链接链接已复制到粘贴板!
标签 (label) 用于管理和组织所生成的对象,如 pod。模板中指定的标签应用于从模板生成的每个对象。
流程
从以下命令行在模板中添加标签:
oc process -f <filename> -l name=otherLabel
$ oc process -f <filename> -l name=otherLabelCopy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.4.2. 列出参数 复制链接链接已复制到粘贴板!
模板的 parameter 部分列出了可覆盖的参数列表。
流程
您可使用以下命令并指定要用的文件通过 CLI 列出参数:
oc process --parameters -f <filename>
$ oc process --parameters -f <filename>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,如果模板已上传:
oc process --parameters -n <project> <template_name>
$ oc process --parameters -n <project> <template_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 例如,下面显示了在默认
openshift项目中列出其中一个快速启动模板的参数时的输出:oc process --parameters -n openshift rails-postgresql-example
$ oc process --parameters -n openshift rails-postgresql-exampleCopy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 该输出标识了在处理模板时使用类似正则表达式的生成器生成的几个参数。
3.1.4.3. 生成对象列表 复制链接链接已复制到粘贴板!
您可以使用 CLI 来处理定义模板的文件,以便将对象列表返回到标准输出。
流程
处理定义模板的文件进以将对象列表返回到标准输出:
oc process -f <filename>
$ oc process -f <filename>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,如果模板已上传到当前项目:
oc process <template_name>
$ oc process <template_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过处理模板并将输出传送至
oc create来从模板创建对象:oc process -f <filename> | oc create -f -
$ oc process -f <filename> | oc create -f -Copy to Clipboard Copied! Toggle word wrap Toggle overflow 或者,如果模板已上传到当前项目:
oc process <template> | oc create -f -
$ oc process <template> | oc create -f -Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以为每个要覆盖的
<name>=<value>对添加-p选项,以覆盖文件中定义的任何参数值。参数引用可能会出现在模板项目内的任何文本字段中。例如,在以下部分中,模板的
POSTGRESQL_USER和POSTGRESQL_DATABASE参数被覆盖,以输出带有自定义环境变量的配置:从模板创建对象列表
oc process -f my-rails-postgresql \ -p POSTGRESQL_USER=bob \ -p POSTGRESQL_DATABASE=mydatabase$ oc process -f my-rails-postgresql \ -p POSTGRESQL_USER=bob \ -p POSTGRESQL_DATABASE=mydatabaseCopy to Clipboard Copied! Toggle word wrap Toggle overflow JSON 文件可重定向到文件,也可直接应用,而无需通过将已处理的输出传送到
oc create命令来上传模板:oc process -f my-rails-postgresql \ -p POSTGRESQL_USER=bob \ -p POSTGRESQL_DATABASE=mydatabase \ | oc create -f -$ oc process -f my-rails-postgresql \ -p POSTGRESQL_USER=bob \ -p POSTGRESQL_DATABASE=mydatabase \ | oc create -f -Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如有大量参数,可将其保存到文件中,然后将此文件传递到
oc process:cat postgres.env POSTGRESQL_USER=bob POSTGRESQL_DATABASE=mydatabase
$ cat postgres.env POSTGRESQL_USER=bob POSTGRESQL_DATABASE=mydatabaseCopy to Clipboard Copied! Toggle word wrap Toggle overflow oc process -f my-rails-postgresql --param-file=postgres.env
$ oc process -f my-rails-postgresql --param-file=postgres.envCopy to Clipboard Copied! Toggle word wrap Toggle overflow 此外,您还可使用
"-"作为--param-file的参数,从标准输入中读取环境:sed s/bob/alice/ postgres.env | oc process -f my-rails-postgresql --param-file=-
$ sed s/bob/alice/ postgres.env | oc process -f my-rails-postgresql --param-file=-Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.5. 修改所上传的模板 复制链接链接已复制到粘贴板!
您可编辑已上传至项目中的模板。
流程
修改已上传的模板:
oc edit template <template>
$ oc edit template <template>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
3.1.6. 使用即时应用程序和快速启动模板 复制链接链接已复制到粘贴板!
OpenShift Container Platform 提供了很多默认的即时应用程序和快速启动模板,以便您轻松开始为不同语言创建新应用程序。提供了适用于 Rails (Ruby)、Django (Python)、Node.js、CakePHP (PHP) 和 Dancer (Perl) 的模板。您的集群管理员必须在默认的全局 openshift 项目中创建这些模板,以便您访问。
默认情况下,模板会使用 GitHub 上包含必要应用程序代码的公共源存储库进行构建。
流程
您可以通过以下命令列出可用的默认即时应用程序和快速启动模板:
oc get templates -n openshift
$ oc get templates -n openshiftCopy to Clipboard Copied! Toggle word wrap Toggle overflow 要修改源并构建您自己的应用程序版本:
-
对模板默认的
SOURCE_REPOSITORY_URL参数引用的存储库进行分叉。 在从模板创建时,覆盖
SOURCE_REPOSITORY_URL参数的值,从而指定您的分叉而非默认值。这样,模板创建的构建配置将指向应用程序代码的分叉,您可随意修改代码和重新构建应用程序。
-
对模板默认的
某些 Instant App 和 Quickstart 模板会定义一个数据库部署配置。它们定义的配置对数据库内容使用临时存储。这些模板仅限于演示目的,因为如果数据库 pod 因任何原因重启,所有数据库数据都将丢失。
3.1.6.1. 快速启动模板 复制链接链接已复制到粘贴板!
快速启动模板是 OpenShift Container Platform 上运行的应用程序的基本示例。Quickstarts 提供多种语言和框架,并在模板中定义,模板由一组服务、构建配置和部署配置组成。该模板引用了构建和部署应用程序所需的镜像和源存储库。
要探索快速启动,请从模板创建应用程序。您的管理员必须已在 OpenShift Container Platform 集群中安装了这些模板,在这种情况下,您只需从 web 控制台中选择即可。
快速开始引用包含应用源代码的源存储库。要自定义 Quickstart,请分叉存储库,并在从模板创建应用程序时,用分叉的存储库替换默认的源存储库名称。这将导致使用您的源代码而非所提供的示例源来执行构建。然后,您可以更新源存储库中的代码,并启动新的构建来查看反映在所部署的应用程序中的更改。
3.1.6.1.1. Web 框架快速启动模板 复制链接链接已复制到粘贴板!
这些快速启动模板提供了指定框架和语言的基本应用程序:
- Cakephp:包含 MySQL 数据库的 PHP web 框架
- Dancer:包含 MySQL 数据库的 Perl Web 框架
- Django:包含 PostgreSQL 数据库的 Python web 框架
- NodeJS:包含 MongoDB 数据库的 NodeJS web 应用程序
- Rails:Ruby web 框架(包括 PostgreSQL 数据库)
3.1.7. 编写模板 复制链接链接已复制到粘贴板!
您可以定义新模板,以便轻松重新创建应用程序的所有对象。该模板将定义由其创建的对象以及一些元数据,以指导创建这些对象。
以下是简单模板对象定义 (YAML) 的示例:
3.1.7.1. 编写模板描述 复制链接链接已复制到粘贴板!
模板描述向用户介绍模板的作用,有助于用户在 web 控制台中搜索查找模板。除模板名称以外的其他元数据均为可选,但若有则会非常有用。除常规描述性信息外,元数据还应包含一组标签。实用标签包括与模板相关的语言名称,如 Java、PHP、Ruby 等。
以下是模板描述性元数据的示例:
- 1
- 模板的唯一名称。
- 2
- 可由用户界面使用的简单、用户友好型名称。
- 3
- 模板的描述。包含充足的详细信息,方便用户了解所部署的内容以及部署前须知的注意事项。还应提供其他信息链接,如 README 文件。可包括换行符来创建段落。
- 4
- 其他模板描述。例如,这可按照服务目录显示。
- 5
- 要与模板关联的标签,用于搜索和分组。添加将包含在其中一个提供的目录类别中的标签。请参见控制台常量文件中
CATALOG_CATEGORIES中的id和categoryAliases。此外,还可为整个集群自定义类别。 - 6
- 在 web 控制台中与模板一同显示的图标。
例 3.1. 可用图标
-
icon-3scale -
icon-aerogear -
icon-amq -
icon-angularjs -
icon-ansible -
icon-apache -
icon-beaker -
icon-camel -
icon-capedwarf -
icon-cassandra -
icon-catalog-icon -
icon-clojure -
icon-codeigniter -
icon-cordova -
icon-datagrid -
icon-datavirt -
icon-debian -
icon-decisionserver -
icon-django -
icon-dotnet -
icon-drupal -
icon-eap -
icon-elastic -
icon-erlang -
icon-fedora -
icon-freebsd -
icon-git -
icon-github -
icon-gitlab -
icon-glassfish -
icon-go-gopher -
icon-golang -
icon-grails -
icon-hadoop -
icon-haproxy -
icon-helm -
icon-infinispan -
icon-jboss -
icon-jenkins -
icon-jetty -
icon-joomla -
icon-jruby -
icon-js -
icon-knative -
icon-kubevirt -
icon-laravel -
icon-load-balancer -
icon-mariadb -
icon-mediawiki -
icon-memcached -
icon-mongodb -
icon-mssql -
icon-mysql-database -
icon-nginx -
icon-nodejs -
icon-openjdk -
icon-openliberty -
icon-openshift -
icon-openstack -
icon-other-linux -
icon-other-unknown -
icon-perl -
icon-phalcon -
icon-php -
icon-play -
iconpostgresql -
icon-processserver -
icon-python -
icon-quarkus -
icon-rabbitmq -
icon-rails -
icon-redhat -
icon-redis -
icon-rh-integration -
icon-rh-spring-boot -
icon-rh-tomcat -
icon-ruby -
icon-scala -
icon-serverlessfx -
icon-shadowman -
icon-spring-boot -
icon-spring -
icon-sso -
icon-stackoverflow -
icon-suse -
icon-symfony -
icon-tomcat -
icon-ubuntu -
icon-vertx -
icon-wildfly -
icon-windows -
icon-wordpress -
icon-xamarin -
icon-zend
-
- 7
- 提供模板的个人或组织的名称。
- 8
- 用于参考更多模板文档的 URL。
- 9
- 用于获取模板支持的 URL。
- 10
- 模板实例化时显示的说明消息。该字段应向用户介绍如何使用新建资源。显示消息前,对消息进行参数替换,以便输出中包含所生成的凭据和其他参数。其中包括用户应遵守的所有后续步骤文档链接。
3.1.7.2. 编写模板标签 复制链接链接已复制到粘贴板!
模板可包括一组标签。这些标签添加到模板实例化时创建的各个对象中。采用这种方式定义标签可方便用户查找和管理从特定模板创建的所有对象。
以下是模板对象标签的示例:
3.1.7.3. 编写模板参数 复制链接链接已复制到粘贴板!
允许用户提供一个值或在实例化模板时生成一个值作为参数。然后,该值将在引用参数的任意位置上被替换。可在对象列表字段中的任意字段中定义引用。这有助于生成随机密码,或允许用户提供自定义模板时所需的主机名或其他用户特定值。可通过以下两种方式引用参数:
-
作为字符串值,将格式为
${PARAMETER_NAME}的值放在模板的任意字符串字段中。 -
作为 JSON 或 YAML 值,将格式为
${{PARAMETER_NAME}}的值放在模板中的任意字段中。
使用 ${PARAMETER_NAME} 语法时,可将多个参数引用合并到一个字段中,并可将引用嵌入到固定数据中,如 "http://${PARAMETER_1}${PARAMETER_2}"。两个参数值均将被替换,结果值将是一个带引号的字符串。
使用 ${{PARAMETER_NAME}} 语法时,仅允许单个参数引用,不允许使用前导/尾随字符。执行替换后,结果值将不加引号,除非结果不是有效的 JSON 对象。如果结果不是有效的 JSON 值,则结果值会被添加引号并视为标准字符串。
单个参数可在模板中多次引用,且可在单个模板中使用两种替换语法来引用。
可提供默认值,如果您未提供其他值则使用默认值:
以下是将确切值设置为默认值的示例:
parameters:
- name: USERNAME
description: "The user name for Joe"
value: joe
parameters:
- name: USERNAME
description: "The user name for Joe"
value: joe
还可根据参数定义中指定的规则生成参数值,例如:
parameters:
- name: PASSWORD
description: "The random user password"
generate: expression
from: "[a-zA-Z0-9]{12}"
parameters:
- name: PASSWORD
description: "The random user password"
generate: expression
from: "[a-zA-Z0-9]{12}"
在上例中,处理生成一个由大小写字母和数字组成的 12 个字符长的随机密码。
可用语法并非完整的正则表达式语法。但是,您可以使用 \w、\d、\a 和 \A 修饰符:
-
[\w]{10}生成 10 个字母字符、数字和下划线。它遵循 PCRE 标准,等同于[a-zA-Z0-9_]{10}。 -
[\d]{10}生成 10 个数字。等同于[0-9]{10}。 -
[\a]{10}生成 10 个字母字符。这等同于[a-zA-Z]{10}。 -
[\a]{10}生成 10 个标点或符号字符。这等同于[~!@#$%\^&*()\-_+={}\[\]\\|<,>.?/"';:`]{10}。
取决于模板是以 YAML 还是以 JSON 编写,以及其中的修饰符的字符串类型,您可能需要用第二个反斜杠转义反斜杠。以下示例等同于:
带有修饰程序的 YAML 模板示例
带有修饰符的 JSON 模板示例
下面是附带参数定义和参考的完整模板示例:
- 1
- 模板实例化时,该值将被替换为
SOURCE_REPOSITORY_URL参数的值。 - 2
- 模板实例化时,该值将被替换为
REPLICA_COUNT参数的不加引号值。 - 3
- 参数的名称。该值用于引用模板中的参数。
- 4
- 参数的用户友好型名称。这会为用户显示。
- 5
- 参数的描述。出于参数目的提供更详细的信息,包括对预期值的任何限制。描述应当按照控制台的文本标准使用完整句子。不可与显示名称重复。
- 6
- 如果您实例化该模板时不覆盖该值,则使用该参数的默认值。密码之类避免使用默认值,而应结合使用生成的参数与 secret。
- 7
- 指示此参数是必需的,这意味着您无法使用空值覆盖它。如果参数未提供默认值或生成值,您必须提供一个值。
- 8
- 生成其值的参数。
- 9
- 生成器的输入。这种情况下,生成器会生成一个 40 个字符的字母数字值,其中包括大写和小写字符。
- 10
- 参数可包含在模板消息中。这将告知您生成的值。
3.1.7.4. 编写模板对象列表 复制链接链接已复制到粘贴板!
模板主要部分为对象列表,将在模板实例化时创建。这可以是任何有效的 API 对象,如构建配置、部署配置或服务。该对象按照此处定义创建,创建前替换任意参数值。这些对象的定义可引用前面定义的参数。
以下是对象列表的示例:
- 1
- 服务的定义,由该模板创建。
如果对象定义元数据包含固定的 namespace 字段值,则会在模板实例化过程中从定义中分离。如果 namespace 字段包含参数引用,则将执行正常的参数替换,并参数替换将值解析到的任何命名空间中创建对象,假定用户有权在该命名空间中创建对象。
3.1.7.5. 将模板标记为可绑定 复制链接链接已复制到粘贴板!
Template Service Broker 会在目录中为其了解的每个模板对象公告一个服务。默认情况下,每个服务均会公告为“可绑定”,表示允许最终用户绑定制备的服务。
流程
模板创建者可以防止最终用户绑定从给定模板制备的服务。
-
通过将注解
template.openshift.io/bindable: "false"添加至模板中,防止最终用户绑定从给定模板制备的服务。
3.1.7.6. 公开模板对象字段 复制链接链接已复制到粘贴板!
模板创建者可指定模板中的特定对象字段应公开。Template Service Broker 会识别 ConfigMap、Secret、Service 和 Route 上公开的字段,并在用户绑定代理支持的服务时返回公开字段的值。
要公开对象的一个或多个字段,请在模板中为对象添加以 template.openshift.io/expose- 或 template.openshift.io/base64-expose- 为前缀的注解。
每个移除前缀的注解键均会被传递成为 bind 响应中的一个键。
每个注解值是一个 Kubernetes JSONPath 表达式,该表达式将在绑定时解析,以指示应在 bind 响应中返回值的对象字段。
Bind 响应键/值对可在系统其他部分用作环境变量。因此,建议删除前缀的每个注解键均应为有效的环境变量名称,以字符 A-Z、a-z 或 _ 开头,后跟 0 或 A-Z、a-z、0-9 或 _ 等更多字符。
除非用反斜杠转义,否则 Kubernetes 的 JSONPath 实现会将 .、@ 字符等解析为元字符,而无关其在表达式中的位置。因此,例如要引用名为 my.key 的 ConfigMap 数据,所需 JSONPath 表达式应为 {.data['my\.key']}。根据 JSONPath 表达式在 YAML 中的编写方式,可能需要额外增加反斜杠,如 "{.data['my\\.key']}"。
以下是被公开的不同对象字段的示例:
下面是在遵守上述部分模板情况下,对 bind 操作的一个响应示例:
流程
-
使用
template.openshift.io/expose-注解来以字符串形式返回字段值。这样很方便,尽管没有处理任意二进制数据。 -
如果要返回二进制数据,请在返回前使用
template.openshift.io/base64-expose-注解对数据进行 base64 编码。
3.1.7.7. 等待模板就绪 复制链接链接已复制到粘贴板!
模板创建者可指定:在服务目录、Template Service Broker 或 TemplateInstance API 进行的模板实例化被视为完成之前,应等待模板中的某些对象。
要使用该功能,请使用以下注解在模板中标记一个或多个Build、BuildConfig、Deployment、DeploymentConfig、Job 或 StatefulSet 类型的对象:
"template.alpha.openshift.io/wait-for-ready": "true"
"template.alpha.openshift.io/wait-for-ready": "true"
直到标有注解的所有对象报告就绪时,模板实例化才算完成。同样,如果任何注解的对象报告失败,或者模板未能在一小时的固定超时内就绪,则模板实例化将失败。
就实例化而言,各种对象类型的就绪和失败定义如下:
| 类型 | 就绪 | 失败 |
|---|---|---|
|
| 对象报告阶段完成。 | 对象报告阶段取消、错误或失败 |
|
| 最新关联构建对象报告阶段完成 | 最新关联构建对象报告阶段取消、错误或失败 |
|
| 对象报告新副本集和部署可用。这遵循对象上定义的就绪探针。 | 对象报告进度状况为 false。 |
|
| 对象报告新的复制控制器和部署可用。这遵循对象上定义的就绪探针。 | 对象报告进度状况为 false。 |
|
| 对象报告完成。 | 对象报告出现一个或多个故障。 |
|
| 对象报告所有副本就绪。这遵循对象上定义的就绪探针。 | 不适用。 |
以下是使用 wait-for-ready 注解的模板提取示例。更多示例可在 OpenShift Container Platform 快速启动模板中找到。
其他建议
- 设置内存、CPU 和存储的默认大小,以确保您的应用程序获得足够资源使其平稳运行。
-
如果要在主版本中使用该标签,请避免引用来自镜的
latest标签。当新镜像被推送(push)到该标签时,这可能会导致运行中的应用程序中断。 - 良好的模板可整洁地构建和部署,无需在部署模板后进行修改。
3.1.7.8. 从现有对象创建模板 复制链接链接已复制到粘贴板!
您可以 YAML 格式从项目中导出现有对象,然后通过添加参数和其他自定义作为模板表单来修改 YAML,而无需从头开始编写整个模板。
流程
以 YAML 格式导出项目中的对象:
oc get -o yaml all > <yaml_filename>
$ oc get -o yaml all > <yaml_filename>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您还可替换特定资源类型或多个资源,而非
all资源。运行oc get -h获取更多示例。oc get -o yaml all中包括的对象类型是:-
BuildConfig -
Build -
DeploymentConfig -
ImageStream -
Pod -
ReplicationController -
Route -
Service
-
不建议使用 all 别名,因为内容在不同的集群和版本中可能有所不同。相反,明确指定所有需要的资源。