Providers

Providers 支持 crossplane 在外部服务上配置基础设施。 Providers 创建新的 Kubernetes API 并将其映射到外部 API。

Provider 负责连接到非 Kubernetes 资源的所有方面。 这包括身份验证、进行外部 API 调用以及为任何外部资源提供 Kubernetes Controller 逻辑。

Providers 的例子包括

Tip
Upbound Marketplace 中查找更多 Provider。

Provider 会把他们能在 Kubernetes 中创建的每个外部资源定义为 Kubernetes API 端点。 这些端点是 Managed Resources.

安装一个 Provider

安装一个 Provider 会创建代表 Provider API 的新 Kubernetes 资源。 安装一个 Provider 还会创建一个 Provider pod,负责将 Provider 的 API 调节到 Kubernetes 集群中。 Provider 会持续观察所需托管资源的状态,并创建任何缺失的外部资源。

使用crossplane安装 ProviderProvider对象,设置spec.packages值为 Provider 软件包的位置。

例如,安装 AWS Community Provider

1apiVersion: pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: provider-aws
5spec:
6  package: xpkg.upbound.io/crossplane-contrib/provider-aws:v0.39.0

默认情况下,Provider pod 会安装在与 crossplane (crossplane-system) 相同的命名空间中。

Note

Providers 是pkg.crossplane.io组的一部分。

.meta.pkg.crossplane.io。 meta.pkg.crossplane.io组用于创建 Provider 软件包。

有关构建 Provider 的说明不在本文档的范围之内。 请阅读跨plane 贡献的 Provider 开发指南 了解更多信息。

有关 Provider 程序包规范的信息,请阅读 Crossplane Provider Package specification

1apiVersion: meta.pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: provider-aws
5spec:
6# Removed for brevity

用 Helm 安装

Crossplane 支持在初始安装 Crossplane 时使用 Crossplane Helm chart 安装 Providers。

被引用--set provider.packages参数与 helm install 一起使用。

例如,安装 AWS Community Provider、

1helm install crossplane \
2crossplane-stable/crossplane \
3--namespace crossplane-system \
4--create-namespace \
5--set provider.packages='{xpkg.upbound.io/crossplane-contrib/provider-aws:v0.39.0}'

离线安装

crossplane 从本地软件包缓存中安装软件包。默认情况下,crossplane 软件包缓存是一个 emptyDir volume

配置 Crossplane,使其被引用PersistentVolumeClaim,以使用包含 Provider 镜像的存储位置。阅读Crossplane 安装文档 中有关配置 Crossplane Pod 设置的更多信息。https://crossplane.devops.gold/master/software/install/#customize-the-crossplane-helm-chart).

提供 Provider 的.xpkg文件名并设置packagePullPolicy: Never.

例如,要安装本地存储的 Provider AWS 版本,请将package为本地文件名,并将 Provider 的packagePullPolicy: Never.

1apiVersion: pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: offline-provider-aws
5spec:
6  package: provider-aws
7  packagePullPolicy: Never

安装选项

Providers 支持多种配置选项,可更改与安装相关的设置。

提供商拉动政策

被引用 软件包拉取策略来定义 Crossplane 应何时将 Provider 软件包下载到本地 Crossplane 软件包缓存。

packagePullPolicy` 选项包括

  • IfNotPresent - (默认)只下载不在缓存中的软件包。
  • Always - 每分钟检查新软件包,并下载缓存中没有的匹配软件包。
  • Never` - 永远不下载软件包。只从本地软件包缓存中安装软件包。
Tip

crossplane拉取策略的工作原理与 Kubernetes 容器镜像 image pull policy类似。

crossplane 支持像 Kubernetes 镜像一样使用标签和包摘要散列。

例如,要 “始终 “下载给定的 Provider 软件包,可使用packagePullPolicy: Always配置。

1apiVersion: pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: provider-aws
5spec:
6  packagePullPolicy: Always
7# Removed for brevity

修订激活政策

主动 “软件包 Revisions 是主动调节资源的软件包控制器。

默认情况下,Crossplane 会将最近安装的软件包修订版设置为 “激活”。

通过一个修订激活策略.

修订激活策略 修订激活策略选项有

  • Automatic - (默认)自动激活最后安装的 Provider。
  • Manual - 不自动激活 Provider。

例如,要将升级行为改为要求手动升级,可设置revisionActivationPolicy: Manual.

1apiVersion: pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: provider-aws
5spec:
6  revisionActivationPolicy: Manual
7# Removed for brevity

包修订历史限制

