OpenShift-시작하기
OpenShift는 GUI 또는 CLI를 통해 애플리케이션을 만들고 배포하기위한 두 가지 유형의 중앙값으로 구성됩니다. 이 장에서는 CLI를 사용하여 새 응용 프로그램을 만듭니다. OpenShift 환경과 통신하기 위해 OC 클라이언트를 사용할 것입니다.
새 응용 프로그램 만들기
OpenShift에는 새 애플리케이션을 만드는 세 가지 방법이 있습니다.
- 소스 코드에서
- 이미지에서
- 템플릿에서
소스 코드에서
소스 코드에서 애플리케이션을 만들려고 할 때 OpenShift는 애플리케이션 빌드 흐름을 정의하는 저장소 내부에 있어야하는 Docker 파일을 찾습니다. oc new-app을 사용하여 애플리케이션을 만들 것입니다.
저장소를 사용하는 동안 가장 먼저 명심해야 할 것은 OpenShift가 코드를 가져와 빌드 할 저장소의 출처를 가리켜 야한다는 것입니다.
저장소가 OC 클라이언트가 설치된 Docker 머신에서 복제되고 사용자가 동일한 디렉토리에있는 경우 다음 명령을 사용하여 만들 수 있습니다.
$ oc new-app . <Hear. Denotes current working directory>
다음은 특정 분기에 대한 원격 저장소에서 빌드를 시도하는 예입니다.
$ oc new-app https://github.com/openshift/Testing-deployment.git#test1
여기서 test1은 OpenShift에서 새 응용 프로그램을 만들려고하는 지점입니다.
저장소에 Docker 파일을 지정할 때 아래와 같이 빌드 전략을 정의해야합니다.
$ oc new-app OpenShift/OpenShift-test~https://github.com/openshift/Testingdeployment.git
이미지에서
이미지를 사용하여 애플리케이션을 빌드하는 동안 이미지는 로컬 Docker 서버, 사내 호스팅 Docker 저장소 또는 Docker 허브에 있습니다. 사용자가 확인해야 할 유일한 사항은 문제없이 허브에서 이미지를 가져올 수 있다는 것입니다.
OpenShift에는 Docker 이미지이든 소스 스트림이든 사용 된 소스를 확인할 수있는 기능이 있습니다. 그러나 사용자가 원하는 경우 이미지 스트림인지 Docker 이미지인지 명시 적으로 정의 할 수 있습니다.
$ oc new-app - - docker-image tomcat
이미지 스트림 사용-
$ oc new-app tomcat:v1
템플릿에서
새 응용 프로그램을 만드는 데 템플릿을 사용할 수 있습니다. 이미 존재하는 템플릿이거나 새 템플릿을 만들 수 있습니다.
다음 yaml 파일은 기본적으로 배포에 사용할 수있는 템플릿입니다.
apiVersion: v1
kind: Template
metadata:
name: <Name of template>
annotations:
description: <Description of Tag>
iconClass: "icon-redis"
tags: <Tages of image>
objects:
- apiVersion: v1
kind: Pod
metadata:
name: <Object Specification>
spec:
containers:
image: <Image Name>
name: master
ports:
- containerPort: <Container port number>
protocol: <Protocol>
labels:
redis: <Communication Type>
웹 애플리케이션 개발 및 배포
OpenShift에서 새 애플리케이션 개발
OpenShift에서 새 애플리케이션을 생성하려면 새 애플리케이션 코드를 작성하고 OpenShift OC 빌드 명령을 사용하여 빌드해야합니다. 논의했듯이 새 이미지를 만드는 방법에는 여러 가지가 있습니다. 여기서는 템플릿을 사용하여 애플리케이션을 빌드합니다. 이 템플릿은 oc new-app 명령으로 실행될 때 새 애플리케이션을 빌드합니다.
다음 템플릿은 생성됩니다-두 개의 프런트 엔드 응용 프로그램과 하나의 데이터베이스. 이와 함께 두 개의 새로운 서비스가 생성되고 해당 애플리케이션이 OpenShift 클러스터에 배포됩니다. 애플리케이션을 빌드하고 배포하는 동안 처음에는 OpenShift에서 네임 스페이스를 만들고 해당 네임 스페이스 아래에 애플리케이션을 배포해야합니다.
Create a new namespace
$ oc new-project openshift-test --display-name = "OpenShift 3 Sample" --
description = "This is an example project to demonstrate OpenShift v3"
주형
{
"kind": "Template",
"apiVersion": "v1",
"metadata": {
"name": "openshift-helloworld-sample",
"creationTimestamp": null,
"annotations": {
"description": "This example shows how to create a simple openshift
application in openshift origin v3",
"iconClass": "icon-openshift",
"tags": "instant-app,openshift,mysql"
}
}
},
개체 정의
Secret definition in a template
"objects": [
{
"kind": "Secret",
"apiVersion": "v1",
"metadata": {"name": "dbsecret"},
"stringData" : {
"mysql-user" : "${MYSQL_USER}",
"mysql-password" : "${MYSQL_PASSWORD}"
}
},
Service definition in a template
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "frontend",
"creationTimestamp": null
},
"spec": {
"ports": [
{
"name": "web",
"protocol": "TCP",
"port": 5432,
"targetPort": 8080,
"nodePort": 0
}
],
"selector": {"name": "frontend"},
"type": "ClusterIP",
"sessionAffinity": "None"
},
"status": {
"loadBalancer": {}
}
},
Route definition in a template
{
"kind": "Route",
"apiVersion": "v1",
"metadata": {
"name": "route-edge",
"creationTimestamp": null,
"annotations": {
"template.openshift.io/expose-uri": "http://{.spec.host}{.spec.path}"
}
},
"spec": {
"host": "www.example.com",
"to": {
"kind": "Service",
"name": "frontend"
},
"tls": {
"termination": "edge"
}
},
"status": {}
},
{
"kind": "ImageStream",
"apiVersion": "v1",
"metadata": {
"name": "origin-openshift-sample",
"creationTimestamp": null
},
"spec": {},
"status": {
"dockerImageRepository": ""
}
},
{
"kind": "ImageStream",
"apiVersion": "v1",
"metadata": {
"name": "openshift-22-ubuntu7",
"creationTimestamp": null
},
"spec": {
"dockerImageRepository": "ubuntu/openshift-22-ubuntu7"
},
"status": {
"dockerImageRepository": ""
}
},
Build config definition in a template
{
"kind": "BuildConfig",
"apiVersion": "v1",
"metadata": {
"name": "openshift-sample-build",
"creationTimestamp": null,
"labels": {name": "openshift-sample-build"}
},
"spec": {
"triggers": [
{ "type": "GitHub",
"github": {
"secret": "secret101" }
},
{
"type": "Generic",
"generic": {
"secret": "secret101",
"allowEnv": true }
},
{
"type": "ImageChange",
"imageChange": {}
},
{ "type": "ConfigChange”}
],
"source": {
"type": "Git",
"git": {
"uri": https://github.com/openshift/openshift-hello-world.git }
},
"strategy": {
"type": "Docker",
"dockerStrategy": {
"from": {
"kind": "ImageStreamTag",
"name": "openshift-22-ubuntu7:latest”
},
"env": [
{
"name": "EXAMPLE",
"value": "sample-app"
}
]
}
},
"output": {
"to": {
"kind": "ImageStreamTag",
"name": "origin-openshift-sample:latest"
}
},
"postCommit": {
"args": ["bundle", "exec", "rake", "test"]
},
"status": {
"lastVersion": 0
}
}
},
Deployment config in a template
"status": {
"lastVersion": 0
}
{
"kind": "DeploymentConfig",
"apiVersion": "v1",
"metadata": {
"name": "frontend",
"creationTimestamp": null
}
},
"spec": {
"strategy": {
"type": "Rolling",
"rollingParams": {
"updatePeriodSeconds": 1,
"intervalSeconds": 1,
"timeoutSeconds": 120,
"pre": {
"failurePolicy": "Abort",
"execNewPod": {
"command": [
"/bin/true"
],
"env": [
{
"name": "CUSTOM_VAR1",
"value": "custom_value1"
}
]
}
}
}
}
}
"triggers": [
{
"type": "ImageChange",
"imageChangeParams": {
"automatic": true,
"containerNames": [
"openshift-helloworld"
],
"from": {
"kind": "ImageStreamTag",
"name": "origin-openshift-sample:latest"
}
}
},
{
"type": "ConfigChange"
}
],
"replicas": 2,
"selector": {
"name": "frontend"
},
"template": {
"metadata": {
"creationTimestamp": null,
"labels": {
"name": "frontend"
}
},
"spec": {
"containers": [
{
"name": "openshift-helloworld",
"image": "origin-openshift-sample",
"ports": [
{
"containerPort": 8080,
"protocol": "TCP”
}
],
"env": [
{
"name": "MYSQL_USER",
"valueFrom": {
"secretKeyRef" : {
"name" : "dbsecret",
"key" : "mysql-user"
}
}
},
{
"name": "MYSQL_PASSWORD",
"valueFrom": {
"secretKeyRef" : {
"name" : "dbsecret",
"key" : "mysql-password"
}
}
},
{
"name": "MYSQL_DATABASE",
"value": "${MYSQL_DATABASE}"
}
],
"resources": {},
"terminationMessagePath": "/dev/termination-log",
"imagePullPolicy": "IfNotPresent",
"securityContext": {
"capabilities": {},
"privileged": false
}
}
],
"restartPolicy": "Always",
"dnsPolicy": "ClusterFirst"
},
"status": {}
},
Service definition in a template
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "database",
"creationTimestamp": null
},
"spec": {
"ports": [
{
"name": "db",
"protocol": "TCP",
"port": 5434,
"targetPort": 3306,
"nodePort": 0
}
],
"selector": {
"name": "database
},
"type": "ClusterIP",
"sessionAffinity": "None" },
"status": {
"loadBalancer": {}
}
},
Deployment config definition in a template
{
"kind": "DeploymentConfig",
"apiVersion": "v1",
"metadata": {
"name": "database",
"creationTimestamp": null
},
"spec": {
"strategy": {
"type": "Recreate",
"resources": {}
},
"triggers": [
{
"type": "ConfigChange"
}
],
"replicas": 1,
"selector": {"name": "database"},
"template": {
"metadata": {
"creationTimestamp": null,
"labels": {"name": "database"}
},
"template": {
"metadata": {
"creationTimestamp": null,
"labels": {
"name": "database"
}
},
"spec": {
"containers": [
{
"name": "openshift-helloworld-database",
"image": "ubuntu/mysql-57-ubuntu7:latest",
"ports": [
{
"containerPort": 3306,
"protocol": "TCP"
}
],
"env": [
{
"name": "MYSQL_USER",
"valueFrom": {
"secretKeyRef" : {
"name" : "dbsecret",
"key" : "mysql-user"
}
}
},
{
"name": "MYSQL_PASSWORD",
"valueFrom": {
"secretKeyRef" : {
"name" : "dbsecret",
"key" : "mysql-password"
}
}
},
{
"name": "MYSQL_DATABASE",
"value": "${MYSQL_DATABASE}"
}
],
"resources": {},
"volumeMounts": [
{
"name": "openshift-helloworld-data",
"mountPath": "/var/lib/mysql/data"
}
],
"terminationMessagePath": "/dev/termination-log",
"imagePullPolicy": "Always",
"securityContext": {
"capabilities": {},
"privileged": false
}
}
],
"volumes": [
{
"name": "openshift-helloworld-data",
"emptyDir": {"medium": ""}
}
],
"restartPolicy": "Always",
"dnsPolicy": "ClusterFirst”
}
}
},
"status": {}
},
"parameters": [
{
"name": "MYSQL_USER",
"description": "database username",
"generate": "expression",
"from": "user[A-Z0-9]{3}",
"required": true
},
{
"name": "MYSQL_PASSWORD",
"description": "database password",
"generate": "expression",
"from": "[a-zA-Z0-9]{8}",
"required": true
},
{
"name": "MYSQL_DATABASE",
"description": "database name",
"value": "root",
"required": true
}
],
"labels": {
"template": "application-template-dockerbuild"
}
}
위 템플릿 파일은 한 번에 컴파일해야합니다. 먼저 모든 콘텐츠를 단일 파일로 복사하고 완료되면 이름을 yaml 파일로 지정해야합니다.
애플리케이션을 생성하려면 다음 명령을 실행해야합니다.
$ oc new-app application-template-stibuild.json
--> Deploying template openshift-helloworld-sample for "application-template-stibuild.json"
openshift-helloworld-sample
---------
This example shows how to create a simple ruby application in openshift origin v3
* With parameters:
* MYSQL_USER = userPJJ # generated
* MYSQL_PASSWORD = cJHNK3se # generated
* MYSQL_DATABASE = root
--> Creating resources with label app = ruby-helloworld-sample ...
service "frontend" created
route "route-edge" created
imagestream "origin-ruby-sample" created
imagestream "ruby-22-centos7" created
buildconfig "ruby-sample-build" created
deploymentconfig "frontend" created
service "database" created
deploymentconfig "database" created
--> Success
Build scheduled, use 'oc logs -f bc/ruby-sample-build' to track its progress.
Run 'oc status' to view your app.
빌드를 모니터링하려면 다음을 사용하여 수행 할 수 있습니다.
$ oc get builds
NAME TYPE FROM STATUS STARTED DURATION
openshift-sample-build-1 Source Git@bd94cbb Running 7 seconds ago 7s
다음을 사용하여 OpenShift에 배포 된 애플리케이션을 확인할 수 있습니다.
$ oc get pods
NAME READY STATUS RESTARTS AGE
database-1-le4wx 1/1 Running 0 1m
frontend-1-e572n 1/1 Running 0 27s
frontend-1-votq4 1/1 Running 0 31s
opeshift-sample-build-1-build 0/1 Completed 0 1m
다음을 사용하여 서비스 정의에 따라 응용 프로그램 서비스가 생성되었는지 확인할 수 있습니다.
$ oc get services
NAME CLUSTER-IP EXTERNAL-IP PORT(S) SELECTOR AGE
database 172.30.80.39 <none> 5434/TCP name=database 1m
frontend 172.30.17.4 <none> 5432/TCP name=frontend 1m