More Related Content Similar to OpenShiftでJBoss EAP構築 (20) 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]