当 Crossplane 安装同一 Provider 软件包的不同版本时,Crossplane 会创建一个新的 revision

默认情况下,crossplane 维护一个 Inactive Revisions。

Note
请阅读Provider upgrade部分,了解更多关于使用软件包修订的信息。

更改 Crossplane 通过 Provider 包维护的修订次数修订历史限制.

修订历史限制 修订历史限制字段是一个整数,默认值为 “1”。 通过设置修订历史限制设置为0

例如,要更改默认设置并存储 10 个修订版本,请使用revisionHistoryLimit: 10.

1apiVersion: pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: provider-aws
5spec:
6  revisionHistoryLimit: 10
7# Removed for brevity

从私人注册表安装 Provider

就像 Kubernetes 使用 imagePullSecrets从私有 registry 安装镜像,Crossplane 也使用 packagePullSecrets 来从私有 registry 安装 Provider 软件包。

被引用 packagePullSecrets来提供一个 Kubernetes secret,以便在下载 Provider 软件包时用于身份验证。

Important
Kubernetes secret 必须与 crossplane 位于同一命名空间。

是一个secret列表。是一个secret列表。

例如,要使用名为example-secret 的secret配置一个packagePullSecrets.

1apiVersion: pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: provider-aws
5spec:
6  packagePullSecrets: 
7    - name: example-secret
8# Removed for brevity
Note
配置的 packagePullSecrets 不会传递给任何 Provider 软件包依赖项。

忽略依赖关系

默认情况下,Crossplane 会安装 Provider 软件包中列出的任何 依赖项

crossplane 可以通过以下方式忽略 Provider 软件包的依赖关系skipDependencyResolution.

例如,要禁用依赖关系解析,请配置skipDependencyResolution: true.

1apiVersion: pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: provider-aws
5spec:
6  skipDependencyResolution: true
7# Removed for brevity

忽略 crossplane 版本要求

在安装之前,Provider 软件包可能需要特定或最低 Crossplane 版本。 默认情况下,如果 Crossplane 版本不符合要求,Crossplane 不会安装 Provider。

crossplane 可以使用忽略 CrossplaneConstraints.

例如,要将 Provider 软件包安装到不支持的 crossplane 版本中,请配置ignoreCrossplaneConstraints: true.

1apiVersion: pkg.crossplane.io/v1
2kind: Provider
3metadata:
4  name: provider-aws
5spec:
6  ignoreCrossplaneConstraints: true
7# Removed for brevity

管理依赖关系

Providers 软件包可能依赖于其他软件包,包括配置或其他 Providers。

如果 Crossplane 无法满足 Provider 软件包的依赖关系,Provider 会将 “HEALTHY “报告为 “False”。

例如,upbound AWS 参考平台的此安装为 HEALTHY: false

1kubectl get providers
2NAME INSTALLED HEALTHY PACKAGE AGE
3provider-aws-s3 True False xpkg.upbound.io/upbound/provider-aws-s3:v0.41.0 12s

要查看有关 Provider 为何不是 “HEALTHY “的更多信息,请使用kubectl describe providerrevisions.

 1kubectl describe providerrevisions
 2Name:         provider-aws-s3-92206523fff4
 3API Version:  pkg.crossplane.io/v1
 4Kind:         ProviderRevision
 5Spec:
 6  Desired State:                  Active
 7  Image:                          xpkg.upbound.io/upbound/provider-aws-s3:v0.41.0
 8  Revision:                       1
 9Status:
10  Conditions:
11    Last Transition Time:  2023-10-10T21:06:39Z
12    Reason:                UnhealthyPackageRevision
13    Status:                False
14    Type:                  Healthy
15  Controller Ref:
16    Name:
17Events:
18  Type Reason Age From Message
19  ----     ------             ----               ----                                         -------
20  Warning LintPackage 41s (x3 over 47s)  packages/providerrevision.pkg.crossplane.io incompatible Crossplane version: package is not compatible with Crossplane version (v1.10.0)

活动 活动显示警告并提示当前版本的 crossplane 不符合配置包要求。

升级一个提供商

要升级现有的 Provider,可通过应用新的 Provider 配置清单或使用 kubectl edit providers 编辑已安装的 Provider 包。

更新 Provider 的 spec.package 中的版本号并应用更改。 crossplane 安装新镜像并创建新的 ProviderRevision

ProviderRevision “允许 crossplane 存储已废弃的 Provider CRD,在您决定之前不会删除它们。

