Pulumi - 当值不包含要更新的属性时,我们如何修补使用 Helm Chart 创建的部署

问题描述

我编写了使用 pulumi kubernetes 部署舵图的代码。 我想在部署图表后修补 StatefulSet(更改 serviceAccountName)。图表没有为 StatefulSet 指定服务帐户的选项。

这是我的代码

// install psmdb database chart
const psmdbChart = new k8s.helm.v3.Chart(psmdbChartName,{
  namespace: namespace.Metadata.name,path: './percona-helm-charts/charts/psmdb-db',// chart: 'psmdb-db',// version: '1.7.0',// fetchOpts: {
  //   repo: 'https://percona.github.io/percona-helm-charts/'
  // },values: psmdbChartValues
},{
  dependsOn: psmdbOperator
})

const set = psmdbChart.getResource('apps/v1/StatefulSet',`${psmdbChartName}-${psmdbChartValues.replsets[0].name}`);

我正在使用 Percona Server for MongoDB Operator 舵图。它使用 Operator 来管理 StatefulSet,它也定义了 CRD。

我尝试过 pulumi 变换。就我而言,Chart 不包含 StatefulSet 资源,而是包含 CRD。

如果无法使用转换在 ServiceAccountName 上更新 StatefulSet,还有其他方法可以覆盖它吗?

感谢任何帮助。

谢谢,

解决方法

Pulumi 有一个强大的功能,叫做 Transformations,这正是你在这里需要的(Example)。转换是由 Pulumi 运行时调用的回调,可用于在创建资源之前修改资源输入属性。

我没有测试过代码,但你应该明白:

import * as k8s from "@pulumi/kubernetes";

// install psmdb database chart
const psmdbChart = new k8s.helm.v3.Chart(psmdbChartName,{
    namespace: namespace.metadata.name,path: './percona-helm-charts/charts/psmdb-db',// chart: 'psmdb-db',// version: '1.7.0',// fetchOpts: {
    //   repo: 'https://percona.github.io/percona-helm-charts/'
    // },values: psmdbChartValues,transformations: [
        // Set name of StatefulSet
        (obj: any,opts: pulumi.CustomResourceOptions) => {
            if (obj.kind === "StatefulSet" && obj.metadata.name === `${psmdbChartName}-${psmdbChartValues.replsets[0].name}`) {
                obj.spec.template.spec.serviceAccountName = "customServiceAccount"
            }
        },],},{
    dependsOn: psmdbOperator
})
,

似乎 Pulumi 没有直接的方法来修补现有的 kubernetes 资源。尽管这仍然可以通过多个步骤实现。

来自Github Comment

  1. 导入现有资源
  2. puumi up 导入
  3. 对导入的资源进行所需的更改
  4. puumi up 以应用更改

似乎他们计划支持类似于 kubectl apply -f 的功能来修补资源。