OpenShift bao gồm hai loại phương tiện để tạo và triển khai ứng dụng, bằng GUI hoặc bằng CLI. Trong chương này, chúng ta sẽ sử dụng CLI để tạo một ứng dụng mới. Chúng tôi sẽ sử dụng ứng dụng OC để giao tiếp với môi trường OpenShift.
Tạo một ứng dụng mới
Trong OpenShift, có ba phương pháp tạo một ứng dụng mới.
- Từ một mã nguồn
- Từ một hình ảnh
- Từ một mẫu
Từ một mã nguồn
Khi chúng tôi cố gắng tạo một ứng dụng từ mã nguồn, OpenShift sẽ tìm kiếm tệp Docker sẽ có bên trong repo, tệp này xác định quy trình xây dựng ứng dụng. Chúng tôi sẽ sử dụng ứng dụng mới oc để tạo ứng dụng.
Điều đầu tiên cần ghi nhớ khi sử dụng repo là nó phải trỏ đến một nguồn gốc trong repo từ đó OpenShift sẽ kéo mã và xây dựng nó.
Nếu repo được sao chép trên máy Docker nơi cài đặt ứng dụng khách OC và người dùng đang ở trong cùng một thư mục, thì nó có thể được tạo bằng lệnh sau.
$ oc new-app . <Hear. Denotes current working directory>
Sau đây là một ví dụ về việc cố gắng xây dựng từ kho lưu trữ từ xa cho một chi nhánh cụ thể.
$ oc new-app https://github.com/openshift/Testing-deployment.git#test1
Ở đây, test1 là nhánh mà chúng tôi đang cố gắng tạo một ứng dụng mới trong OpenShift.
Khi chỉ định tệp Docker trong kho lưu trữ, chúng ta cần xác định chiến lược xây dựng như hình dưới đây.
$ oc new-app OpenShift/OpenShift-test~https://github.com/openshift/Testingdeployment.git
Từ một hình ảnh
Trong khi xây dựng ứng dụng bằng hình ảnh, hình ảnh hiện diện trong máy chủ Docker cục bộ, trong kho lưu trữ Docker được lưu trữ nội bộ hoặc trên trung tâm Docker. Điều duy nhất mà người dùng cần đảm bảo là anh ta có quyền truy cập để lấy hình ảnh từ trung tâm mà không gặp bất kỳ vấn đề gì. OpenShift có khả năng xác định nguồn được sử dụng, cho dù đó là hình ảnh Docker hay một luồng nguồn. Tuy nhiên, nếu người dùng muốn, anh ta có thể xác định rõ ràng đó là luồng hình ảnh hay hình ảnh Docker.
$ oc new-app - - docker-image tomcat
Sử dụng luồng hình ảnh
$ oc new-app tomcat:v1
Từ một mẫu
Các mẫu có thể được sử dụng để tạo một ứng dụng mới. Nó có thể là một mẫu đã có sẵn hoặc tạo một mẫu mới.
Tệp sau yaml về cơ bản là một mẫu có thể được sử dụng để triển khai.
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>
Phát triển và triển khai ứng dụng web
Phát triển một ứng dụng mới trong OpenShift
Để tạo một ứng dụng mới trong OpenShift, chúng ta phải viết một mã ứng dụng mới và xây dựng nó bằng các lệnh xây dựng OpenShift OC. Như đã thảo luận, chúng ta có nhiều cách để tạo một hình ảnh mới. Ở đây, chúng tôi sẽ sử dụng một mẫu để xây dựng ứng dụng. Mẫu này sẽ tạo một ứng dụng mới khi chạy bằng lệnh oc new-app.
Mẫu sau sẽ tạo – Hai ứng dụng front-end và một cơ sở dữ liệu. Cùng với đó, nó sẽ tạo ra hai dịch vụ mới và các ứng dụng đó sẽ được triển khai vào cụm OpenShift. Trong khi xây dựng và triển khai một ứng dụng, ban đầu chúng ta cần tạo một không gian tên trong OpenShift và triển khai ứng dụng dưới không gian tên đó.Tạo một không gian tên mới
$ oc new-project openshift-test --display-name = "OpenShift 3 Sample" --
description = "This is an example project to demonstrate OpenShift v3"
Bản mẫu
{
"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"
}
}
},
Định nghĩa đối tượng
Định nghĩa bí mật trong một mẫu
"objects": [
{
"kind": "Secret",
"apiVersion": "v1",
"metadata": {"name": "dbsecret"},
"stringData" : {
"mysql-user" : "${MYSQL_USER}",
"mysql-password" : "${MYSQL_PASSWORD}"
}
},
Định nghĩa dịch vụ trong một mẫu
{
"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": {}
}
},
Định nghĩa tuyến đường trong một mẫu
{
"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": ""
}
},
Xây dựng định nghĩa cấu hình trong một mẫu
{
"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
}
}
},
Cấu hình triển khai trong một mẫu
"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": {}
},
Định nghĩa dịch vụ trong một mẫu
{
"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": {}
}
},
Định nghĩa cấu hình triển khai trong một mẫu
{
"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"
}
}
Tệp mẫu trên cần được biên dịch cùng một lúc. Trước tiên, chúng ta cần sao chép tất cả nội dung vào một tệp duy nhất và đặt tên là tệp yaml sau khi hoàn tất. Chúng ta cần chạy lệnh sau để tạo ứng dụng.
$ 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.
Nếu chúng ta muốn giám sát quá trình xây dựng, nó có thể được thực hiện bằng cách sử dụng –
$ oc get builds
NAME TYPE FROM STATUS STARTED DURATION
openshift-sample-build-1 Source Git@bd94cbb Running 7 seconds ago 7s
Chúng tôi có thể kiểm tra các ứng dụng đã triển khai trên OpenShift bằng cách sử dụng
$ 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
Chúng tôi có thể kiểm tra xem các dịch vụ ứng dụng có được tạo theo định nghĩa dịch vụ hay không bằng cách sử dụng
$ 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