使用以下方法查看 `ProviderRevisionskubectl get providerrevisions

1kubectl get providerrevisions
2NAME HEALTHY REVISION IMAGE STATE DEP-FOUND DEP-INSTALLED AGE
3provider-aws-s3-dbc7f981d81f True 1 xpkg.upbound.io/upbound/provider-aws-s3:v0.37.0 Active 1 1 10d
4provider-nop-552a394a8acc True 2 xpkg.upbound.io/crossplane-contrib/provider-nop:v0.3.0 Active 11d
5provider-nop-7e62d2a1a709 True 1 xpkg.upbound.io/crossplane-contrib/provider-nop:v0.2.0 Inactive 13d
6upbound-provider-family-aws-710d8cfe9f53 True 1 xpkg.upbound.io/upbound/provider-family-aws:v0.40.0 Active 10d

默认情况下,crossplane 只保留一个非活动Provider.

请阅读 revision history limit 部分以更改默认值。

一个 Provider 只能有一个修订版本活动在同一时间内

删除一个提供商

使用 kubectl delete provider 删除 Provider 对象,从而移除 Provider。

Warning

删除 Provider 而不先删除 Provider 的托管资源可能会放弃资源。 外部资源不会被删除。

如果先删除 Provider,则必须通过云提供商手动删除外部资源。 必须通过移除其 Finalizer 手动删除托管资源。

有关删除废弃资源的更多信息,请阅读crossplane 故障排除指南.

验证一个提供商

Providers 安装自己的 API,代表其支持的托管资源。 Providers 还可以创建部署、服务账户或 RBAC 配置。

使用以下功能查看 Provider 的状态

kubectl get Provider 获取 Provider

在安装过程中,Provider 将 INSTALLED 报告为 True,将 HEALTHY 报告为 Unknown

1kubectl get providers
2NAME INSTALLED HEALTHY PACKAGE AGE
3crossplane-contrib-provider-aws True Unknown xpkg.upbound.io/crossplane-contrib/provider-aws:v0.39.0 63s

Provider 安装完成并准备就绪后,“HEALTHY “状态会被引用为 “True”。

1kubectl get providers
2NAME INSTALLED HEALTHY PACKAGE AGE
3crossplane-contrib-provider-aws True True xpkg.upbound.io/crossplane-contrib/provider-aws:v0.39.0 88s
Important

有些 Providers 会安装数百个 Kubernetes 自定义资源定义 (CRD)。 这可能会对规模不足的 API 服务器造成巨大压力,影响 Providers 的安装时间。

crossplane 社区有更多 关于缩放 CRD 的详细信息

提供者条件

crossplane 为 Provider 引用了一套标准的 “条件”。 使用 “kubectl describe provider “可查看 Provider 的 “Status “下的条件。

 1kubectl describe provider
 2Name:         my-provider
 3API Version:  pkg.crossplane.io/v1
 4Kind:         Provider
 5# Removed for brevity
 6Status:
 7  Conditions:
 8    Reason:      HealthyPackageRevision
 9    Status:      True
10    Type:        Healthy
11    Reason:      ActivePackageRevision
12    Status:      True
13    Type:        Installed
14# Removed for brevity

类型

Provider 的 “条件 “支持两种 “类型”:

  • 类型: 已安装` - Provider 软件包已安装,但尚未准备好使用。
  • 类型: Healthy` - Provider 软件包已可使用。

原因

每个 “原因 “都与特定的 “类型 “和 “状态 “有关。 Crossplane 为 Provider “条件 “引用了以下 “原因”。

InactivePackageRevision

Reason: InactivePackageRevision”(原因: 非活动包修订版)表示该提供商包正在引用一个非活动的提供商包修订版。

1Type: Installed
2Status: False
3Reason: InactivePackageRevision
ActivePackageRevision

Provider 软件包是当前的软件包修订版,但 crossplane 尚未完成软件包修订版的安装。

Tip

陷入这种状态的提供商是因为数据包修订(Package Revisions)出了问题。

更多详情请被引用 kubectl describe providerrevisions

1Type: Installed
2Status: True
3Reason: ActivePackageRevision
HealthyPackageRevision

Provider 已完全安装完毕,随时可以使用。

Tip
原因: HealthyPackageRevision “是工作中的 Provider 的正常状态。
1Type: Healthy
2Status: True
3Reason: HealthyPackageRevision
UnhealthyPackageRevision

安装 Provider 软件包修订版时出现错误,导致 crossplane 无法安装 Provider 软件包。

Tip
使用 kubectl describe providerrevisions 获取更多有关包修订失败原因的详细信息。
1Type: Healthy
2Status: False
3Reason: UnhealthyPackageRevision
UnknownPackageRevisionHealth

Provider 包修订版的状态是 “未知”。 Provider 包修订版可能正在安装或有问题。

Tip
使用 kubectl describe providerrevisions 获取更多有关包修订失败原因的详细信息。
1Type: Healthy
2Status: Unknown
3Reason: UnknownPackageRevisionHealth

配置 Provider

Providers 有两种不同类型的配置:

  • 控制器配置_可更改在 Kubernetes 集群内运行的 Provider pod 的设置。 的设置。例如,在 例如,在 Provider pod 上设置 “toleration”。
  • 提供程序配置_可更改与外部提供程序通信时被引用的设置。 与外部提供程序通信时使用的设置。例如,云提供商身份验证。
Important

ControllerConfig 对象应用到 Provider。

ProviderConfig 对象应用到 managed 资源。

控制器配置

Important

在 v1.11 中,“ControllerConfig “类型已被弃用,并将在以后的发布中移除。

部署运行时配置 可替代控制器配置,在 v1.14+ 中可用。

对 Provider 应用 crossplane ControllerConfig 会更改 Provider pod 的设置。Crossplane ControllerConfig schema 定义了受支持的 ControllerConfig 设置集。

ControllerConfigs 最常见的用例是为 Provider 的 pod 启用可选服务提供 “参数”。 例如,为 Provider 启用外部存储

每个 Provider 都会确定其支持的 “参数 “集。

运行时配置

Important

DeploymentRuntimeConfigs “是测试版功能。

默认情况下它是开启的,你可以通过在 crossplane 部署中传递 --enable-deployment-runtime-configs=false来禁用它。

运行时配置是一种通用机制,用于配置具有运行时的 crossplane 包(即 ProviderFunctions)的运行时。 它取代了已废弃的 ControllerConfig 类型,在 v1.14+ 中可用。

在默认配置下,crossplane 使用 Kubernetes 部署来为软件包部署运行时,更具体地说,是为 “Provider “部署控制器,或为 “Function “部署 gRPC 服务器。 可以通过被引用 “DeploymentRuntimeConfig “并在 “Provider “或 “Function “对象中引用它来配置运行时清单。

Note
ControllerConfig 不同,DeploymentRuntimeConfig 嵌入了整个 Kubernetes 部署规范,可以更灵活地配置运行时。详情请参考设计文档

举例来说,如果要通过在控制器中添加 --enable-external-secret-stores参数来启用 Provider 的外部secret存储 alpha 功能,可以应用下面的方法:

 1apiVersion: pkg.crossplane.io/v1
 2kind: Provider
 3metadata:
 4  name: provider-gcp-iam
 5spec:
 6  package: xpkg.upbound.io/upbound/provider-gcp-iam:v0.37.0
 7  runtimeConfigRef:
 8    name: enable-ess
 9---
10apiVersion: pkg.crossplane.io/v1beta1
11kind: DeploymentRuntimeConfig
12metadata:
13  name: enable-ess
14spec:
15  deploymentTemplate:
16    spec:
17      selector: {}
18      template:
19        spec:
20          containers:
21            - name: package-runtime
22              args:
23                - --enable-external-secret-stores

请注意,软件包管理器使用 package-runtime 作为运行时容器的名称。 当你使用不同的容器名称时,软件包管理器会将其作为侧载容器引入,而不是修改软件包运行时容器。

packages 管理器对某些字段有意见,以确保

例如,如果未设置复制计数,它会将其默认为 1,并覆盖标签选择器,以确保部署和服务相匹配。 它还会注入任何必要的环境变量、端口以及卷和卷挂载。

Provider “或 “Functions “的 “spec.runtimeConfigRef.name “字段默认值为 “default”,这意味着如果未指定,Crossplane 将使用默认运行时配置。 Crossplane 可确保始终有一个默认运行时配置。

但如果配置已经存在,则不会更改。

允许用户根据自己的需要定制默认运行时配置。

Tip

由于 DeploymentRuntimeConfig 与 Kubernetes Deployment 使用相同的模式

例如,如果只想更改 replicas 字段,则需要传递以下内容:

 1apiVersion: pkg.crossplane.io/v1beta1
 2kind: DeploymentRuntimeConfig
 3metadata:
 4  name: multi-replicas
 5spec:
 6  deploymentTemplate:
 7    spec:
 8      replicas: 2
 9      selector: {}
10      template: {}

配置运行时部署规范

软件包管理器会以 DeploymentRuntimeConfig 中提供的部署规范为基础,按照以下规则为软件包运行时构建部署规范:

  • 注入软件包运行时容器,作为 containers 数组中的第一个容器,名称为 package-runtime
  • 如果未 Provider,则默认使用以下内容:
    • spec.replicas 为 1。
    • 镜像拉取策略为 IfNotPresent
    • Pod 安全上下文为 yaml runAsNonRoot: true runAsUser: 2000 runAsGroup: 2000
    • 运行时容器的安全上下文为
      1allowPrivilegeEscalation: false
      2privileged: false
      3runAsGroup: 2000
      4runAsNonRoot: true
      5runAsUser: 2000
      
  • 应用以下内容:
    • 设置* metadata.namespace 为 crossplane 名称空间。
    • Sets metadata.ownerReferences such that the deployment owned by the packages revision.
    • 设置* spec.selectors 使用生成的标签。
    • 使用创建的服务账户设置spec.serviceAccount
    • 添加Package 规范中提供的拉取secret作为镜像拉取secret,即 spec.packagePullSecrets
    • 使用软件包规格中提供的值设置镜像拉取策略**,spec.packagePullPolicy
    • 向运行时容器添加必要的**端口。
    • 将必要的端口**添加到运行时容器。
    • 通过在运行时容器中添加必要的*、卷挂载环境来挂载 TLS secrets。

配置运行时资源的元数据

DeploymentRuntimeConfig “还能配置运行时资源的以下元数据,即 “部署”、“服务帐户 “和 “服务”:

  • 名称
  • 标签
  • Annotations

下面的示例显示了如何配置服务帐户的名称和部署的标签:

 1apiVersion: pkg.crossplane.io/v1beta1
 2kind: DeploymentRuntimeConfig
 3metadata:
 4  name: my-runtime-config
 5spec:
 6  deploymentTemplate:
 7    metadata:
 8      labels:
 9        my-label: my-value
10  serviceAccountTemplate:
11    metadata:
12      name: my-service-account

Provider 配置

ProviderConfig “决定了 Provider 与外部提供程序通信时使用的设置。 每个提供程序都决定了其 “ProviderConfig “的可用设置。

Provider 身份验证通常使用 “ProviderConfig “进行配置。 例如,要在 Provider AWS 中使用基本密钥对身份验证,就需要使用一个提供商配置规格定义了凭据以及 Provider pod 应在 KubernetesSecrets对象中,并使用名为aws-creds.

 1apiVersion: aws.crossplane.io/v1beta1
 2kind: ProviderConfig
 3metadata:
 4  name: aws-provider
 5spec:
 6  credentials:
 7    source: Secret
 8    secretRef:
 9      namespace: crossplane-system
10      name: aws-creds
11      key: creds
Important

不同 Provider 的身份验证配置可能不同。

请阅读特定 Provider 的文档,了解为该 Provider 配置身份验证的说明。

ProviderConfig 对象适用于单个托管资源。 单个 Provider 可以通过 ProviderConfigs 验证多个用户或账户。

每个账户的凭据都与唯一的 ProviderConfig 相关联。 创建托管资源时,附加所需的 ProviderConfig。

例如,两个名为用户密钥admin-keys被引用了不同的 Kubernetes secrets。

 1apiVersion: aws.crossplane.io/v1beta1
 2kind: ProviderConfig
 3metadata:
 4  name: user-keys
 5spec:
 6  credentials:
 7    source: Secret
 8    secretRef:
 9      namespace: crossplane-system
10      name: my-key
11      key: secret-key
 1apiVersion: aws.crossplane.io/v1beta1
 2kind: ProviderConfig
 3metadata:
 4  name: admin-keys
 5spec:
 6  credentials:
 7    source: Secret
 8    secretRef:
 9      namespace: crossplane-system
10      name: admin-key
11      key: admin-secret-key

创建托管资源时应用 ProviderConfig。

这会创建一个 AWS 资源。用户密钥ProviderConfig.

1apiVersion: s3.aws.upbound.io/v1beta1
2kind: Bucket
3metadata:
4  name: user-bucket
5spec:
6  forProvider:
7    region: us-east-2
8  providerConfigRef:
9    name: user-keys

这会创建第二个 资源,使用被引用的admin-keysProviderConfig.

1apiVersion: s3.aws.upbound.io/v1beta1
2kind: Bucket
3metadata:
4  name: user-bucket
5spec:
6  forProvider:
7    region: us-east-2
8  providerConfigRef:
9    name: admin-keys