IK.AM

@making's tech note


Tanzu Application Platformで特定のBuildpackだけ更新するメモ

🗃 {Dev/CaaS/Kubernetes/TAP}
🏷 Kubernetes 🏷 Tanzu Build Service 🏷 Tanzu 🏷 TAP 🏷 kpack 
🗓 Updated at 2023-12-02T17:02:31Z  🗓 Created at 2023-12-02T16:26:09Z   🌎 English Page

⚠️ 本記事の内容はVMwareによってサポートされていません。 記事の内容で生じた問題については自己責任で対応し、 VMwareサポート窓口には問い合わせないでください

Tanzu Application Platform 1.6から、ClusterBuildpack CRが追加されました。 それ以前は ClusterBuilderClusterStore (OSのベースイメージ) と ClusterStack (Buildpack集) から構成されていました。 1.6からは ClusterBuilderClusterStore (OSのベースイメージ) と複数の ClusterBuildpack で構成されます。 これにより、個別のBuildpackのアップデートが行いやすくなりました。

更新方法は https://docs.vmware.com/en/VMware-Tanzu-Application-Platform/1.7/tap/tanzu-build-service-dependencies.html#update-dependencies-7 に記載されています。

実例を挙げます。TAP 1.7.0ではNode.jsのBuildpackとしてtanzu nodejs buildpack 2.3.1がインストールされています。 しかし、このBuildpackに含まれるNode.jsには CVE-2023-39332 (Critical) が存在します。

実際に、TAP 1.7.0でNode.jsのWorkloadをsource-test-scan-to-urlのSupply Chainでビルドすると、次のように脆弱性が検出されます。

image

TAP 1.7.0のままではCVE-2023-39332を無視するか、この脆弱性がFixされたbuildpackを含む新しいTAPのバージョンがリリースされるまでSupply Chainをストップさせるしかありません。 しかし、ClusterBuildpack が導入されたことにより、新しいbuildpackさえリリースされていれば、TAPのリリースを待たずにClusterBuilderを更新できます。

実際に、CVE-2023-39332は tanzu nodejs buildpack 2.3.2 でFixされました。

image

TAPのリリースを待たずに、このtanzu nodejs buildpack 2.3.2を適用してみます。

ℹ️ 本記事執筆時点のTAPの最新バージョンである1.7.1ではtanzu nodejs buildpack 2.3.2が含まれています。

まずはbuildpackのDockerイメージを imgpkg コマンドでrelocateします。元となるイメージ名はTanzu Netから確認可能です。 lite dependenciesを使用している場合は末尾に-liteがつくものを、full dependenciesを使用している場合は-liteがつかないものを使用します。

image

ここでは ghcr.io/making 配下にrelocateします。

imgpkg copy -i registry.tanzu.vmware.com/tanzu-nodejs-buildpack/nodejs:2.3.2 --to-repo ghcr.io/making/tanzu-nodejs-buildpack/nodejs

relocateしたイメージを ClusterBuildpack.spec.image に指定します。 .spec.serviceAccountRefに指定するService Accountは、relocateしたイメージをpullできるimagePullSecretsが設定されている必要があります。 わからない場合はkubectl get clusterbuildpack -ojsonpath='{.items[0].spec.serviceAccountRef}'で既存のClusterBuildpackが使用しているService Accountを確認できます。

以下はfull dependenciesを使用している場合に、tanzu nodejs buildpackを2.3.2に更新する例です。 名前の形式は、TAPに同梱されるものと被らないようにする方が良いでしょう。ここではドキュメント同様に out-of-band- をprefixとして使用しています。

kubectl apply -f - << 'EOF'
---
apiVersion: kpack.io/v1alpha2
kind: ClusterBuildpack
metadata:
  name: out-of-band-nodejs-2.3.2
spec:
  image: ghcr.io/making/tanzu-nodejs-buildpack/nodejs:2.3.2
  serviceAccountRef:
    name: dependencies-pull-serviceaccount
    namespace: tbs-full-deps
---
EOF

同じIDを持つbuildpackが複数ある場合、ClusterBuilder はより新しいものを選びます。 これにより、TAP 1.7.0同梱のtanzu nodejs buildpack 2.3.1ではなく、2.3.2を使って ClusterBuilder が更新されます。

ClusterBuilder が更新されると、それを使用しているWorkloadのイメージは自動で再ビルドが行われます。これにより、Supply Chainの脆弱性チェックもパスできます。

image

この手法で、TAPをアップデートすることなくBuildpackを更新することができましたが、BuildpackのAPIバージョンやSBoMのバージョンの依存関係があるため、TAPのバージョンによっては最新のBuildpackだとエラーが起きる可能性がある点に注意してください。


✒️️ Edit  ⏰ History  🗑 Delete