SlideShare a Scribd company logo
1 of 55
RED HAT | Daein Park
#rhconvergence
1
Red Hat Customer Convergence
#rhconvergence
RED HAT | Daein Park
#rhconvergence
2
OpenShift で JBoss EAP 構築
Daein Park
Technical Support Engineer
2018/05/29
RED HAT | Daein Park
#rhconvergence
3
AGENDA
●
OpenShift の概要
●
OpenShift と JBoss EAP
●
JBoss EAP の構築( DEMO )
●
アプリケーション構築の TIPs
●
QA
RED HAT | Daein Park
#rhconvergence
4
OpenShift の概要
RED HAT | Daein Park
#rhconvergence
5
OpenShift の簡単なご紹介
●
Enterprise Kubernetes and more
https://www.openshift.com/learn/topics/kubernetes/
●
Product Family
●
OpenShift Online (Multi tenant)
●
OpenShift Dedicated (Single tenant)
●
OpenShift Container Platform ( 本日の対象 )
●
Built on RHEL, Kubernetes, Docker +Alpha
●
Microservice Architecture, Infrastructure as Code
●
DevOps ...
RED HAT | Daein Park
#rhconvergence
6
OpenShift のコアコンセプト
●
Containers and Images
●
Pods and Services
●
Projects and Users
●
Builds and ImageStreams
●
Deployments
●
Routes
●
Persistent Volumes
●
Persistent Volume Claims
RED HAT | Daein Park
#rhconvergence
7
OpenShift のレイヤ構成
RED HAT | Daein Park
#rhconvergence
8
OpenShift のデプロイフロー
●
S2I(Source To Image) はソースコードから Docker イメージをビルドするツールセット
●
ベースイメージにソースを入れて新しいイメージ作成 Speed, Image flexibility, Operational security ...
※ 下記の図は処理フローの説明のため一部処理が省略されております。
RED HAT | Daein Park
#rhconvergence
9
OpenShift と JBoss EAP
RED HAT | Daein Park
#rhconvergence
10
OpenShift で JBoss EAP の構築メリット
●
Java EE のアプリケーションをコンテナ環境で稼働する Best Practice→JBoss EAP
●
RHCC から提供するイメージで簡単に利用可能(+セキュリティ)
●
OpenShift をサポートする機能を提供
●
Automated transaction recovery 機能
●
OpenShift 機能と関連して設定ガイド及び資料が充実
●
関連製品に対しても OpenShift をサポート (AMQ, RHDM, Fuse ...)
RED HAT | Daein Park
#rhconvergence
11
JBoss EAP の構築 (DEMO)
RED HAT | Daein Park
#rhconvergence
12
OpenShift での JBoss EAP 構築
★ 実は 1 行のコマンドで JBoss EAP が構築できます!
# oc new-app eap71-basic-s2i
クラスタも対応済みで追加設定なしで利用できる程度
●
上記のコマンドの背景を理解すると自由に応用可能
●
OpenShift のリソース定義コードを分かるのが IaC の最初一歩
(コマンドで殆ど自動に生成してくれます。修正したいところだけ直すイメージです。)
●
JBoss EAP を利用した Application Development のライフサイクルを DEMO
●
JBoss EAP を OpenShift で構築するフローを確認すると導入時のイメージが明確に
RED HAT | Daein Park
#rhconvergence
13
DEMO 環境
●
OpenShift 構成
●
OpenShift Container Platform v3.9
●
Master ホスト x 1
●
CPU: Core x 4
●
Memory: 8Gi
●
Node ホスト x 3
●
CPU: Core x 2
●
Memory: 4Gi
●
ストレージ構成
●
内部 Service の Pod 用 : NFS
●
Apps の Pod 用 : CNS (GlusterFS)
★iSCSI で Block タイプの Volume を Provision
RED HAT | Daein Park
#rhconvergence
14
DEMO システム構成
●
Application 構成
●
JBoss EAP (Application Server)
●
JBoss EAP v7.1 for OpenShift
●
Httpd v2.4 (Web Server)
●
PostgreSQL v9.2 (DB Server)
●
Management System 構成
●
CI/CD : Jenkins
●
Monitoring : Prometheus
●
Logging : EFK
RED HAT | Daein Park
#rhconvergence
15
DEMO 内容
●
アプリケーション環境を Dev(Build)→Stg(Deploy)→Prod(Deploy) 順に作成
●
S2I による Build, Rolling Update による Deploy
RED HAT | Daein Park
#rhconvergence
16
JBoss EAP for OpenShift イメージ関連設定 #1
●
Jboss EAP for OpenShift イメージを取得する方法
●
Red Hat Registry から直接 PULL する方法
●
それ以外には third-party registry, Satellite 等
●
作業手順
●
Red Hat Container Catalog サイトにアクセス
●
関連イメージを検索して PULL するイメージを選択
●
Get Latest Image タグを選択して関連プラットフォームを選択
●
提示された方法に従ってイメージを取得
RED HAT | Daein Park
#rhconvergence
17
JBoss EAP for OpenShift イメージ関連設定 #2
●
Red Hat Container Catalog
●
RHCC
[ https://access.redhat.com/containers ]
●
日本語の説明ページ
[http://jp-redhat.com/openeye_online/column/oss-note/5894/]
●
セキュリティチームの審査
●
FAQ
RED HAT | Daein Park
#rhconvergence
18
JBoss EAP for OpenShift イメージ関連設定 #3
RED HAT | Daein Park
#rhconvergence
19
JBoss EAP for OpenShift イメージ関連設定 #4
●
RHCC からコピーしたコマンドの実行
●
openshift プロジェクトにインポートすることで共有可能
●
既存 ImageStream 名を指定し、タグでバージョンを指定(バージョンアップも同じ手順)
-- Import the image to openshift namespace
master1~# oc import-image jboss-eap71-openshift:1.1 -n openshift 
--from=registry.access.redhat.com/jboss-eap-7/eap71-openshift:1.1 
--confirm
-- Check the image imported
master1~# oc get is jboss-eap71-openshift -n openshift
-- Tag the latest version
master1~# oc tag jboss-eap71-openshift:1.1 jboss-eap71-openshift:latest -n openshift
RED HAT | Daein Park
#rhconvergence
20
DEMO: Jenkins 環境構築
RED HAT | Daein Park
#rhconvergence
21
DEMO: Jenkins 環境構築 #1
●
各環境の Build(Dev) 及び Deploy(Stg, Prod) のタスク管理
●
stg と prod 環境の Pipeline を利用して BuildConfig を定義( Build はしない)
●
git サーバの webhook で trigger できるように設定
●
必要なリソース : Project, BuildConfg
●
Project
# oc new-project jenkins
●
BuildConfig
# oc create -f <YAMLFILE>
RED HAT | Daein Park
#rhconvergence
22
DEMO: Jenkins 環境構築 #1-1
●
検証環境 (stg) に実施される Build 及び Deploy を定義した Pipeline の BuildConfig
apiVersion: v1
kind: BuildConfig
metadata:
labels:
name: stg-pipeline
name: stg-pipeline
spec:
runPolicy: Serial
strategy:
jenkinsPipelineStrategy:
jenkinsfile: |-
node(''){
stage 'Preparation for Build'
openshiftVerifyBuild(namespace: 'dev', bldCfg: 'petstore-dev')
stage 'Preparation for Deployment'
openshiftVerifyDeployment(namespace: 'stg', depCfg: 'petstore-stg')
stage 'Build by S2I'
openshiftBuild(namespace: 'dev', bldCfg: 'petstore-dev', showBuildLogs: 'true')
stage 'Verify the Deployment'
openshiftVerifyDeployment(namespace: 'stg', depCfg: 'petstore-stg', verifyReplicaCount: 'true')
}
type: JenkinsPipeline
triggers:
- github:
secret: gitsecret
type: GitHub
- generic:
secret: genericsecret
type: Generic
RED HAT | Daein Park
#rhconvergence
23
DEMO: Jenkins 環境構築 #1-2
●
検証環境 (prod) に実施される Deploy を定義した Pipeline の BuildConfig
apiVersion: v1
kind: BuildConfig
metadata:
labels:
name: prod-pipeline
name: prod-pipeline
spec:
runPolicy: Serial
strategy:
jenkinsPipelineStrategy:
jenkinsfile: |-
node(''){
stage 'Preparation for Deployment'
openshiftVerifyDeployment(namespace: 'prod', depCfg: 'petstore-prod')
stage 'Confirmation of Deployment'
input 'Confirmation Required: Do you proceed with this Deployment on the prod system ?'
stage 'Deployment on the Production Env'
openshiftDeploy(namespace: 'prod', depCfg: 'petstore-prod')
stage 'Verify the Deployment'
openshiftVerifyDeployment(namespace: 'prod', depCfg: 'petstore-prod', verifyReplicaCount: 'true')
}
type: JenkinsPipeline
RED HAT | Daein Park
#rhconvergence
24
DEMO:Dev 環境構築
COMPLETED
RED HAT | Daein Park
#rhconvergence
25
DEMO:Dev 環境構築 #1
●
Build 専用環境、 Build した Image を内部 Registry に Push する役割
●
必要なリソース : Project, ImageStream, BuildConfig
●
Project
# oc new-project dev
●
権限付与: jenkins から dev に対して Build 操作する権限として edit ロールを付与
# oc adm policy add-role-to-user edit system:serviceaccount:jenkins:jenkins -n dev
●
ImageStream
# oc create is petstore-dev
●
BuildConfig
●
# oc create -f <YAMLFILE>
RED HAT | Daein Park
#rhconvergence
26
DEMO:Dev 環境構築 #1-1
●
Git リポジトリの Source を利用した Build (S2I) を定義した Dev 環境の BuildConfig
apiVersion: v1
kind: BuildConfig
metadata:
labels:
app: petstore-dev
name: petstore-dev
spec:
failedBuildsHistoryLimit: 5
output:
to:
kind: ImageStreamTag
name: petstore-dev:latest
runPolicy: Serial
source:
git:
uri: http://git.app.example.com/dapark/petstore.git
type: Git
strategy:
sourceStrategy:
from:
kind: ImageStreamTag
name: jboss-eap71-openshift:latest
namespace: openshift
type: Source
successfulBuildsHistoryLimit: 5
triggers:
- type: ConfigChange
- imageChange: {}
type: ImageChange
1 2
RED HAT | Daein Park
#rhconvergence
27
DEMO:Stg 環境構築
COMPLETED COMPLETED
RED HAT | Daein Park
#rhconvergence
28
DEMO:Stg 環境構築 #1
●
Dev で Build された ImageStream を利用して Deploy する検証環境 (stg)
●
必要なリソース : Project, DeploymentConfig (application<petstore>, httpd, postgresql)...
●
Project
# oc new-project stg
●
権限付与 : jekins から stg にデプロイ、 dev からは image pull できる権限設定
# oc policy add-role-to-user edit system:serviceaccount:jenkins:jenkins -n stg
# oc policy add-role-to-group image-puller system:serviceaccounts:stg -n dev
●
Httpd → PostgreSQL → Application<petstore> 順にリソース定義
●
Httpd は Dockerfile を利用してカスタムしたイメージを作成
●
カスタムした Httpd の設定は ConfigMap を利用して利用するように設定
●
PostgreSQL は new-app コマンドで作成 (Template)
RED HAT | Daein Park
#rhconvergence
29
DEMO:Stg 環境構築 #1-1
●
既存 httpd イメージをベース次の仕様に合わせた新しいベースイメージを作成
●
“/etc/httpd/custom.d” 配下の *.conf を反映する設定を追加
●
stg と prod の各環境での httpd の追加設定ファイルは configMap を利用して作成
●
作成された configMap ”は /etc/httpd/custom.d” にマウントされるように実装
●
Httpd の設定変更するたびに再 Build する必要がないし、直感的な管理
●
新しい httpd のベースイメージを Build する Dockerfile
FROM registry.access.redhat.com/rhscl/httpd-24-rhel7:latest
USER 0
RUN mkdir -p /opt/rh/httpd24/root/etc/httpd/custom.d && 
chgrp -R 0 /opt/rh/httpd24/root/etc/httpd/custom.d && 
chmod -R g=u /opt/rh/httpd24/root/etc/httpd/custom.d && 
echo "IncludeOptional custom.d/*.conf" >> /opt/rh/httpd24/root/etc/httpd/conf/httpd.conf
USER 1001
RED HAT | Daein Park
#rhconvergence
30
DEMO:Stg 環境構築 #1-2
●
Httpd のカスタムした Docker イメージを Build して Internal Repository に Push
●
予め作成した Dockerfile で新しい Docker Image を Build
# docker build .
●
Build した Image ID に内部レジストリで利用する新しい tag を作成
# docker tag <IMAGE_ID> docker-registry.default.svc:5000/openshift/httpd-custom:latest
●
Push するため内部レジストリに認証
# docker login -u admin -p $(oc whoami -t) docker-registry.default.svc:5000
●
Build した Image を Push
# docker push docker-registry.default.svc:5000/openshift/httpd-custom:latest
RED HAT | Daein Park
#rhconvergence
31
DEMO:Stg 環境構築 #1-3
●
stg 環境で利用するため作成 httpd の設定ファイルで ConfigMap を作成
# oc create configmap httpd-stg --from-file=stg.conf
●
先程作成した httpd-custom を利用して httpd の Pod を作成
# oc new-app --name=httpd httpd-custom
# oc volume dc/httpd --add --type=configmap --name=httpd-stg 
--configmap-name=httpd-stg --mount-path=/etc/httpd/custom.d
●
stg-petstore.app.example.com で外部公開
# oc expose service httpd --hostname=stg-petstore.app.example.com
●
PostgreSQL は Built-in の Template を利用して作成
# oc new-app -i postgresql:9.2 -e POSTGRESQL_USER=petstore 
-e POSTGRESQL_PASSWORD=petstore -e POSTGRESQL_DATABASE=petstore 
-e POSTGRESQL_ADMIN_PASSWORD=redhat --name postgresql
●
CNS(GlusterFS) を利用して PVC を定義→動的な PV の割り当て
# oc set volumes dc/postgresql --name=postgresql-volume-1 
--claim-name=postgres-pvc --claim-mode=ReadWriteOnce --claim-size=1Gi --claim-class=glusterfs-storage --add --overwrite
# filename: stg.conf
RewriteEngine On
RewriteRule ^/applicationPetstore/(.*) /$1 [PT,QSA,L]
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
Define stg-svc petstore-stg.stg.svc:8080
ProxyPass / http://${stg-svc}/applicationPetstore/
ProxyPassReverse / http://${stg-svc}/applicationPetstore/
ExtFilterDefine title_update mode=output intype=text/html 
cmd="/bin/sed s/Yaps/STAGING/g"
SetOutputFilter title_update
RED HAT | Daein Park
#rhconvergence
32
DEMO:Stg 環境構築 #1-4
●
Httpd の Pod と連携する Service を先に作成
●
Service に付与されるデフォルトのドメインの形式
<Service Name>.<Project Name>.svc
●
Internal load balancer
●
JBoss EAP のクラスタ用の PING も Service で定義される
●
Pod はの追加/除外が実施される (ReadinessProbe でカスタム可能 )
# oc create -f <YAMLFILE>
RED HAT | Daein Park
#rhconvergence
33
DEMO:Stg 環境構築 #1-5
●
petstore-stg は WEB サービス用で petstore-stg-ping はクラスタ用の PING
apiVersion: v1
kind: Service
metadata:
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
labels:
app: petstore-stg
application: petstore-stg
name: petstore-stg-ping
spec:
clusterIP: None
ports:
- name: ping
port: 8888
protocol: TCP
targetPort: 8888
selector:
app: petstore-stg
deploymentconfig: petstore-stg
type: ClusterIP
apiVersion: v1
kind: Service
metadata:
labels:
app: petstore-stg
name: petstore-stg
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: petstore-stg
deploymentconfig: petstore-stg
type: ClusterIP
RED HAT | Daein Park
#rhconvergence
34
spec:
containers:
- env:
- name: JGROUPS_PING_PROTOCOL
value: openshift.DNS_PING
- name: OPENSHIFT_DNS_PING_SERVICE_NAME
value: petstore-stg-ping
- name: OPENSHIFT_DNS_PING_SERVICE_PORT
value: "8888"
- name: MQ_CLUSTER_PASSWORD
value: change_the_password
- name: MQ_QUEUES
- name: MQ_TOPICS
- name: JGROUPS_CLUSTER_PASSWORD
value: change_the_password
- name: AUTO_DEPLOY_EXPLODED
value: "false"
image: “dev/petstore-dev:latest”
imagePullPolicy: Always
name: petstore
ports:
- containerPort: 8778
name: jolokia
protocol: TCP
- containerPort: 8080
name: http
protocol: TCP
- containerPort: 8888
name: ping
protocol: TCP
DEMO:Stg 環境構築 #1-6
●
JBoss EAP の Pod を作成
●
空白なしで YAML ファイルに保存
# oc create -f <YAMLFILE>
apiVersion: v1
kind: DeploymentConfig
metadata:
generation: 1
labels:
app: petstore-stg
name: petstore-stg
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
app: petstore-stg
deploymentconfig: petstore-stg
strategy:
activeDeadlineSeconds: 21600
rollingParams:
intervalSeconds: 1
maxSurge: 25%
maxUnavailable: 25%
timeoutSeconds: 600
updatePeriodSeconds: 1
type: Rolling
template:
metadata:
labels:
app: petstore-stg
deploymentconfig: petstore-stg
1 2
RED HAT | Daein Park
#rhconvergence
35
DEMO:Stg 環境構築 #1-7
●
LivenessProbe: Pod の再起動
●
ReadinessProb: Pod へのトラフィック( Service )
●
Resources.limits: 利用率が制限値を超えると oom-killer で殺されて再起動
livenessProbe:
exec:
command:
- /bin/bash
- -c
- /opt/eap/bin/livenessProbe.sh
failureThreshold: 3
initialDelaySeconds: 60
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
httpGet:
path: /applicationPetstore/shopping/main.xhtml
port: 8080
initialDelaySeconds: 20
resources:
limits:
memory: 1Gi
TerminationGracePeriodSeconds: 30
triggers:
- type: ConfigChange
- imageChangeParams:
automatic: true
containerNames:
- petstore
from:
kind: ImageStreamTag
name: petstore-dev:latest
namespace: dev
type: ImageChange
3 4
RED HAT | Daein Park
#rhconvergence
36
DEMO:Prod 環境構築
COMPLETED COMPLETED COMPLETED
RED HAT | Daein Park
#rhconvergence
37
DEMO:Prod 環境構築 #1
●
stg 環境で検証済みの Image(ImageStream) でリリースされる商用環境 (Prod)
●
必要なリソース : Template
●
既存環境をから作成した Template で一式のリソースを一括で作成 ( これが基本 )
●
Web Console でも簡単に利用可能(一時的な環境、 Branch 環境の複製に便利等)
●
Project
# oc new-project prod
●
権限設定: jekins から prod にデプロイ、 dev からは image pull できる権限設定
# oc policy add-role-to-user edit system:serviceaccount:jenkins:jenkins -n prod
# oc policy add-role-to-group image-puller system:serviceaccounts:prod -n dev
●
Template 、 ${VAR} で環境依存情報等を変数にする修正が必要 (stg から取得 )
# oc export route,svc,dc,pvc,configmap -n stg --as-template=petstore > petstore-template.yml
RED HAT | Daein Park
#rhconvergence
38
DEMO:Prod 環境構築 #1-1
●
petstore-template.yaml 、定義の記載の間に空白なしで 1 つのファイルにしてご利用ください。
apiVersion: v1
kind: Template
metadata:
name: petstore
annotations:
description: "PetStore Application for Java EE DEMO"
iconClass: icon-eap
openshift.io/display-name: PetStore with JBoss EAP 7.1 (https)
parameters:
- name: APP_NAME
value: petstore-prod
description: "The Application name"
- name: HOSTNAME
value: "FQDN hostname"
required: true
description: "The hostname for external access point"
objects:
- apiVersion: v1
kind: Route
metadata:
labels:
app: httpd
name: httpd
spec:
host: ${HOSTNAME}
port:
targetPort: 8080-tcp
to:
kind: Service
name: httpd
- apiVersion: v1
kind: Service
metadata:
labels:
app: httpd
name: httpd
spec:
ports:
- name: 8080-tcp
port: 8080
protocol: TCP
targetPort: 8080
- name: 8443-tcp
port: 8443
protocol: TCP
targetPort: 8443
selector:
app: httpd
deploymentconfig: httpd
type: ClusterIP
1 2
RED HAT | Daein Park
#rhconvergence
39
- apiVersion: v1
kind: Service
metadata:
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"
labels:
app: ${APP_NAME}
application: ${APP_NAME}
name: ${APP_NAME}-ping
spec:
clusterIP: None
ports:
- name: ping
port: 8888
protocol: TCP
targetPort: 8888
selector:
app: ${APP_NAME}
deploymentconfig: ${APP_NAME}
type: ClusterIP
DEMO:Prod 環境構築 #1-2
●
petstore-template.yaml
- apiVersion: v1
kind: Service
metadata:
labels:
app: ${APP_NAME}
name: ${APP_NAME}
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: ${APP_NAME}
deploymentconfig: ${APP_NAME}
type: ClusterIP
3 4
RED HAT | Daein Park
#rhconvergence
40
DEMO:Prod 環境構築 #1-3
●
petstore-template.yaml
- apiVersion: v1
kind: Service
metadata:
labels:
app: postgresql
name: postgresql
spec:
ports:
- name: 5432-tcp
port: 5432
protocol: TCP
targetPort: 5432
selector:
app: postgresql
deploymentconfig: postgresql
type: ClusterIP
- apiVersion: v1
kind: DeploymentConfig
metadata:
labels:
app: httpd
name: httpd
spec:
replicas: 1
selector:
app: httpd
deploymentconfig: httpd
template:
metadata:
labels:
app: httpd
deploymentconfig: httpd
spec:
containers:
- imagePullPolicy: Always
image: "openshift/httpd-custom:latest"
name: httpd
ports:
- containerPort: 8080
protocol: TCP
- containerPort: 8443
protocol: TCP
65
RED HAT | Daein Park
#rhconvergence
41
DEMO:Prod 環境構築 #1-4
●
petstore-template.yaml
volumeMounts:
- mountPath: /etc/httpd/custom.d
name: httpd-config
volumes:
- configMap:
defaultMode: 420
name: httpd-config
name: httpd-config
test: false
triggers:
- type: ConfigChange
- imageChangeParams:
automatic: true
containerNames:
- httpd
from:
kind: ImageStreamTag
name: httpd-custom:latest
namespace: openshift
type: ImageChange
7 6
- apiVersion: v1
kind: DeploymentConfig
metadata:
labels:
app: ${APP_NAME}
name: ${APP_NAME}
spec:
replicas: 1
selector:
app: ${APP_NAME}
deploymentconfig: ${APP_NAME}
strategy:
rollingParams:
intervalSeconds: 1
maxSurge: 25%
maxUnavailable: 25%
timeoutSeconds: 600
updatePeriodSeconds: 1
type: Rolling
template:
metadata:
labels:
app: ${APP_NAME}
deploymentconfig: ${APP_NAME}
spec:
containers:
8
RED HAT | Daein Park
#rhconvergence
42
livenessProbe:
exec:
command:
- /bin/bash
- -c
- /opt/eap/bin/livenessProbe.sh
initialDelaySeconds: 60
readinessProbe:
httpGet:
path: /applicationPetstore/shopping/main.xhtml
port: 8080
initialDelaySeconds: 20
resources:
limits:
memory: 1Gi
TerminationGracePeriodSeconds: 30
triggers:
- type: ConfigChange
- imageChangeParams:
automatic: false
containerNames:
- petstore
from:
kind: ImageStreamTag
name: petstore-dev:latest
namespace: dev
type: ImageChange
- env:
- name: JGROUPS_PING_PROTOCOL
value: openshift.DNS_PING
- name: OPENSHIFT_DNS_PING_SERVICE_NAME
value: ${APP_NAME}-ping
- name: OPENSHIFT_DNS_PING_SERVICE_PORT
value: "8888"
- name: MQ_CLUSTER_PASSWORD
value: change_the_password
- name: MQ_QUEUES
- name: MQ_TOPICS
- name: JGROUPS_CLUSTER_PASSWORD
value: change_the_password
- name: AUTO_DEPLOY_EXPLODED
value: "false"
image: “dev/petstore-dev:latest”
imagePullPolicy: Always
name: petstore
ports:
- containerPort: 8778
name: jolokia
protocol: TCP
- containerPort: 8080
name: http
protocol: TCP
- containerPort: 8888
name: ping
protocol: TCP
DEMO:Prod 環境構築 #1-5
●
petstore-template.yaml
9 10
RED HAT | Daein Park
#rhconvergence
43
DEMO:Prod 環境構築 #1-6●
petstore-template.yaml
- apiVersion: v1
kind: DeploymentConfig
metadata:
labels:
app: postgresql
name: postgresql
spec:
replicas: 1
selector:
app: postgresql
deploymentconfig: postgresql
template:
metadata:
labels:
app: postgresql
deploymentconfig: postgresql
spec:
containers:
- env:
- name: POSTGRESQL_ADMIN_PASSWORD
value: redhat
- name: POSTGRESQL_DATABASE
value: petstore
- name: POSTGRESQL_PASSWORD
value: petstore
- name: POSTGRESQL_USER
value: petstore
image: "openshift/postgresql:9.2"
imagePullPolicy: IfNotPresent
name: postgresql
ports:
- containerPort: 5432
protocol: TCP
volumeMounts:
- mountPath: /var/lib/pgsql/data
name: postgresql-volume-1
volumes:
- name: postgresql-volume-1
persistentVolumeClaim:
claimName: postgres-pvc
triggers:
- type: ConfigChange
- imageChangeParams:
automatic: true
containerNames:
- postgresql
from:
kind: ImageStreamTag
name: postgresql:9.2
namespace: openshift
type: ImageChange
11 12
RED HAT | Daein Park
#rhconvergence
44
DEMO:Prod 環境構築 #1-7
●
petstore-template.yaml
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: glusterfs-storage
- apiVersion: v1
data:
prod.conf: |
# filename: prod.conf
# Static file URL rewrite
RewriteEngine On
RewriteRule ^/applicationPetstore/(.*) /$1 [PT,QSA,L]
# Proxy to application server
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
Define prod-svc petstore-prod.prod.svc:8080
ProxyPass / http://${prod-svc}/applicationPetstore/
ProxyPassReverse / http://${prod-svc}/applicationPetstore/
# Output filter for identification
ExtFilterDefine title_update mode=output intype=text/html 
cmd="/bin/sed s/Yaps/PRODUCTION/g"
SetOutputFilter title_update
kind: ConfigMap
metadata:
name: httpd-config
13 14
RED HAT | Daein Park
#rhconvergence
45
DEMO:Prod 環境構築 #1-8
●
Template を openshift プロジェクトに作成(共有)
# oc create -f petstore-template.yml -n openshift
●
Template を利用して Prod の環境を構築
# oc process petstore -n openshift -p APP_NAME=petstore-prod 
-p HOSTNAME=prod-petstore.app.example.com | oc create -f -
●
手動で JBoss EAP の Pod を起動
# oc rollout latest dc/petstore-prod
●
Scale Up 1 → 3
# oc scale --replicas=3 dc/petstore-prod
RED HAT | Daein Park
#rhconvergence
46
DEMO:Prod 環境構築 #1-9
●
Web Console, Service Catalog (Template Service Broker)
RED HAT | Daein Park
#rhconvergence
47
DEMO 内容 (再掲)
●
Application 構成を Dev→Stg→Prod →順に作成 完了
●
Build(S2I), Rolling Update による Deploy
RED HAT | Daein Park
#rhconvergence
48
アプリケーションの構築 TIPs
RED HAT | Daein Park
#rhconvergence
49
OpenShift でよく発生する問題
実はコンテナ環境だから OpenShift だから発生する問題ではないです。
●
アプリケーションの Pod を Scale したら追加される Pod が起動失敗する
●
急停止された DB の Pod が次回起動時に自動リカバリーできなくて起動失敗する
●
Pod の暴走によって node ホスト全体の Pod 移動が発生する
●
アプリケーションが DB 等依存サービスがあったら起動順序の制御はどうするのか?
RED HAT | Daein Park
#rhconvergence
50
アプリケーションの Pod を Scale したら追加される Pod が起動失敗する
●
アプリケーションで冗長構成が対応できるか確認
●
1 つの Pod では問題なかったのに Scale すると Pod が起動できなくなる
●
ログをみるとリソースへのロックや冗長構成に対応していないケース
RED HAT | Daein Park
#rhconvergence
51
急停止された DB の Pod が次回起動時に自動リカバリーできなくて起動失敗する
●
NFS で PV を作成して利用することが原因
●
殆どの RDBMS が該当
REDO ログ系は必ず DISK に保存される担保がないと異常停止されたらデータの Recovery ができない
そのため fsync/fdatasync で DISK に即時に書き込むよう制御する必要がある
●
Block 系の Storage を専用で利用する必要があります。
●
ReadWriteOnce の PV を作成して利用
RED HAT | Daein Park
#rhconvergence
52
Pod の暴走によって node ホスト全体の Pod 移動が発生する
●
メモリの場合、閾値を超えたら OOM-Killer 起動される。
●
Requests == Limits
●
CPU は Requests の設定を実施しましょう。
●
性能テスト等で事前に閾値を決めておきましょう。
resources:
requests:
memory: "512Mi"
cpu: "1000m"
limits:
memory: "512Mi"
cpu: "2000m"
RED HAT | Daein Park
#rhconvergence
53
アプリケーションが DB 等依存サービスがあったら起動順序の制御はどうするのか?
●
アプリケーションを構成するコンポーネント間の起動順序 == 依存関係
●
Liveness, ReadinessProbe を適切に設定して対応可能
●
LivenessProbe: Pod に再起動する必要か監視
●
DB サービスが稼働していない場合には AP サーバを再起動させる
●
ReadinessProbe: Pod のサービスが外部からアクセスできる状態か監視
●
WEB サーバは AP サーバで該当ページが表示できない限り外部トラフィックを受けない
●
両方を組み合わせれば自動リカバリーが実現できる
<1> AP サーバがアクセスできない
<2> 外部からのアクセス遮断
<3> 復旧しないと再起動
<4> アクセス可能になったら再度外部公開等 ⇒ <1>
RED HAT | Daein Park
#rhconvergence
54
QA
RED HAT | Daein Park
#rhconvergence
55
参考
●
OpenShift のコアーコンセプト [https://docs.openshift.com/container-platform/3.9/architecture/core_concepts/index.html]
●
OpenShift のレイヤ構成 [https://docs.openshift.com/container-platform/3.9/architecture/index.html]
●
OpenShift のデプロイフロー [https://blog.openshift.com/builds-deployments-services-v3/]
●
OpenShift v3 と source-to-image (s2i) [https://qiita.com/nak3/items/6407c01cc2d1f153c0f1]
●
RED HAT JBOSS ENTERPRISE APPLICATION PLATFORM FOR OPENSHIFT
[https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html/red_hat_jboss_enterprise_application_platform_for_openshift/]
●
Create Your Own Build Pipelines with OpenShift 3.3 [https://blog.openshift.com/create-build-pipelines-openshift-3-3/]
●
PetStore Sample Application [https://github.com/agoncal/agoncal-application-petstore-ee7]
●
Kubernetes アンチパタン [http://nekop.github.io/slides/hbstudy78.html#/]
●
OpenShift の作業全般 [https://docs.openshift.com/container-platform/3.9/welcome/index.html]
●
Jboss Transaction Recovery
[https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html-single/red_hat_jboss_enterprise_application_platform_for_openshift/#transaction_recovery_demo]
●
OpenShift CNS で gluster-block を有効化する [https://nekop.hatenablog.com/entry/2018/03/30/111737]

More Related Content

What's hot

What's hot (20)

Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
 
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
Javaコードが速く実⾏される秘密 - JITコンパイラ⼊⾨(JJUG CCC 2020 Fall講演資料)
 
忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver忙しい人の5分で分かるDocker 2017年春Ver
忙しい人の5分で分かるDocker 2017年春Ver
 
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
Grafana LokiではじめるKubernetesロギングハンズオン(NTT Tech Conference #4 ハンズオン資料)
 
Grafana Dashboards as Code
Grafana Dashboards as CodeGrafana Dashboards as Code
Grafana Dashboards as Code
 
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
最適なOpenJDKディストリビューションの選び方 #codetokyo19B3 #ccc_l5
 
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
PostgreSQLをKubernetes上で活用するためのOperator紹介!(Cloud Native Database Meetup #3 発表資料)
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
Open Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere LibertyOpen Liberty: オープンソースになったWebSphere Liberty
Open Liberty: オープンソースになったWebSphere Liberty
 
Mavenの真実とウソ
Mavenの真実とウソMavenの真実とウソ
Mavenの真実とウソ
 
JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方JDKの選択肢とサーバーサイドでの選び方
JDKの選択肢とサーバーサイドでの選び方
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
Oracle Database (CDB) on Docker を動かしてみる
Oracle Database (CDB) on Docker を動かしてみるOracle Database (CDB) on Docker を動かしてみる
Oracle Database (CDB) on Docker を動かしてみる
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
RDF Semantic Graph「RDF 超入門」
RDF Semantic Graph「RDF 超入門」RDF Semantic Graph「RDF 超入門」
RDF Semantic Graph「RDF 超入門」
 
Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門Linux女子部 systemd徹底入門
Linux女子部 systemd徹底入門
 
containerdの概要と最近の機能
containerdの概要と最近の機能containerdの概要と最近の機能
containerdの概要と最近の機能
 
アーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーションアーキテクチャから理解するPostgreSQLのレプリケーション
アーキテクチャから理解するPostgreSQLのレプリケーション
 

Similar to OpenShiftでJBoss EAP構築

試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift
Etsuji Nakai
 
130329 04
130329 04130329 04
130329 04
openrtm
 
20130329 rtm4
20130329 rtm420130329 rtm4
20130329 rtm4
openrtm
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
Hideharu MATSUFUJI
 
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
Makoto Yamazaki
 

Similar to OpenShiftでJBoss EAP構築 (20)

はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
 
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
CI/CD Pipeline を考える 〜KubeCon 2017 + CyberAgent の最大公倍数〜
 
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
Recap: Modern CI/CD with Tekton and Prow Automated via Jenkins X - Kubernetes...
 
Db2 Warehouse Spark利用ガイド チュートリアル編
Db2 Warehouse Spark利用ガイド チュートリアル編Db2 Warehouse Spark利用ガイド チュートリアル編
Db2 Warehouse Spark利用ガイド チュートリアル編
 
成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略成長を加速する minne の技術基盤戦略
成長を加速する minne の技術基盤戦略
 
node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成node-gypを使ったネイティブモジュールの作成
node-gypを使ったネイティブモジュールの作成
 
Houdini 製品概要
Houdini 製品概要 Houdini 製品概要
Houdini 製品概要
 
20170311 Developing & Deploying .NET Core on Linux
20170311 Developing & Deploying .NET Core on Linux20170311 Developing & Deploying .NET Core on Linux
20170311 Developing & Deploying .NET Core on Linux
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift試して学べるクラウド技術! OpenShift
試して学べるクラウド技術! OpenShift
 
130329 04
130329 04130329 04
130329 04
 
20130329 rtm4
20130329 rtm420130329 rtm4
20130329 rtm4
 
OpenShift v3 Technical Overview
OpenShift v3 Technical OverviewOpenShift v3 Technical Overview
OpenShift v3 Technical Overview
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力
 
AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境AWSとGCPを使用したインフラ環境
AWSとGCPを使用したインフラ環境
 
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
まっつんチャレンジ OSC出張編 45分でわかる PHP+Eclipseによるテスト駆動開発環境の構築
 
Android App Development with Gradle & Android Studio
Android App Development with Gradle & Android StudioAndroid App Development with Gradle & Android Studio
Android App Development with Gradle & Android Studio
 
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
密着! nibohsiデプロイ 13:00-13:05 - railsアプリのデプロイ事例 -
 
Wasm blazor and wasi 2
Wasm blazor and wasi 2Wasm blazor and wasi 2
Wasm blazor and wasi 2
 
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方20150425 DroidKaigi つかえるGradleプロジェクトの作り方
20150425 DroidKaigi つかえるGradleプロジェクトの作り方
 

OpenShiftでJBoss EAP構築

  • 1. RED HAT | Daein Park #rhconvergence 1 Red Hat Customer Convergence #rhconvergence
  • 2. RED HAT | Daein Park #rhconvergence 2 OpenShift で JBoss EAP 構築 Daein Park Technical Support Engineer 2018/05/29
  • 3. RED HAT | Daein Park #rhconvergence 3 AGENDA ● OpenShift の概要 ● OpenShift と JBoss EAP ● JBoss EAP の構築( DEMO ) ● アプリケーション構築の TIPs ● QA
  • 4. RED HAT | Daein Park #rhconvergence 4 OpenShift の概要
  • 5. RED HAT | Daein Park #rhconvergence 5 OpenShift の簡単なご紹介 ● Enterprise Kubernetes and more https://www.openshift.com/learn/topics/kubernetes/ ● Product Family ● OpenShift Online (Multi tenant) ● OpenShift Dedicated (Single tenant) ● OpenShift Container Platform ( 本日の対象 ) ● Built on RHEL, Kubernetes, Docker +Alpha ● Microservice Architecture, Infrastructure as Code ● DevOps ...
  • 6. RED HAT | Daein Park #rhconvergence 6 OpenShift のコアコンセプト ● Containers and Images ● Pods and Services ● Projects and Users ● Builds and ImageStreams ● Deployments ● Routes ● Persistent Volumes ● Persistent Volume Claims
  • 7. RED HAT | Daein Park #rhconvergence 7 OpenShift のレイヤ構成
  • 8. RED HAT | Daein Park #rhconvergence 8 OpenShift のデプロイフロー ● S2I(Source To Image) はソースコードから Docker イメージをビルドするツールセット ● ベースイメージにソースを入れて新しいイメージ作成 Speed, Image flexibility, Operational security ... ※ 下記の図は処理フローの説明のため一部処理が省略されております。
  • 9. RED HAT | Daein Park #rhconvergence 9 OpenShift と JBoss EAP
  • 10. RED HAT | Daein Park #rhconvergence 10 OpenShift で JBoss EAP の構築メリット ● Java EE のアプリケーションをコンテナ環境で稼働する Best Practice→JBoss EAP ● RHCC から提供するイメージで簡単に利用可能(+セキュリティ) ● OpenShift をサポートする機能を提供 ● Automated transaction recovery 機能 ● OpenShift 機能と関連して設定ガイド及び資料が充実 ● 関連製品に対しても OpenShift をサポート (AMQ, RHDM, Fuse ...)
  • 11. RED HAT | Daein Park #rhconvergence 11 JBoss EAP の構築 (DEMO)
  • 12. RED HAT | Daein Park #rhconvergence 12 OpenShift での JBoss EAP 構築 ★ 実は 1 行のコマンドで JBoss EAP が構築できます! # oc new-app eap71-basic-s2i クラスタも対応済みで追加設定なしで利用できる程度 ● 上記のコマンドの背景を理解すると自由に応用可能 ● OpenShift のリソース定義コードを分かるのが IaC の最初一歩 (コマンドで殆ど自動に生成してくれます。修正したいところだけ直すイメージです。) ● JBoss EAP を利用した Application Development のライフサイクルを DEMO ● JBoss EAP を OpenShift で構築するフローを確認すると導入時のイメージが明確に
  • 13. RED HAT | Daein Park #rhconvergence 13 DEMO 環境 ● OpenShift 構成 ● OpenShift Container Platform v3.9 ● Master ホスト x 1 ● CPU: Core x 4 ● Memory: 8Gi ● Node ホスト x 3 ● CPU: Core x 2 ● Memory: 4Gi ● ストレージ構成 ● 内部 Service の Pod 用 : NFS ● Apps の Pod 用 : CNS (GlusterFS) ★iSCSI で Block タイプの Volume を Provision
  • 14. RED HAT | Daein Park #rhconvergence 14 DEMO システム構成 ● Application 構成 ● JBoss EAP (Application Server) ● JBoss EAP v7.1 for OpenShift ● Httpd v2.4 (Web Server) ● PostgreSQL v9.2 (DB Server) ● Management System 構成 ● CI/CD : Jenkins ● Monitoring : Prometheus ● Logging : EFK
  • 15. RED HAT | Daein Park #rhconvergence 15 DEMO 内容 ● アプリケーション環境を Dev(Build)→Stg(Deploy)→Prod(Deploy) 順に作成 ● S2I による Build, Rolling Update による Deploy
  • 16. RED HAT | Daein Park #rhconvergence 16 JBoss EAP for OpenShift イメージ関連設定 #1 ● Jboss EAP for OpenShift イメージを取得する方法 ● Red Hat Registry から直接 PULL する方法 ● それ以外には third-party registry, Satellite 等 ● 作業手順 ● Red Hat Container Catalog サイトにアクセス ● 関連イメージを検索して PULL するイメージを選択 ● Get Latest Image タグを選択して関連プラットフォームを選択 ● 提示された方法に従ってイメージを取得
  • 17. RED HAT | Daein Park #rhconvergence 17 JBoss EAP for OpenShift イメージ関連設定 #2 ● Red Hat Container Catalog ● RHCC [ https://access.redhat.com/containers ] ● 日本語の説明ページ [http://jp-redhat.com/openeye_online/column/oss-note/5894/] ● セキュリティチームの審査 ● FAQ
  • 18. RED HAT | Daein Park #rhconvergence 18 JBoss EAP for OpenShift イメージ関連設定 #3
  • 19. RED HAT | Daein Park #rhconvergence 19 JBoss EAP for OpenShift イメージ関連設定 #4 ● RHCC からコピーしたコマンドの実行 ● openshift プロジェクトにインポートすることで共有可能 ● 既存 ImageStream 名を指定し、タグでバージョンを指定(バージョンアップも同じ手順) -- Import the image to openshift namespace master1~# oc import-image jboss-eap71-openshift:1.1 -n openshift --from=registry.access.redhat.com/jboss-eap-7/eap71-openshift:1.1 --confirm -- Check the image imported master1~# oc get is jboss-eap71-openshift -n openshift -- Tag the latest version master1~# oc tag jboss-eap71-openshift:1.1 jboss-eap71-openshift:latest -n openshift
  • 20. RED HAT | Daein Park #rhconvergence 20 DEMO: Jenkins 環境構築
  • 21. RED HAT | Daein Park #rhconvergence 21 DEMO: Jenkins 環境構築 #1 ● 各環境の Build(Dev) 及び Deploy(Stg, Prod) のタスク管理 ● stg と prod 環境の Pipeline を利用して BuildConfig を定義( Build はしない) ● git サーバの webhook で trigger できるように設定 ● 必要なリソース : Project, BuildConfg ● Project # oc new-project jenkins ● BuildConfig # oc create -f <YAMLFILE>
  • 22. RED HAT | Daein Park #rhconvergence 22 DEMO: Jenkins 環境構築 #1-1 ● 検証環境 (stg) に実施される Build 及び Deploy を定義した Pipeline の BuildConfig apiVersion: v1 kind: BuildConfig metadata: labels: name: stg-pipeline name: stg-pipeline spec: runPolicy: Serial strategy: jenkinsPipelineStrategy: jenkinsfile: |- node(''){ stage 'Preparation for Build' openshiftVerifyBuild(namespace: 'dev', bldCfg: 'petstore-dev') stage 'Preparation for Deployment' openshiftVerifyDeployment(namespace: 'stg', depCfg: 'petstore-stg') stage 'Build by S2I' openshiftBuild(namespace: 'dev', bldCfg: 'petstore-dev', showBuildLogs: 'true') stage 'Verify the Deployment' openshiftVerifyDeployment(namespace: 'stg', depCfg: 'petstore-stg', verifyReplicaCount: 'true') } type: JenkinsPipeline triggers: - github: secret: gitsecret type: GitHub - generic: secret: genericsecret type: Generic
  • 23. RED HAT | Daein Park #rhconvergence 23 DEMO: Jenkins 環境構築 #1-2 ● 検証環境 (prod) に実施される Deploy を定義した Pipeline の BuildConfig apiVersion: v1 kind: BuildConfig metadata: labels: name: prod-pipeline name: prod-pipeline spec: runPolicy: Serial strategy: jenkinsPipelineStrategy: jenkinsfile: |- node(''){ stage 'Preparation for Deployment' openshiftVerifyDeployment(namespace: 'prod', depCfg: 'petstore-prod') stage 'Confirmation of Deployment' input 'Confirmation Required: Do you proceed with this Deployment on the prod system ?' stage 'Deployment on the Production Env' openshiftDeploy(namespace: 'prod', depCfg: 'petstore-prod') stage 'Verify the Deployment' openshiftVerifyDeployment(namespace: 'prod', depCfg: 'petstore-prod', verifyReplicaCount: 'true') } type: JenkinsPipeline
  • 24. RED HAT | Daein Park #rhconvergence 24 DEMO:Dev 環境構築 COMPLETED
  • 25. RED HAT | Daein Park #rhconvergence 25 DEMO:Dev 環境構築 #1 ● Build 専用環境、 Build した Image を内部 Registry に Push する役割 ● 必要なリソース : Project, ImageStream, BuildConfig ● Project # oc new-project dev ● 権限付与: jenkins から dev に対して Build 操作する権限として edit ロールを付与 # oc adm policy add-role-to-user edit system:serviceaccount:jenkins:jenkins -n dev ● ImageStream # oc create is petstore-dev ● BuildConfig ● # oc create -f <YAMLFILE>
  • 26. RED HAT | Daein Park #rhconvergence 26 DEMO:Dev 環境構築 #1-1 ● Git リポジトリの Source を利用した Build (S2I) を定義した Dev 環境の BuildConfig apiVersion: v1 kind: BuildConfig metadata: labels: app: petstore-dev name: petstore-dev spec: failedBuildsHistoryLimit: 5 output: to: kind: ImageStreamTag name: petstore-dev:latest runPolicy: Serial source: git: uri: http://git.app.example.com/dapark/petstore.git type: Git strategy: sourceStrategy: from: kind: ImageStreamTag name: jboss-eap71-openshift:latest namespace: openshift type: Source successfulBuildsHistoryLimit: 5 triggers: - type: ConfigChange - imageChange: {} type: ImageChange 1 2
  • 27. RED HAT | Daein Park #rhconvergence 27 DEMO:Stg 環境構築 COMPLETED COMPLETED
  • 28. RED HAT | Daein Park #rhconvergence 28 DEMO:Stg 環境構築 #1 ● Dev で Build された ImageStream を利用して Deploy する検証環境 (stg) ● 必要なリソース : Project, DeploymentConfig (application<petstore>, httpd, postgresql)... ● Project # oc new-project stg ● 権限付与 : jekins から stg にデプロイ、 dev からは image pull できる権限設定 # oc policy add-role-to-user edit system:serviceaccount:jenkins:jenkins -n stg # oc policy add-role-to-group image-puller system:serviceaccounts:stg -n dev ● Httpd → PostgreSQL → Application<petstore> 順にリソース定義 ● Httpd は Dockerfile を利用してカスタムしたイメージを作成 ● カスタムした Httpd の設定は ConfigMap を利用して利用するように設定 ● PostgreSQL は new-app コマンドで作成 (Template)
  • 29. RED HAT | Daein Park #rhconvergence 29 DEMO:Stg 環境構築 #1-1 ● 既存 httpd イメージをベース次の仕様に合わせた新しいベースイメージを作成 ● “/etc/httpd/custom.d” 配下の *.conf を反映する設定を追加 ● stg と prod の各環境での httpd の追加設定ファイルは configMap を利用して作成 ● 作成された configMap ”は /etc/httpd/custom.d” にマウントされるように実装 ● Httpd の設定変更するたびに再 Build する必要がないし、直感的な管理 ● 新しい httpd のベースイメージを Build する Dockerfile FROM registry.access.redhat.com/rhscl/httpd-24-rhel7:latest USER 0 RUN mkdir -p /opt/rh/httpd24/root/etc/httpd/custom.d && chgrp -R 0 /opt/rh/httpd24/root/etc/httpd/custom.d && chmod -R g=u /opt/rh/httpd24/root/etc/httpd/custom.d && echo "IncludeOptional custom.d/*.conf" >> /opt/rh/httpd24/root/etc/httpd/conf/httpd.conf USER 1001
  • 30. RED HAT | Daein Park #rhconvergence 30 DEMO:Stg 環境構築 #1-2 ● Httpd のカスタムした Docker イメージを Build して Internal Repository に Push ● 予め作成した Dockerfile で新しい Docker Image を Build # docker build . ● Build した Image ID に内部レジストリで利用する新しい tag を作成 # docker tag <IMAGE_ID> docker-registry.default.svc:5000/openshift/httpd-custom:latest ● Push するため内部レジストリに認証 # docker login -u admin -p $(oc whoami -t) docker-registry.default.svc:5000 ● Build した Image を Push # docker push docker-registry.default.svc:5000/openshift/httpd-custom:latest
  • 31. RED HAT | Daein Park #rhconvergence 31 DEMO:Stg 環境構築 #1-3 ● stg 環境で利用するため作成 httpd の設定ファイルで ConfigMap を作成 # oc create configmap httpd-stg --from-file=stg.conf ● 先程作成した httpd-custom を利用して httpd の Pod を作成 # oc new-app --name=httpd httpd-custom # oc volume dc/httpd --add --type=configmap --name=httpd-stg --configmap-name=httpd-stg --mount-path=/etc/httpd/custom.d ● stg-petstore.app.example.com で外部公開 # oc expose service httpd --hostname=stg-petstore.app.example.com ● PostgreSQL は Built-in の Template を利用して作成 # oc new-app -i postgresql:9.2 -e POSTGRESQL_USER=petstore -e POSTGRESQL_PASSWORD=petstore -e POSTGRESQL_DATABASE=petstore -e POSTGRESQL_ADMIN_PASSWORD=redhat --name postgresql ● CNS(GlusterFS) を利用して PVC を定義→動的な PV の割り当て # oc set volumes dc/postgresql --name=postgresql-volume-1 --claim-name=postgres-pvc --claim-mode=ReadWriteOnce --claim-size=1Gi --claim-class=glusterfs-storage --add --overwrite # filename: stg.conf RewriteEngine On RewriteRule ^/applicationPetstore/(.*) /$1 [PT,QSA,L] ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> Define stg-svc petstore-stg.stg.svc:8080 ProxyPass / http://${stg-svc}/applicationPetstore/ ProxyPassReverse / http://${stg-svc}/applicationPetstore/ ExtFilterDefine title_update mode=output intype=text/html cmd="/bin/sed s/Yaps/STAGING/g" SetOutputFilter title_update
  • 32. RED HAT | Daein Park #rhconvergence 32 DEMO:Stg 環境構築 #1-4 ● Httpd の Pod と連携する Service を先に作成 ● Service に付与されるデフォルトのドメインの形式 <Service Name>.<Project Name>.svc ● Internal load balancer ● JBoss EAP のクラスタ用の PING も Service で定義される ● Pod はの追加/除外が実施される (ReadinessProbe でカスタム可能 ) # oc create -f <YAMLFILE>
  • 33. RED HAT | Daein Park #rhconvergence 33 DEMO:Stg 環境構築 #1-5 ● petstore-stg は WEB サービス用で petstore-stg-ping はクラスタ用の PING apiVersion: v1 kind: Service metadata: annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" labels: app: petstore-stg application: petstore-stg name: petstore-stg-ping spec: clusterIP: None ports: - name: ping port: 8888 protocol: TCP targetPort: 8888 selector: app: petstore-stg deploymentconfig: petstore-stg type: ClusterIP apiVersion: v1 kind: Service metadata: labels: app: petstore-stg name: petstore-stg spec: ports: - port: 8080 protocol: TCP targetPort: 8080 selector: app: petstore-stg deploymentconfig: petstore-stg type: ClusterIP
  • 34. RED HAT | Daein Park #rhconvergence 34 spec: containers: - env: - name: JGROUPS_PING_PROTOCOL value: openshift.DNS_PING - name: OPENSHIFT_DNS_PING_SERVICE_NAME value: petstore-stg-ping - name: OPENSHIFT_DNS_PING_SERVICE_PORT value: "8888" - name: MQ_CLUSTER_PASSWORD value: change_the_password - name: MQ_QUEUES - name: MQ_TOPICS - name: JGROUPS_CLUSTER_PASSWORD value: change_the_password - name: AUTO_DEPLOY_EXPLODED value: "false" image: “dev/petstore-dev:latest” imagePullPolicy: Always name: petstore ports: - containerPort: 8778 name: jolokia protocol: TCP - containerPort: 8080 name: http protocol: TCP - containerPort: 8888 name: ping protocol: TCP DEMO:Stg 環境構築 #1-6 ● JBoss EAP の Pod を作成 ● 空白なしで YAML ファイルに保存 # oc create -f <YAMLFILE> apiVersion: v1 kind: DeploymentConfig metadata: generation: 1 labels: app: petstore-stg name: petstore-stg spec: replicas: 1 revisionHistoryLimit: 10 selector: app: petstore-stg deploymentconfig: petstore-stg strategy: activeDeadlineSeconds: 21600 rollingParams: intervalSeconds: 1 maxSurge: 25% maxUnavailable: 25% timeoutSeconds: 600 updatePeriodSeconds: 1 type: Rolling template: metadata: labels: app: petstore-stg deploymentconfig: petstore-stg 1 2
  • 35. RED HAT | Daein Park #rhconvergence 35 DEMO:Stg 環境構築 #1-7 ● LivenessProbe: Pod の再起動 ● ReadinessProb: Pod へのトラフィック( Service ) ● Resources.limits: 利用率が制限値を超えると oom-killer で殺されて再起動 livenessProbe: exec: command: - /bin/bash - -c - /opt/eap/bin/livenessProbe.sh failureThreshold: 3 initialDelaySeconds: 60 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 1 readinessProbe: httpGet: path: /applicationPetstore/shopping/main.xhtml port: 8080 initialDelaySeconds: 20 resources: limits: memory: 1Gi TerminationGracePeriodSeconds: 30 triggers: - type: ConfigChange - imageChangeParams: automatic: true containerNames: - petstore from: kind: ImageStreamTag name: petstore-dev:latest namespace: dev type: ImageChange 3 4
  • 36. RED HAT | Daein Park #rhconvergence 36 DEMO:Prod 環境構築 COMPLETED COMPLETED COMPLETED
  • 37. RED HAT | Daein Park #rhconvergence 37 DEMO:Prod 環境構築 #1 ● stg 環境で検証済みの Image(ImageStream) でリリースされる商用環境 (Prod) ● 必要なリソース : Template ● 既存環境をから作成した Template で一式のリソースを一括で作成 ( これが基本 ) ● Web Console でも簡単に利用可能(一時的な環境、 Branch 環境の複製に便利等) ● Project # oc new-project prod ● 権限設定: jekins から prod にデプロイ、 dev からは image pull できる権限設定 # oc policy add-role-to-user edit system:serviceaccount:jenkins:jenkins -n prod # oc policy add-role-to-group image-puller system:serviceaccounts:prod -n dev ● Template 、 ${VAR} で環境依存情報等を変数にする修正が必要 (stg から取得 ) # oc export route,svc,dc,pvc,configmap -n stg --as-template=petstore > petstore-template.yml
  • 38. RED HAT | Daein Park #rhconvergence 38 DEMO:Prod 環境構築 #1-1 ● petstore-template.yaml 、定義の記載の間に空白なしで 1 つのファイルにしてご利用ください。 apiVersion: v1 kind: Template metadata: name: petstore annotations: description: "PetStore Application for Java EE DEMO" iconClass: icon-eap openshift.io/display-name: PetStore with JBoss EAP 7.1 (https) parameters: - name: APP_NAME value: petstore-prod description: "The Application name" - name: HOSTNAME value: "FQDN hostname" required: true description: "The hostname for external access point" objects: - apiVersion: v1 kind: Route metadata: labels: app: httpd name: httpd spec: host: ${HOSTNAME} port: targetPort: 8080-tcp to: kind: Service name: httpd - apiVersion: v1 kind: Service metadata: labels: app: httpd name: httpd spec: ports: - name: 8080-tcp port: 8080 protocol: TCP targetPort: 8080 - name: 8443-tcp port: 8443 protocol: TCP targetPort: 8443 selector: app: httpd deploymentconfig: httpd type: ClusterIP 1 2
  • 39. RED HAT | Daein Park #rhconvergence 39 - apiVersion: v1 kind: Service metadata: annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" labels: app: ${APP_NAME} application: ${APP_NAME} name: ${APP_NAME}-ping spec: clusterIP: None ports: - name: ping port: 8888 protocol: TCP targetPort: 8888 selector: app: ${APP_NAME} deploymentconfig: ${APP_NAME} type: ClusterIP DEMO:Prod 環境構築 #1-2 ● petstore-template.yaml - apiVersion: v1 kind: Service metadata: labels: app: ${APP_NAME} name: ${APP_NAME} spec: ports: - port: 8080 protocol: TCP targetPort: 8080 selector: app: ${APP_NAME} deploymentconfig: ${APP_NAME} type: ClusterIP 3 4
  • 40. RED HAT | Daein Park #rhconvergence 40 DEMO:Prod 環境構築 #1-3 ● petstore-template.yaml - apiVersion: v1 kind: Service metadata: labels: app: postgresql name: postgresql spec: ports: - name: 5432-tcp port: 5432 protocol: TCP targetPort: 5432 selector: app: postgresql deploymentconfig: postgresql type: ClusterIP - apiVersion: v1 kind: DeploymentConfig metadata: labels: app: httpd name: httpd spec: replicas: 1 selector: app: httpd deploymentconfig: httpd template: metadata: labels: app: httpd deploymentconfig: httpd spec: containers: - imagePullPolicy: Always image: "openshift/httpd-custom:latest" name: httpd ports: - containerPort: 8080 protocol: TCP - containerPort: 8443 protocol: TCP 65
  • 41. RED HAT | Daein Park #rhconvergence 41 DEMO:Prod 環境構築 #1-4 ● petstore-template.yaml volumeMounts: - mountPath: /etc/httpd/custom.d name: httpd-config volumes: - configMap: defaultMode: 420 name: httpd-config name: httpd-config test: false triggers: - type: ConfigChange - imageChangeParams: automatic: true containerNames: - httpd from: kind: ImageStreamTag name: httpd-custom:latest namespace: openshift type: ImageChange 7 6 - apiVersion: v1 kind: DeploymentConfig metadata: labels: app: ${APP_NAME} name: ${APP_NAME} spec: replicas: 1 selector: app: ${APP_NAME} deploymentconfig: ${APP_NAME} strategy: rollingParams: intervalSeconds: 1 maxSurge: 25% maxUnavailable: 25% timeoutSeconds: 600 updatePeriodSeconds: 1 type: Rolling template: metadata: labels: app: ${APP_NAME} deploymentconfig: ${APP_NAME} spec: containers: 8
  • 42. RED HAT | Daein Park #rhconvergence 42 livenessProbe: exec: command: - /bin/bash - -c - /opt/eap/bin/livenessProbe.sh initialDelaySeconds: 60 readinessProbe: httpGet: path: /applicationPetstore/shopping/main.xhtml port: 8080 initialDelaySeconds: 20 resources: limits: memory: 1Gi TerminationGracePeriodSeconds: 30 triggers: - type: ConfigChange - imageChangeParams: automatic: false containerNames: - petstore from: kind: ImageStreamTag name: petstore-dev:latest namespace: dev type: ImageChange - env: - name: JGROUPS_PING_PROTOCOL value: openshift.DNS_PING - name: OPENSHIFT_DNS_PING_SERVICE_NAME value: ${APP_NAME}-ping - name: OPENSHIFT_DNS_PING_SERVICE_PORT value: "8888" - name: MQ_CLUSTER_PASSWORD value: change_the_password - name: MQ_QUEUES - name: MQ_TOPICS - name: JGROUPS_CLUSTER_PASSWORD value: change_the_password - name: AUTO_DEPLOY_EXPLODED value: "false" image: “dev/petstore-dev:latest” imagePullPolicy: Always name: petstore ports: - containerPort: 8778 name: jolokia protocol: TCP - containerPort: 8080 name: http protocol: TCP - containerPort: 8888 name: ping protocol: TCP DEMO:Prod 環境構築 #1-5 ● petstore-template.yaml 9 10
  • 43. RED HAT | Daein Park #rhconvergence 43 DEMO:Prod 環境構築 #1-6● petstore-template.yaml - apiVersion: v1 kind: DeploymentConfig metadata: labels: app: postgresql name: postgresql spec: replicas: 1 selector: app: postgresql deploymentconfig: postgresql template: metadata: labels: app: postgresql deploymentconfig: postgresql spec: containers: - env: - name: POSTGRESQL_ADMIN_PASSWORD value: redhat - name: POSTGRESQL_DATABASE value: petstore - name: POSTGRESQL_PASSWORD value: petstore - name: POSTGRESQL_USER value: petstore image: "openshift/postgresql:9.2" imagePullPolicy: IfNotPresent name: postgresql ports: - containerPort: 5432 protocol: TCP volumeMounts: - mountPath: /var/lib/pgsql/data name: postgresql-volume-1 volumes: - name: postgresql-volume-1 persistentVolumeClaim: claimName: postgres-pvc triggers: - type: ConfigChange - imageChangeParams: automatic: true containerNames: - postgresql from: kind: ImageStreamTag name: postgresql:9.2 namespace: openshift type: ImageChange 11 12
  • 44. RED HAT | Daein Park #rhconvergence 44 DEMO:Prod 環境構築 #1-7 ● petstore-template.yaml - apiVersion: v1 kind: PersistentVolumeClaim metadata: name: postgres-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi storageClassName: glusterfs-storage - apiVersion: v1 data: prod.conf: | # filename: prod.conf # Static file URL rewrite RewriteEngine On RewriteRule ^/applicationPetstore/(.*) /$1 [PT,QSA,L] # Proxy to application server ProxyRequests Off ProxyPreserveHost On <Proxy *> Require all granted </Proxy> Define prod-svc petstore-prod.prod.svc:8080 ProxyPass / http://${prod-svc}/applicationPetstore/ ProxyPassReverse / http://${prod-svc}/applicationPetstore/ # Output filter for identification ExtFilterDefine title_update mode=output intype=text/html cmd="/bin/sed s/Yaps/PRODUCTION/g" SetOutputFilter title_update kind: ConfigMap metadata: name: httpd-config 13 14
  • 45. RED HAT | Daein Park #rhconvergence 45 DEMO:Prod 環境構築 #1-8 ● Template を openshift プロジェクトに作成(共有) # oc create -f petstore-template.yml -n openshift ● Template を利用して Prod の環境を構築 # oc process petstore -n openshift -p APP_NAME=petstore-prod -p HOSTNAME=prod-petstore.app.example.com | oc create -f - ● 手動で JBoss EAP の Pod を起動 # oc rollout latest dc/petstore-prod ● Scale Up 1 → 3 # oc scale --replicas=3 dc/petstore-prod
  • 46. RED HAT | Daein Park #rhconvergence 46 DEMO:Prod 環境構築 #1-9 ● Web Console, Service Catalog (Template Service Broker)
  • 47. RED HAT | Daein Park #rhconvergence 47 DEMO 内容 (再掲) ● Application 構成を Dev→Stg→Prod →順に作成 完了 ● Build(S2I), Rolling Update による Deploy
  • 48. RED HAT | Daein Park #rhconvergence 48 アプリケーションの構築 TIPs
  • 49. RED HAT | Daein Park #rhconvergence 49 OpenShift でよく発生する問題 実はコンテナ環境だから OpenShift だから発生する問題ではないです。 ● アプリケーションの Pod を Scale したら追加される Pod が起動失敗する ● 急停止された DB の Pod が次回起動時に自動リカバリーできなくて起動失敗する ● Pod の暴走によって node ホスト全体の Pod 移動が発生する ● アプリケーションが DB 等依存サービスがあったら起動順序の制御はどうするのか?
  • 50. RED HAT | Daein Park #rhconvergence 50 アプリケーションの Pod を Scale したら追加される Pod が起動失敗する ● アプリケーションで冗長構成が対応できるか確認 ● 1 つの Pod では問題なかったのに Scale すると Pod が起動できなくなる ● ログをみるとリソースへのロックや冗長構成に対応していないケース
  • 51. RED HAT | Daein Park #rhconvergence 51 急停止された DB の Pod が次回起動時に自動リカバリーできなくて起動失敗する ● NFS で PV を作成して利用することが原因 ● 殆どの RDBMS が該当 REDO ログ系は必ず DISK に保存される担保がないと異常停止されたらデータの Recovery ができない そのため fsync/fdatasync で DISK に即時に書き込むよう制御する必要がある ● Block 系の Storage を専用で利用する必要があります。 ● ReadWriteOnce の PV を作成して利用
  • 52. RED HAT | Daein Park #rhconvergence 52 Pod の暴走によって node ホスト全体の Pod 移動が発生する ● メモリの場合、閾値を超えたら OOM-Killer 起動される。 ● Requests == Limits ● CPU は Requests の設定を実施しましょう。 ● 性能テスト等で事前に閾値を決めておきましょう。 resources: requests: memory: "512Mi" cpu: "1000m" limits: memory: "512Mi" cpu: "2000m"
  • 53. RED HAT | Daein Park #rhconvergence 53 アプリケーションが DB 等依存サービスがあったら起動順序の制御はどうするのか? ● アプリケーションを構成するコンポーネント間の起動順序 == 依存関係 ● Liveness, ReadinessProbe を適切に設定して対応可能 ● LivenessProbe: Pod に再起動する必要か監視 ● DB サービスが稼働していない場合には AP サーバを再起動させる ● ReadinessProbe: Pod のサービスが外部からアクセスできる状態か監視 ● WEB サーバは AP サーバで該当ページが表示できない限り外部トラフィックを受けない ● 両方を組み合わせれば自動リカバリーが実現できる <1> AP サーバがアクセスできない <2> 外部からのアクセス遮断 <3> 復旧しないと再起動 <4> アクセス可能になったら再度外部公開等 ⇒ <1>
  • 54. RED HAT | Daein Park #rhconvergence 54 QA
  • 55. RED HAT | Daein Park #rhconvergence 55 参考 ● OpenShift のコアーコンセプト [https://docs.openshift.com/container-platform/3.9/architecture/core_concepts/index.html] ● OpenShift のレイヤ構成 [https://docs.openshift.com/container-platform/3.9/architecture/index.html] ● OpenShift のデプロイフロー [https://blog.openshift.com/builds-deployments-services-v3/] ● OpenShift v3 と source-to-image (s2i) [https://qiita.com/nak3/items/6407c01cc2d1f153c0f1] ● RED HAT JBOSS ENTERPRISE APPLICATION PLATFORM FOR OPENSHIFT [https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html/red_hat_jboss_enterprise_application_platform_for_openshift/] ● Create Your Own Build Pipelines with OpenShift 3.3 [https://blog.openshift.com/create-build-pipelines-openshift-3-3/] ● PetStore Sample Application [https://github.com/agoncal/agoncal-application-petstore-ee7] ● Kubernetes アンチパタン [http://nekop.github.io/slides/hbstudy78.html#/] ● OpenShift の作業全般 [https://docs.openshift.com/container-platform/3.9/welcome/index.html] ● Jboss Transaction Recovery [https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html-single/red_hat_jboss_enterprise_application_platform_for_openshift/#transaction_recovery_demo] ● OpenShift CNS で gluster-block を有効化する [https://nekop.hatenablog.com/entry/2018/03/30/111737]