1

我正在评估 crossplane 作为我们部署客户不同解决方案的首选工具,并且一直在努力解决一个问题:

我们想将 crossplane 安装到 GCP 上的一个集群(我们手动创建),并使用该 crossplane 来配置新集群,我们可以在该集群上安装 helm 图表并像往常一样部署。到目前为止的主要问题是我们还没有弄清楚如何告诉 crossplane 将舵图安装到其他集群而不是它自己。

这就是我们所尝试的:

示例中的提供程序配置:

apiVersion: helm.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
  name: helm-provider
spec:
  credentials:
    source: InjectedIdentity

...它可以工作,但会将所有内容安装到与交叉平面相同的集群中。

另一个例子:

apiVersion: helm.crossplane.io/v1beta1
kind: ProviderConfig
metadata:
  name: default
spec:
  credentials:
    source: Secret
    secretRef:
      name: cluster-credentials
      namespace: crossplane-system
      key: kubeconfig

...这需要大量的 makefile 脚本才能更轻松地为新集群生成 kubeconfig,并且 kubecoinfig 仍然会产生很多错误(但确实开始在新集群中创建一些东西,但它并没有一路工作。错误,例如:“ PodUnschedulable 无法调度 pod:gvisor})。

我只尝试了 crossplane 几天,所以我知道我可能会从一个完全错误的角度来处理这个问题,但与 Terraform 等相比,我确实喜欢 crossplane 的承诺及其方法。

所以问题是:我的想法完全错误,或者我错过了一些明显的东西。使用 kubeconfig 进行的第二次测试现在感觉相当复杂(许多步骤以正确的顺序来实现)。

谢谢

4

1 回答 1

1

正如您所注意到的,ProviderConfigwithInjectedIdentity用于provider-helm将 helm 版本安装到同一集群中的情况。

要部署到其他集群,provider-helm 需要一个kubeconfig远程集群的文件,该文件需要作为 Kubernetes 机密提供并从ProviderConfig. 因此,只要您为从 Crossplane 集群(又名控制平面)访问的外部集群提供了适当 的权限,provider-helm 就应该能够将版本部署到远程集群。kubeconfig

因此,看起来您在配置 provider-helm 方面走在了正确的轨道上,并且由于您观察到某些东西被部署到外部集群,因此您提供了一个有效的kubeconfig,并且 provider-helm 可以访问集群并对其进行身份验证。

您遇到的最后一个错误听起来像是您的集群和 release 之间的一些不兼容,例如,外部集群只允许使用 pod,gvisor而您要使用提供程序 helm 安装的应用程序没有相应的标签。

作为故障排除步骤,您可以尝试使用您构建的相同 kubeconfig,通过 helm cli 将具有完全相同配置的 helm chart 安装到外部集群。

关于构建您提到的 Kubeconfig 的不便之处,provider-helm 需要一种访问该外部 Kubernetes 集群的方法,因为kubeconfig这是实现此目的的最常见方法。但是,如果您看到另一种使某些常见用例变得更容易的替代方案,则可以实现这一点,如果您可以在 repo 中为此创建一个功能请求,那就太好了。

最后,我想知道您是如何创建这些外部集群的。如果使用 Crossplane 创建它们也有意义,例如,如果 GKE 使用 provider-gcp,那么,您可以将 helm与 GKE Cluster 资源组合ProviderConfig在一起,该资源只会创建适当的秘密,ProviderConfig当您创建新集群时,您可以以此为例:https ://github.com/crossplane-contrib/provider-helm/blob/master/examples/in-composition/composition.yaml#L147

于 2021-10-29T09:28:15.917 回答