前記事で、Tanzu Application Platformで特定のBuildpackだけ更新する方法を紹介しました。
TAP 1.7ではJava 21に対応したBuildpackがまだサポートされていません。一方、Java 21に対応した tanzu java buildpack 9.13.0 が2023-12-01にリリースされました。
ということで、TAP 1.7でこのtanzu java buildpack 9.13.0を使って、Java 21対応をしたいと思います。
TAP 1.7.1では次のような ClusterBuildpack
がインストールされます。tanzu java buildpackのバージョンは9.11.0です。
$ kubectl get clusterbuildpack
NAME READY
dotnet-core-2.8.2 True
go-2.2.2 True
java-9.11.0 True <====
java-native-image-7.9.0 True
nodejs-2.3.2 True
php-2.6.1 True
procfile-5.6.1 True
python-2.5.1 True
ruby-2.8.1 True
web-servers-0.15.4 True
tanzu java buildpack 9.11.0に含まれている個別のbuildpackは次のコマンドで確認できます。
ℹ️ java buildpackは以下のbuildpack群をまとめたmeta buildpackです。
$ kubectl get clusterbuildpack java-9.11.0 -ojson | jq -r '.status.buildpacks[] | [.id, .version] | @tsv'
paketo-buildpacks/apache-skywalking 5.6.1
paketo-buildpacks/apache-tomcat 7.13.9
paketo-buildpacks/apache-tomee 1.7.4
paketo-buildpacks/appdynamics 5.14.0
paketo-buildpacks/aternity 5.4.2
paketo-buildpacks/azure-application-insights 5.15.4
paketo-buildpacks/ca-certificates 3.6.3
paketo-buildpacks/clojure-tools 2.8.8
paketo-buildpacks/datadog 4.0.0
paketo-buildpacks/dist-zip 5.6.4
paketo-buildpacks/dynatrace 5.5.0
paketo-buildpacks/elastic-apm 5.14.0
paketo-buildpacks/encrypt-at-rest 4.5.6
paketo-buildpacks/environment-variables 4.5.3
paketo-buildpacks/executable-jar 6.7.4
paketo-buildpacks/google-stackdriver 7.7.0
paketo-buildpacks/gradle 7.5.0
paketo-buildpacks/image-labels 4.5.2
paketo-buildpacks/jattach 1.4.4
paketo-buildpacks/java-memory-assistant 1.4.4
paketo-buildpacks/jprofiler 6.5.3
paketo-buildpacks/leiningen 4.6.4
paketo-buildpacks/liberty 3.8.4
paketo-buildpacks/maven 6.15.6
paketo-buildpacks/new-relic 7.8.0
paketo-buildpacks/procfile 5.6.4
paketo-buildpacks/sbt 6.12.4
paketo-buildpacks/spring-boot 5.27.1
paketo-buildpacks/syft 1.10.1
paketo-buildpacks/watchexec 2.8.3
paketo-buildpacks/yourkit 6.0.6
tanzu-buildpacks/aspectj 4.5.0
tanzu-buildpacks/checkmarx 4.6.0
tanzu-buildpacks/contrast-security 5.3.1
tanzu-buildpacks/deprecation-warnings 0.0.4
tanzu-buildpacks/jacoco 4.6.0
tanzu-buildpacks/java 9.11.0
tanzu-buildpacks/jrebel 4.12.0
tanzu-buildpacks/luna-security-provider 1.7.0
tanzu-buildpacks/node-engine 2.0.0
tanzu-buildpacks/overops 4.12.2
tanzu-buildpacks/snyk 4.6.0
tanzu-buildpacks/synopsys 4.6.1
tanzu-buildpacks/tanzu-bellsoft-liberica 9.12.1 <====
tanzu-buildpacks/yarn 1.1.11
tanzu-buildpacks/tanzu-bellsoft-liberica
が実際のJDKを持つbuildpackであり、9.12.1では8, 11, 17, 20しかサポートされていません。
なお、default
のClusterBuilder
が参照しているbuildpackは次のコマンドで確認できます。
$ kubectl get clusterbuilder default -ojsonpath='{.status.order}' | jq -r '.[].group[0] | [.id, .version] | @tsv'
tanzu-buildpacks/ruby 2.8.1
tanzu-buildpacks/dotnet-core 2.8.2
tanzu-buildpacks/go 2.2.2
tanzu-buildpacks/python 2.5.1
tanzu-buildpacks/web-servers 0.15.4
tanzu-buildpacks/java-native-image 7.9.0
tanzu-buildpacks/java 9.11.0 <====
tanzu-buildpacks/nodejs 2.3.2
paketo-buildpacks/procfile 5.6.7
使用されているtanzu java buildpack(tanzu-buildpacks/java
) のバージョンが9.11.0であることがわかります。
今回はこのClusterBuilder
が参照するtanzu java buildpackのバージョンを9.13.0にしたいです。
更新方法は https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.7/tap/tanzu-build-service-dependencies.html#update-dependencies-7 に記載されています。
まずはbuildpackのDockerイメージを imgpkg
コマンドでrelocateします。元となるイメージ名はTanzu Netから確認可能です。
lite dependenciesを使用している場合は末尾に-lite
がつくものを、full dependenciesを使用している場合は-lite
がつかないものを使用します。
ここでは ghcr.io/making
配下にrelocateします。
imgpkg copy -i registry.tanzu.vmware.com/tanzu-java-buildpack/java:9.13.0 --to-repo ghcr.io/making/tanzu-java-buildpack/java
relocateしたイメージを ClusterBuildpack
の .spec.image
に指定します。
.spec.serviceAccountRef
に指定するService Accountは、relocateしたイメージをpullできるimagePullSecrets
が設定されている必要があります。
わからない場合はkubectl get clusterbuildpack -ojsonpath='{.items[0].spec.serviceAccountRef}'
で既存のClusterBuildpack
が使用しているService Accountを確認できます。
名前の形式は、TAPに同梱されるものと被らないようにする方が良いでしょう。ここではドキュメント同様に out-of-band-
をprefixとして使用しています。
kubectl apply -f - << 'EOF'
---
apiVersion: kpack.io/v1alpha2
kind: ClusterBuildpack
metadata:
name: out-of-band-java-9.13.0
spec:
image: ghcr.io/making/tanzu-java-buildpack/java:9.13.0
serviceAccountRef:
name: dependencies-pull-serviceaccount
namespace: tbs-full-deps
---
EOF
ClusterBuildpack
一覧を確認します。out-of-band-java-9.13.0
が追加されています。
$ kubectl get clusterbuildpack
NAME READY
dotnet-core-2.8.2 True
go-2.2.2 True
java-9.11.0 True
java-native-image-7.9.0 True
nodejs-2.3.2 True
out-of-band-java-9.13.0 True <====
php-2.6.1 True
procfile-5.6.1 True
python-2.5.1 True
ruby-2.8.1 True
web-servers-0.15.4 True
この out-of-band-java-9.13.0
に含まれる個別のbuildpackは次のコマンドで確認できます。
$ kubectl get clusterbuildpack out-of-band-java-9.13.0 -ojson | jq -r '.status.buildpacks[] | [.id, .version] | @tsv'
paketo-buildpacks/syft 1.10.1
tanzu-buildpacks/apache-skywalking 6.0.4
tanzu-buildpacks/apache-tomcat 7.14.1
tanzu-buildpacks/apache-tomee 1.7.9
tanzu-buildpacks/appdynamics 5.17.1
tanzu-buildpacks/aspectj 4.5.2
tanzu-buildpacks/aternity 5.4.6
tanzu-buildpacks/azure-application-insights 5.17.2
tanzu-buildpacks/bellsoft-liberica 9.13.0 <====
tanzu-buildpacks/ca-certificates 3.6.7
tanzu-buildpacks/checkmarx 4.6.2
tanzu-buildpacks/clojure-tools 2.8.13
tanzu-buildpacks/contrast-security 5.5.0
tanzu-buildpacks/datadog 4.5.1
tanzu-buildpacks/deprecation-warnings 0.0.4
tanzu-buildpacks/dist-zip 5.6.8
tanzu-buildpacks/dynatrace 5.6.1
tanzu-buildpacks/elastic-apm 6.2.1
tanzu-buildpacks/encrypt-at-rest 4.5.11
tanzu-buildpacks/environment-variables 4.5.7
tanzu-buildpacks/executable-jar 6.8.3
tanzu-buildpacks/google-stackdriver 8.0.4
tanzu-buildpacks/gradle 7.6.2
tanzu-buildpacks/image-labels 4.5.6
tanzu-buildpacks/jacoco 4.6.1
tanzu-buildpacks/jattach 1.4.9
tanzu-buildpacks/java-memory-assistant 1.4.9
tanzu-buildpacks/java 9.13.0
tanzu-buildpacks/jprofiler 6.5.7
tanzu-buildpacks/jrebel 4.14.0
tanzu-buildpacks/leiningen 4.6.9
tanzu-buildpacks/liberty 3.8.11
tanzu-buildpacks/luna-security-provider 1.7.2
tanzu-buildpacks/maven 6.15.12
tanzu-buildpacks/new-relic 8.4.1
tanzu-buildpacks/node-engine 2.0.0
tanzu-buildpacks/overops 4.12.4
tanzu-buildpacks/procfile 5.6.9
tanzu-buildpacks/sbt 6.12.10
tanzu-buildpacks/snyk 4.6.2
tanzu-buildpacks/spring-boot 5.27.6
tanzu-buildpacks/synopsys 4.6.3
tanzu-buildpacks/watchexec 2.8.7
tanzu-buildpacks/yarn 1.1.11
tanzu-buildpacks/yourkit 6.1.6
tanzu-buildpacks/tanzu-bellsoft-liberica
のバージョンが9.13.0であることがわかります。
ClusterBuildpack
を追加したことで、ClusterBuilder
が変わったかどうかを次のコマンドで確認します。
$ kubectl get clusterbuilder default -ojsonpath='{.status.order}' | jq -r '.[].group[0] | [.id, .version] | @tsv'
tanzu-buildpacks/ruby 2.8.1
tanzu-buildpacks/dotnet-core 2.8.2
tanzu-buildpacks/go 2.2.2
tanzu-buildpacks/python 2.5.1
tanzu-buildpacks/web-servers 0.15.4
tanzu-buildpacks/java-native-image 7.9.0
tanzu-buildpacks/java 9.13.0 <====
tanzu-buildpacks/nodejs 2.3.2
paketo-buildpacks/procfile 5.6.7
使用されているtanzu java buildpack(tanzu-buildpacks/java
) のバージョンが9.13.0になったことがわかります。
これでJava 21が利用できるbuildpackがTAP 1.7環境にインストールされました。
あとはWorkload側でbuild時の環境変数BP_JVM_VERSION
に21を明示すればJava 21を使用したコンテナイメージができます。
tanzu apps workload apply
コマンドの場合は、--build-env BP_JVM_VERSION=21
を、YAMLの場合は次の設定をすれば良いです。
spec:
build:
env:
- name: BP_JVM_VERSION
value: "21"
Developer Portalでビルドのログを見るとJDK 21が利用されていることが確認できます。
アプリがSpring Boot 3.2を使用している場合はプロパティ spring.threads.virtual.enabled=true
(環境変数 SPRING_THREADS_VIRTUAL_ENABLED
をtrue
にしてもOK) を設定するだけでVirtual Threadsが利用できます。
なお、このブログのBackendのAPIをこの記事の方法でビルドしました。以下のコマンドでこのブログのBackendのAPIが使用しているJavaのバージョンを確認できます。Java 21が使われています。
$ curl -s https://api.ik.am/info | jq .java
{
"version": "21.0.1",
"vendor": {
"name": "BellSoft"
},
"runtime": {
"name": "OpenJDK Runtime Environment",
"version": "21.0.1+12-LTS"
},
"jvm": {
"name": "OpenJDK 64-Bit Server VM",
"vendor": "BellSoft",
"version": "21.0.1+12-LTS"
}
}