Cloud Native BuildpacksでビルドしたOCIイメージ(making/hello-cnb)をCloud Foundry (Pivotal Web Services)にデプロイします。
Pivotal Web Services以外のCloud Foundryでも同じようにデプロイできます。
目次
CF CLIのインストール
brew install cloudfoundry/tap/cf-cli
Pivotal Web Servicesへログイン
cf login -a api.run.pivotal.io
Pivotal Web Services以外の場合は、次のコマンドでDockerイメージのデプロイがサポートされているか確認してください。
$ cf feature-flags | grep docker
diego_docker enabled
disabledが出力される場合は、adminユーザーとして次のコマンドを実行し、Dockerイメージのデプロイを有効にしてください。
cf enable-feature-flag diego_docker
アプリケーションのデプロイ
次のコマンドでmanifest.ymlを作成します。
mkdir deploy-to-cf
cd deploy-to-cf
cat <<'EOF' > manifest.yml
applications:
- name: hello-cnb
memory: 768m
docker:
image: making/hello-cnb:latest
env:
INFO_MESSAGE: Hello World!
health-check-type: http
health-check-http-endpoint: /actuator/health
EOF
cf pushコマンドでデプロイしてください。Routeが重複しないように--random-routeオプションをつけます。
cf push --random-route
次のようなログが出力されます。
Pushing from manifest to org APJ / space development as tmaki@pivotal.io...
Using manifest file /tmp/pack/deploy-to-cf/manifest.yml
Getting app info...
Creating app with these attributes...
+ name: hello-cnb:latest
+ docker image: making/hello-cnb
+ health check http endpoint: /actuator/health
+ health check type: http
+ memory: 768M
env:
+ INFO_MESSAGE
routes:
+ hello-cnb-lean-ostrich-nj.cfapps.io
Creating app hello-cnb...
Mapping routes...
Staging app and tracing logs...
Cell a827573d-ee33-414e-bebd-3532a9afb61e creating container for instance f2c03eec-80f8-4fad-be56-5aa05449285a
Cell a827573d-ee33-414e-bebd-3532a9afb61e successfully created container for instance f2c03eec-80f8-4fad-be56-5aa05449285a
Staging...
Staging process started ...
Staging process finished
Exit status 0
Staging Complete
Cell a827573d-ee33-414e-bebd-3532a9afb61e stopping instance f2c03eec-80f8-4fad-be56-5aa05449285a
Cell a827573d-ee33-414e-bebd-3532a9afb61e destroying container for instance f2c03eec-80f8-4fad-be56-5aa05449285a
Cell a827573d-ee33-414e-bebd-3532a9afb61e successfully destroyed container for instance f2c03eec-80f8-4fad-be56-5aa05449285a
Waiting for app to start...
name: hello-cnb
requested state: started
routes: hello-cnb-lean-ostrich-nj.cfapps.io
last uploaded: Wed 29 Apr 01:05:13 JST 2020
stack:
docker image: making/hello-cnb:latest
type: web
instances: 1/1
memory usage: 768M
start command: /cnb/lifecycle/launcher
state since cpu memory disk details
#0 running 2020-04-28T16:05:52Z 77.8% 119.9M of 768M 249.4M of 1G
cf logsでログを確認します。
$ cf logs hello-cnb --recent
Retrieving logs for app hello-cnb in org APJ / space development as tmaki@pivotal.io...
2020-04-29T01:05:08.97+0900 [API/11] OUT Created app with guid 980ea444-39d4-460d-b314-c816a64fc78b
2020-04-29T01:05:09.88+0900 [API/12] OUT Creating build for app with guid 980ea444-39d4-460d-b314-c816a64fc78b
2020-04-29T01:05:09.95+0900 [API/12] OUT Updated app with guid 980ea444-39d4-460d-b314-c816a64fc78b ({"state"=>"STARTED"})
2020-04-29T01:05:10.52+0900 [STG/0] OUT Cell a827573d-ee33-414e-bebd-3532a9afb61e creating container for instance f2c03eec-80f8-4fad-be56-5aa05449285a
2020-04-29T01:05:11.69+0900 [STG/0] OUT Cell a827573d-ee33-414e-bebd-3532a9afb61e successfully created container for instance f2c03eec-80f8-4fad-be56-5aa05449285a
2020-04-29T01:05:12.04+0900 [STG/0] OUT Staging...
2020-04-29T01:05:12.62+0900 [STG/0] OUT Staging process started ...
2020-04-29T01:05:12.92+0900 [STG/0] OUT Staging process finished
2020-04-29T01:05:12.92+0900 [STG/0] OUT Exit status 0
2020-04-29T01:05:12.92+0900 [STG/0] OUT Staging Complete
2020-04-29T01:05:13.41+0900 [STG/0] OUT Cell a827573d-ee33-414e-bebd-3532a9afb61e stopping instance f2c03eec-80f8-4fad-be56-5aa05449285a
2020-04-29T01:05:13.41+0900 [STG/0] OUT Cell a827573d-ee33-414e-bebd-3532a9afb61e destroying container for instance f2c03eec-80f8-4fad-be56-5aa05449285a
2020-04-29T01:05:13.47+0900 [API/7] OUT Creating droplet for app with guid 980ea444-39d4-460d-b314-c816a64fc78b
2020-04-29T01:05:13.99+0900 [CELL/0] OUT Cell 427f4537-d113-4050-8f1f-eb1875759ae8 creating container for instance ddffd3a2-4721-4ac7-5adc-e701
2020-04-29T01:05:14.09+0900 [STG/0] OUT Cell a827573d-ee33-414e-bebd-3532a9afb61e successfully destroyed container for instance f2c03eec-80f8-4fad-be56-5aa05449285a
2020-04-29T01:05:25.18+0900 [CELL/0] OUT Cell 427f4537-d113-4050-8f1f-eb1875759ae8 successfully created container for instance ddffd3a2-4721-4ac7-5adc-e701
2020-04-29T01:05:25.55+0900 [CELL/0] OUT Starting health monitoring of container
2020-04-29T01:05:27.62+0900 [APP/PROC/WEB/0] OUT JVM DNS caching disabled in favor of link-local DNS caching
2020-04-29T01:05:27.74+0900 [APP/PROC/WEB/0] OUT Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -XX:MaxMetaspaceSize=88833K -XX:ReservedCodeCacheSize=240M -Xss1M -Xmx218366K (Head Room: 0%, Loaded Class Count: 13270, Thread Count: 250, Total Memory: 838860800)
2020-04-29T01:05:35.73+0900 [APP/PROC/WEB/0] OUT . ____ _ __ _ _
2020-04-29T01:05:35.73+0900 [APP/PROC/WEB/0] OUT /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
2020-04-29T01:05:35.73+0900 [APP/PROC/WEB/0] OUT ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2020-04-29T01:05:35.73+0900 [APP/PROC/WEB/0] OUT \\/ ___)| |_)| | | | | || (_| | ) ) ) )
2020-04-29T01:05:35.73+0900 [APP/PROC/WEB/0] OUT ' |____| .__|_| |_|_| |_\__, | / / / /
2020-04-29T01:05:35.73+0900 [APP/PROC/WEB/0] OUT =========|_|==============|___/=/_/_/_/
2020-04-29T01:05:35.74+0900 [APP/PROC/WEB/0] OUT :: Spring Boot :: (v2.2.6.RELEASE)
2020-04-29T01:05:36.17+0900 [APP/PROC/WEB/0] OUT 2020-04-28 16:05:36.165 INFO 12 --- [ main] hello.HelloCnbApplication : Starting HelloCnbApplication on ddffd3a2-4721-4ac7-5adc-e701 with PID 12 (/workspace/BOOT-INF/classes started by cnb in /workspace)
2020-04-29T01:05:36.17+0900 [APP/PROC/WEB/0] OUT 2020-04-28 16:05:36.178 INFO 12 --- [ main] hello.HelloCnbApplication : No active profile set, falling back to default profiles: default
2020-04-29T01:05:44.96+0900 [APP/PROC/WEB/0] OUT 2020-04-28 16:05:44.939 INFO 12 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
2020-04-29T01:05:48.77+0900 [APP/PROC/WEB/0] OUT 2020-04-28 16:05:48.769 INFO 12 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty started on port(s): 8080
2020-04-29T01:05:48.80+0900 [APP/PROC/WEB/0] OUT 2020-04-28 16:05:48.790 INFO 12 --- [ main] hello.HelloCnbApplication : Started HelloCnbApplication in 16.825 seconds (JVM running for 20.864)
2020-04-29T01:05:51.12+0900 [CELL/0] OUT Container became healthy
指定したコンテナのメモリに合わせて、JVMのメモリが自動で設定されていることに注目してください。CF Buildpackを使った場合と同じです。
アプリにマッピングされたURL(この例ではhttps://hello-cnb-lean-ostrich-nj.cfapps.io))にアクセスしてください。
$ curl https://hello-cnb-lean-ostrich-nj.cfapps.io/actuator/health -w '\n'
{"status":"UP"}
$ curl https://hello-cnb-lean-ostrich-nj.cfapps.io/actuator/info -w '\n'
{"message":"Hello World!"}
Apps Managerにアクセス
Apps Managerにアクセスして、hello-cnbアプリを選択してください。

Spring Boot Actuatorの管理機能が利用できます。
メモリの調整
Buildpackに含まれるJava Buildpack Memory Calculatorの機能を使って、
自動設定されるJVMのメモリを調整し、少ないメモリ量(256MB)で起動できるようにします。
manifest.ymlを次のように変更してください。
cat <<'EOF' > manifest.yml
applications:
- name: hello-cnb
memory: 256m
docker:
image: making/hello-cnb:latest
env:
INFO_MESSAGE: Hello World!
JAVA_OPTS: "-XX:ReservedCodeCacheSize=32M -Xss512k"
BPL_JVM_THREAD_COUNT: 20
BPL_JVM_HEAD_ROOM: 5
health-check-type: http
health-check-http-endpoint: /actuator/health
EOF
アップデートします。
cf push
cf logs hello-cnb --recentでメモリの設定が次のように出力されていることを確認してください。
2020-04-29T01:26:22.83+0900 [APP/PROC/WEB/0] OUT Calculated JVM Memory Configuration: -XX:MaxDirectMemorySize=10M -XX:MaxMetaspaceSize=88833K -Xmx138084K (Head Room: 5%, Loaded Class Count: 13270, Thread Count: 20, Total Memory: 301989888)
Apps Managerを見ると、256MB中、約150MBが使用されていることがわかります。

アプリケーションの削除
次のコマンドでアプリとRouteを削除します。
cf delete hello-cnb -r -f