Crossplane Provider 升级问题:只有一个引用可以将 Controller 设置为 true。在 Provider/x 和 Provider/x 的参考文献中找到“true”

问题描述 投票:0回答:1

我们有一个以实物形式运行的 ArgoCD 设置,其中 Crossplane 安装为 ArgoCD

Application
(此处为示例存储库)。 Crossplane Provider 也通过 ArgoCD
Application
安装,如下所示:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: provider-aws
  namespace: argocd
  labels:
    crossplane.jonashackt.io: crossplane
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: default
  source:
    repoURL: https://github.com/jonashackt/crossplane-argocd
    targetRevision: HEAD
    path: upbound/provider-aws/provider
  destination:
    namespace: default
    server: https://kubernetes.default.svc
  syncPolicy:
    automated:
      prune: true    
    retry:
      limit: 5
      backoff:
        duration: 5s 
        factor: 2 
        maxDuration: 1m

Argo

Provider
spec.source.path
的定义如下:

apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-s3
spec:
  package: xpkg.upbound.io/upbound/provider-aws-ec2:v1.1.1
  packagePullPolicy: Always
  revisionActivationPolicy: Automatic
  revisionHistoryLimit: 1

现在,随着新的 Crossplane 提供程序版本

provider-aws-ec2:v1.2.1
的发布,我们看到了以下问题:提供程序处于
Degraded
状态:

作为一个事件,我们收到以下错误:

cannot apply package revision: cannot create object: ProviderRevision.pkg.crossplane.io "provider-aws-ec2-150095bdd614" is invalid: metadata.ownerReferences: Invalid value: []v1.OwnerReference{v1.OwnerReference{APIVersion:"pkg.crossplane.io/v1", Kind:"Provider", Name:"provider-aws-ec2", UID:"30bda236-6c12-412c-a647-b96368eff8b6", Controller:(*bool)(0xc02afeb38c), BlockOwnerDeletion:(*bool)(0xc02afeb38d)}, v1.OwnerReference{APIVersion:"pkg.crossplane.io/v1", Kind:"Provider", Name:"provider-aws-ec2", UID:"ee890f53-7590-4957-8f81-e92b931c4e8d", Controller:(*bool)(0xc02afeb38e), BlockOwnerDeletion:(*bool)(0xc02afeb38f)}}: Only one reference can have Controller set to true. Found "true" in references for Provider/provider-aws-ec2 and Provider/provider-aws-ec2

查看

kubectl get providerrevisions
我们看到,新的提供程序已经安装(我们没有做任何事情),而“旧”提供程序不再健康了:

kubectl get providerrevisions
NAME                                       HEALTHY   REVISION   IMAGE                                                STATE      DEP-FOUND   DEP-INSTALLED   AGE
provider-aws-ec2-3d66ea2d7903              Unknown   1          xpkg.upbound.io/upbound/provider-aws-ec2:v1.1.1      Active     1           1               5m31s
provider-aws-ec2-3d66ea2d7903              Unknown   1          xpkg.upbound.io/upbound/provider-aws-ec2:v1.2.1      Active     1           1               5m31s
upbound-provider-family-aws-7cc64a779806   True      1          xpkg.upbound.io/upbound/provider-family-aws:v1.2.1   Active                                 30m

我们可以做什么来防止提供商升级破坏我们的设置?

amazon-web-services kubernetes cicd argocd crossplane
1个回答
0
投票

由于 ArgoCD 在此设置中执行 GitOps 部分,因此我们需要让它带头应用必须在 Git 中进行的更改。使用当前的 Provider 设置,Crossplane 会自动升级 Provider,而 ArgoCD 对此一无所知。从而尝试使状态与 Git 中的声明一致。因此,这两种机制将陷入持续的“战斗”。

为了让 ArgoCD 通过 Git 提交成为 Provider 升级的领先者,我们应该将

packagePullPolicy
配置为
IfNotPresent
而不是
Always
,这意味着“每分钟检查新包并下载任何不在其中的匹配包”缓存”如文档所述

apiVersion: pkg.crossplane.io/v1
kind: Provider
metadata:
  name: provider-aws-s3
spec:
  package: xpkg.upbound.io/upbound/provider-aws-ec2:v1.1.1
  packagePullPolicy: IfNotPresent
  revisionActivationPolicy: Automatic
  revisionHistoryLimit: 1

但有趣的是,我们需要将

revisionActivationPolicy
留给
Automatic
!否则,提供者将永远不会变得活跃和健康!我发现文档在这一点上不太清楚这里。

TLDR;

packagePullPolicy: IfNotPresent
Crossplane 不会自动拉取新的 Provider 版本,只有 git commit 更改 Provider 版本才会触发下载 - 以及通过 revisionActivationPolicy: Automatic` 进行升级。

记住要耐心等待升级完成 - 最多需要几分钟,并且取决于要升级的提供商现在必须做什么(我们等待很短,因此认为此配置是错误的,但它不是)。

© www.soinside.com 2019 - 2024. All rights reserved.