10.7. 템플릿 작성
애플리케이션의 모든 오브젝트를 쉽게 다시 생성할 수 있도록 새 템플릿을 정의할 수 있습니다. 템플릿은 해당 개체의 생성을 안내하는 일부 메타데이터와 함께 생성되는 오브젝트를 정의합니다.
다음은 간단한 템플릿 오브젝트 정의의 예입니다(YAML).
apiVersion: template.openshift.io/v1 kind: Template metadata: name: redis-template annotations: description: "Description" iconClass: "icon-redis" tags: "database,nosql" objects: - apiVersion: v1 kind: Pod metadata: name: redis-master spec: containers: - env: - name: REDIS_PASSWORD value: ${REDIS_PASSWORD} image: dockerfile/redis name: master ports: - containerPort: 6379 protocol: TCP parameters: - description: Password used for Redis authentication from: '[A-Z0-9]{8}' generate: expression name: REDIS_PASSWORD labels: redis: master
10.7.1. 템플릿 설명 작성
템플릿 설명은 템플릿의 기능을 사용자에게 알려주고 웹 콘솔에서 검색할 때 템플릿을 찾도록 도와줍니다. 템플릿 이름 이외의 추가 메타데이터는 선택사항이지만 있으면 유용합니다. 메타데이터에는 일반적인 설명 정보 외에도 태그 세트가 포함되어 있습니다. 유용한 태그에는 템플릿과 관련된 언어의 이름이 포함되어 있습니다(예: Java, PHP, Ruby 등).
다음은 템플릿 설명 메타데이터의 예입니다.
kind: Template apiVersion: template.openshift.io/v1 metadata: name: cakephp-mysql-example 1 annotations: openshift.io/display-name: "CakePHP MySQL Example (Ephemeral)" 2 description: >- An example CakePHP application with a MySQL database. For more information about using this template, including OpenShift considerations, see https://github.com/sclorg/cakephp-ex/blob/master/README.md. WARNING: Any data stored will be lost upon pod destruction. Only use this template for testing." 3 openshift.io/long-description: >- This template defines resources needed to develop a CakePHP application, including a build configuration, application DeploymentConfig, and database DeploymentConfig. The database is stored in non-persistent storage, so this configuration should be used for experimental purposes only. 4 tags: "quickstart,php,cakephp" 5 iconClass: icon-php 6 openshift.io/provider-display-name: "Red Hat, Inc." 7 openshift.io/documentation-url: "https://github.com/sclorg/cakephp-ex" 8 openshift.io/support-url: "https://access.redhat.com" 9 message: "Your admin credentials are ${ADMIN_USERNAME}:${ADMIN_PASSWORD}" 10
- 1
- 템플릿의 고유한 이름입니다.
- 2
- 사용자 인터페이스에서 사용할 수 있는 간단하고 사용자에게 친숙한 이름입니다.
- 3
- 템플릿에 대한 설명입니다. 사용자가 배포 사항을 이해할 수 있도록 충분한 세부 정보와 배포 전에 알아야 할 경고 사항을 포함합니다. README 파일과 같은 추가 정보에 대한 링크도 제공해야 합니다. 단락을 생성하기 위해 줄 바꿈이 포함될 수 있습니다.
- 4
- 추가 템플릿 설명입니다. 예를 들어 서비스 카탈로그에 의해 표시될 수 있습니다.
- 5
- 검색 및 그룹화에 필요한 템플릿과 연관된 태그입니다. 제공된 카탈로그 카테고리 중 하나에 포함할 태그를 추가합니다. 콘솔 상수 파일에 있는
CATALOG_CATEGORIES
의id
및categoryAliases
를 참조합니다. 카테고리는 전체 클러스터에 맞게 사용자 정의할 수도 있습니다. - 6
- 웹 콘솔에서 템플릿과 함께 표시되는 아이콘입니다.
예 10.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
-
Ironic-other-known
-
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
- 이 템플릿이 인스턴스화될 때 표시되는 지시 메시지입니다. 이 필드는 새로 생성된 리소스 사용 방법을 사용자에게 알려주어야 합니다. 생성된 인증 정보 및 기타 매개변수가 출력에 포함될 수 있도록 표시 전에 메시지에서 매개변수 대체가 수행됩니다. 사용자가 따라야 하는 다음 단계 문서에 대한 링크를 포함합니다.
10.7.2. 템플릿 레이블 작성
템플릿에는 레이블 세트가 포함될 수 있습니다. 이러한 레이블은 템플릿이 인스턴스화될 때 생성되는 각 오브젝트에 추가됩니다. 이런 방식으로 레이블을 정의하면 사용자가 특정 템플릿에서 생성된 모든 오브젝트를 쉽게 찾아서 관리할 수 있습니다.
다음은 템플릿 오브젝트 레이블의 예입니다.
kind: "Template" apiVersion: "v1" ... labels: template: "cakephp-mysql-example" 1 app: "${NAME}" 2
10.7.3. 템플릿 매개변수 작성
매개 변수를 사용하면 템플릿을 인스턴스화할 때 값을 제공하거나 생성할 수 있습니다. 그러면 해당 값이 매개변수가 참조될 때마다 대체됩니다. 참조는 오브젝트 목록 필드의 어떤 필드에서든 정의할 수 있습니다. 임의의 암호를 생성하거나 템플릿을 사용자 정의하는 데 필요한 호스트 이름 또는 기타 사용자 특정 값을 제공할 수 있는 데 유용합니다. 매개변수는 다음 두 가지 방법으로 참조할 수 있습니다.
-
템플릿에 있는 임의의 문자열 필드에
${PARAMETER_NAME}
형식의 값을 배치하여 문자열 값으로 참조합니다. -
템플릿에서 임의의 필드 대신
${{PARAMETER_NAME}}
형식의 값을 배치하여 JSON 또는 YAML 값으로 참조합니다.
${PARAMETER_NAME}
구문을 사용하는 경우 여러 매개변수 참조가 단일 필드에서 결합될 수 있으며 참조는 "http://${PARAMETER_1}${PARAMETER_2}"
같이 고정된 데이터에 내에 포함될 수 있습니다. 매개변수 값이 둘 다 대체되며 결과 값은 인용된 문자열이 됩니다.
${{PARAMETER_NAME}}
구문을 사용하는 경우 단일 매개변수 참조만 허용되며 선행 및 후행 문자는 허용되지 않습니다. 대체가 수행된 후 결과가 유효한 JSON 오브젝트인 경우 결과 값이 인용되지 않습니다. 결과가 유효한 JSON 값이 아닌 경우 결과 값이 인용되고 표준 문자열로 처리됩니다.
단일 매개변수는 템플릿 내에서 여러 번 참조될 수 있으며 단일 템플릿 내에서 두 대체 구문을 사용하여 참조될 수도 있습니다.
다른 값을 제공하지 않은 경우 사용되는 기본값을 제공할 수 있습니다.
다음은 명시적 값을 기본값으로 설정하는 예입니다.
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}"
이전 예에서 처리가 완료되면 모든 대문자 및 소문자 영문자와 숫자로 구성된 12자 길이의 임의의 암호가 생성됩니다.
사용 가능한 구문은 완전한 정규식 구문이 아닙니다. 하지만 \w
, \d
, \a
, and \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 템플릿 예
parameters: - name: singlequoted_example generate: expression from: '[\A]{10}' - name: doublequoted_example generate: expression from: "[\\A]{10}"
수정자가 포함된 JSON 템플릿 예
{ "parameters": [ { "name": "json_example", "generate": "expression", "from": "[\\A]{10}" } ] }
다음은 매개변수 정의 및 참조가 포함된 전체 템플릿의 예입니다.
kind: Template apiVersion: template.openshift.io/v1 metadata: name: my-template objects: - kind: BuildConfig apiVersion: build.openshift.io/v1 metadata: name: cakephp-mysql-example annotations: description: Defines how to build the application spec: source: type: Git git: uri: "${SOURCE_REPOSITORY_URL}" 1 ref: "${SOURCE_REPOSITORY_REF}" contextDir: "${CONTEXT_DIR}" - kind: DeploymentConfig apiVersion: apps.openshift.io/v1 metadata: name: frontend spec: replicas: "${{REPLICA_COUNT}}" 2 parameters: - name: SOURCE_REPOSITORY_URL 3 displayName: Source Repository URL 4 description: The URL of the repository with your application source code 5 value: https://github.com/sclorg/cakephp-ex.git 6 required: true 7 - name: GITHUB_WEBHOOK_SECRET description: A secret string used to configure the GitHub webhook generate: expression 8 from: "[a-zA-Z0-9]{40}" 9 - name: REPLICA_COUNT description: Number of replicas to run value: "2" required: true message: "... The GitHub webhook secret is ${GITHUB_WEBHOOK_SECRET} ..." 10
- 1
- 이 값은 템플릿이 인스턴스화될 때
SOURCE_REPOSITORY_URL
매개변수 값으로 교체됩니다. - 2
- 이 값은 템플릿이 인스턴스화될 때 인용되지 않은
REPLICA_COUNT
매개변수 값으로 교체됩니다. - 3
- 매개변수의 이름입니다. 이 값은 템플릿 내에서 매개변수를 참조하는 데 사용됩니다.
- 4
- 사용자에게 친숙한 매개변수 이름입니다. 이는 사용자에게 표시됩니다.
- 5
- 매개변수에 대한 설명입니다. 예상 값에 대한 제약 조건을 비롯하여 매개변수의 목적에 대한 자세한 정보를 제공합니다. 설명은 콘솔의 텍스트 표준을 따르는 완전한 문장을 사용해야 합니다. 표시 이름과 중복되지 않게 하십시오.
- 6
- 템플릿을 인스턴스화할 때 사용자가 값을 재정의하지 않는 경우 사용되는 매개변수의 기본값입니다. 암호 등에 기본값을 사용하지 말고 생성된 매개변수를 시크릿과 조합하여 사용하십시오.
- 7
- 이 매개변수가 필수임을 나타냅니다. 즉, 빈 값으로 이 매개변수를 재정의할 수 없습니다. 매개변수가 기본값 또는 생성된 값을 제공하지 않으면 값을 제공해야 합니다.
- 8
- 값이 생성되어 있는 매개변수입니다.
- 9
- 생성기에 대한 입력입니다. 이 경우 생성기는 대문자 및 소문자를 포함하여 40자 길이의 영숫자 값을 생성합니다.
- 10
- 매개변수가 템플릿 메시지에 포함될 수 있습니다. 생성된 값에 대해 알려줍니다.
10.7.4. 템플릿 오브젝트 목록 작성
템플릿의 주요 부분은 템플릿이 인스턴스화될 때 생성되는 오브젝트 목록입니다. 빌드 구성, 배포 구성 또는 서비스와 같은 유효한 API 오브젝트일 수 있습니다. 오브젝트는 정확히 여기에 정의된 대로 생성되며 매개변수 값은 생성 전에 대체됩니다. 이러한 오브젝트 정의는 앞에서 정의한 매개변수를 참조할 수 있습니다.
다음은 오브젝트 목록의 예입니다.
kind: "Template"
apiVersion: "v1"
metadata:
name: my-template
objects:
- kind: "Service" 1
apiVersion: "v1"
metadata:
name: "cakephp-mysql-example"
annotations:
description: "Exposes and load balances the application pods"
spec:
ports:
- name: "web"
port: 8080
targetPort: 8080
selector:
name: "cakephp-mysql-example"
- 1
- 이 템플릿에서 생성된 서비스의 정의입니다.
오브젝트 정의 메타데이터에 고정된 namespace
필드 값이 포함된 경우 템플릿을 인스턴스화하는 동안 이 필드가 정의에서 제거됩니다. namespace
필드에 매개변수 참조가 포함되어 있는 경우 사용자가 해당 네임스페이스에서 오브젝트를 생성할 수 있는 권한이 있다고 가정하면 매개변수 대체가 값을 해석한 모든 네임스페이스에서 일반 매개변수 대체가 수행되고 오브젝트가 생성됩니다.
10.7.5. 템플릿을 바인딩 가능으로 표시
Template Service Broker는 해당 카탈로그에서 인식하는 템플릿 오브젝트마다 하나의 서비스를 알립니다. 기본적으로 이러한 각 서비스는 바인드 가능 상태로 알려집니다. 즉, 일반 사용자가 프로비저닝된 서비스에 대해 바인딩할 수 있습니다.
프로세스
템플릿 작성자는 일반 사용자가 지정된 템플릿에서 프로비저닝된 서비스에 대해 바인딩하지 못하도록 할 수 있습니다.
-
template.openshift.io/bindable: "false"
주석을 템플릿에 추가하여 일반 사용자가 지정된 템플릿에서 프로비저닝된 서비스에 대해 바인딩하지 못하도록 합니다.
10.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
또는 _
로 시작하고 뒤에 A-Z
, a-z
, 0-9
또는 _
문자가 0개 이상 나와야 합니다.
백슬래시로 이스케이프되지 않으면 Kubernetes JSONPath 구현에서는 .
, @
및 메타 문자와 같은 기타 문자를 표현식 내 위치에 관계없이 문자로 해석합니다. 따라서 예를 들어 my.key
라는 ConfigMap
데이터를 참조하기 위해 필요한 JSONPath 표현식은 {.data['my\.key']}
입니다. JSONPath 표현식이 YAML로 작성되는 방법에 따라 추가 백슬래시가 필요할 수도 있습니다(예: "{.data['my\\.key']}"
).
다음은 노출되는 다양한 오브젝트 필드의 예입니다.
kind: Template apiVersion: template.openshift.io/v1 metadata: name: my-template objects: - kind: ConfigMap apiVersion: v1 metadata: name: my-template-config annotations: template.openshift.io/expose-username: "{.data['my\\.username']}" data: my.username: foo - kind: Secret apiVersion: v1 metadata: name: my-template-config-secret annotations: template.openshift.io/base64-expose-password: "{.data['password']}" stringData: password: <password> - kind: Service apiVersion: v1 metadata: name: my-template-service annotations: template.openshift.io/expose-service_ip_port: "{.spec.clusterIP}:{.spec.ports[?(.name==\"web\")].port}" spec: ports: - name: "web" port: 8080 - kind: Route apiVersion: route.openshift.io/v1 metadata: name: my-template-route annotations: template.openshift.io/expose-uri: "http://{.spec.host}{.spec.path}" spec: path: mypath
위의 부분적인 템플릿을 기반으로 하는 bind
작업에 대한 응답 예는 다음과 같습니다.
{ "credentials": { "username": "foo", "password": "YmFy", "service_ip_port": "172.30.12.34:8080", "uri": "http://route-test.router.default.svc.cluster.local/mypath" } }
프로세스
-
template.openshift.io/expose-
주석을 사용하여 필드 값을 문자열로 반환합니다. 이 주석을 사용하면 임의의 바이너리 데이터를 처리하지는 않지만 편리합니다. -
바이너리 데이터를 반환하려면
template.openshift.io/base64-expose-
주석을 사용하여 데이터를 반환하기 전에 base64로 인코딩합니다.
10.7.7. 템플릿 준비 상태 대기
템플릿 작성자는 템플릿 내의 특정 오브젝트가 일정 시간 대기한 뒤에 서비스 카탈로그, Template Service Broker 또는 TemplateInstance
API의 템플릿 인스턴스화가 완료된 것으로 간주된다고 표시할 수 있습니다.
이 기능을 사용하려면 템플릿에서 다음 주석으로 하나 이상의 오브젝트를 Build
, BuildConfig
, Deployment
, DeploymentConfig
, Job
또는 StatefulSet
유형으로 표시하십시오.
"template.alpha.openshift.io/wait-for-ready": "true"
이 주석이 표시된 모든 오브젝트가 준비되었다고 보고할 때까지 템플릿 인스턴스화는 완료되지 않습니다. 마찬가지로 주석이 있는 오브젝트 보고서 중 실패하는 보고서가 있거나 템플릿이 1시간이라는 고정된 제한 시간 내에 준비되지 않으면 템플릿 인스턴스화가 실패합니다.
인스턴스화를 위해 각 오브젝트 유형의 준비 및 실패는 다음과 같이 정의됩니다.
유형 | 준비 | 실패 |
---|---|---|
| 오브젝트가 완료 단계 보고 | 오브젝트가 취소, 오류 또는 실패 단계 보고 |
| 관련된 최신 빌드 오브젝트가 완료 단계 보고 | 관련된 최신 빌드 오브젝트가 취소, 오류 또는 실패 단계 보고 |
| 오브젝트는 사용 가능한 새 복제본 세트 및 배포를 보고합니다. 이 명령은 오브젝트에 정의된 준비 상태 프로브를 따릅니다. | 오브젝트가 진행 상태를 False로 보고 |
| 오브젝트가 사용 가능한 새 복제 컨트롤러 및 배포를 보고합니다. 이 명령은 오브젝트에 정의된 준비 상태 프로브를 따릅니다. | 오브젝트가 진행 상태를 False로 보고 |
| 오브젝트가 완료 보고 | 오브젝트가 하나 이상의 실패가 발생했음을 보고 |
| 오브젝트가 준비된 모든 복제본을 보고합니다. 이 명령은 오브젝트에 정의된 준비 상태 프로브를 따릅니다. | 해당 없음 |
다음은 wait-for-ready
주석을 사용하는 템플릿 추출의 예입니다. 더 많은 예는 OpenShift Container Platform 퀵 스타트 템플릿에서 찾을 수 있습니다.
kind: Template apiVersion: template.openshift.io/v1 metadata: name: my-template objects: - kind: BuildConfig apiVersion: build.openshift.io/v1 metadata: name: ... annotations: # wait-for-ready used on BuildConfig ensures that template instantiation # will fail immediately if build fails template.alpha.openshift.io/wait-for-ready: "true" spec: ... - kind: DeploymentConfig apiVersion: apps.openshift.io/v1 metadata: name: ... annotations: template.alpha.openshift.io/wait-for-ready: "true" spec: ... - kind: Service apiVersion: v1 metadata: name: ... spec: ...
추가 권장 사항
- 메모리, CPU 및 스토리지 기본 크기를 설정하여 애플리케이션에 원활한 실행을 위한 리소스가 충분히 제공되도록 합니다.
-
latest
태그가 주요 버전 간에 사용되는 경우 이미지의 해당 태그를 참조하지 마십시오. 새 이미지를 해당 태그로 푸시하면 실행 중인 애플리케이션이 중단될 수도 있습니다. - 좋은 템플릿은 템플릿 배포 후 수정할 필요 없이 깔끔하게 빌드되고 배포됩니다.
10.7.8. 기존 오브젝트에서 템플릿 생성
전체 템플릿을 처음부터 작성하지 않고 프로젝트에서 기존 오브젝트를 YAML 형식으로 내보낸 후 템플릿 형식으로 매개변수 및 기타 사용자 정의를 추가하여 YAML을 수정할 수 있습니다.
프로세스
프로젝트의 오브젝트를 YAML 형식으로 내보냅니다.
$ oc get -o yaml all > <yaml_filename>
all
을 사용하지 않고 특정 리소스 유형 또는 여러 리소스를 대체할 수도 있습니다. 더 많은 예를 보려면oc get -h
를 실행하십시오.oc get -o yaml all
에 포함된 오브젝트 유형은 다음과 같습니다.-
BuildConfig
-
Build
-
DeploymentConfig
-
ImageStream
-
Pod
-
ReplicationController
-
경로
-
Service
-
all
별칭을 사용하는 것은 다른 클러스터 및 버전마다 내용이 다를 수 있으므로 권장되지 않습니다. 대신 필요한 모든 리소스를 지정합니다.