我们有一个以实物形式运行的 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
我们可以做什么来防止提供商升级破坏我们的设置?
由于 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` 进行升级。
记住要耐心等待升级完成 - 最多需要几分钟,并且取决于要升级的提供商现在必须做什么(我们等待很短,因此认为此配置是错误的,但它不是)。