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]

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]