使用外部资源

在某些情况下,您的项目可能需要与未由您自己定义的API的资源进行协作。这些外部资源主要分为两个类别:

  • 核心类型:由Kubernetes本身定义的API类型,例如PodsServicesDeployments
  • 外部类型:在其他项目中定义的API类型,例如由其他解决方案定义的CRD。

管理外部类型

为外部类型创建控制器

要为外部类型创建控制器而无需搭建资源,请使用 create api 命令并加上 --resource=false 选项,并使用 --external-api-path--external-api-domain 标志选项指定外部 API 类型的路径。这将为项目外部定义的类型生成控制器,例如由其他 Operator 管理的 CRD(自定义资源定义)。

该命令看起来像这样:

kubebuilder create api --group <theirgroup> --version <theirversion> --kind <theirKind> --controller --resource=false --external-api-path=<their Golang path import> --external-api-domain=<theirdomain>
  • --external-api-path:提供定义外部类型的 Go 导入路径。
  • --external-api-domain:提供外部类型的域名。该值将用于生成RBAC权限并创建QualifiedGroup,例如 - apiGroups: <group>.<domain>

例如,如果您正在管理来自 Cert Manager 的证书:

kubebuilder create api --group certmanager --version v1 --kind Certificate --controller=true --resource=false --external-api-path=github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1 --external-api-domain=io

请查看为此生成的 RBAC 标记

// +kubebuilder:rbac:groups=cert-manager.io,resources=certificates,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=cert-manager.io,resources=certificates/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=cert-manager.io,resources=certificates/finalizers,verbs=update

此外,RBAC角色:

- apiGroups:
  - cert-manager.io
  resources:
  - certificates
  verbs:
  - create
  - delete
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - cert-manager.io
  resources:
  - certificates/finalizers
  verbs:
  - update
- apiGroups:
  - cert-manager.io
  resources:
  - certificates/status
  verbs:
  - get
  - patch
  - update

这为外部类型搭建了一个控制器,但跳过了创建新的资源定义,因为该类型是在外部项目中定义的。

创建一个 Webhook 来管理外部类型

以下是一个示例:

kubebuilder create webhook --group certmanager --version v1 --kind Issuer --defaulting --programmatic-validation --external-api-path=github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1 --external-api-domain=cert-manager.io

管理核心类型

核心 Kubernetes API 类型,例如 PodsServicesDeployments,是由 Kubernetes 预定义的。要为这些核心类型创建一个控制器,而不使用资源脚手架,请使用以下表中描述的 Kubernetes 组名称,并指定版本和类型。

K8s API组
入学k8s.io/入场管理
入学注册k8s.io/admissionregistration
appsapps
审计注册k8s.io/auditregistration
apiextensions 的中文翻译是“API 扩展“。k8s.io/apiextensions
身份验证k8s.io/authentication
授权k8s.io/authorization
自动扩展自动扩展
batchbatch
证书k8s.io/证书
调整k8s.io/调整
核心核心
eventsk8s.io/events
扩展包扩展包
图像策略k8s.io/imagepolicy
网络连接k8s.io/networking
节点k8s.io/node
指标k8s.io/metrics
政策政策
rbac.authorizationk8s.io/rbac.authorization
调度k8s.io/调度
设置k8s.io/设置
storagek8s.io/storage

创建管理 Pods 的控制器的命令如下:

kubebuilder create api --group core --version v1 --kind Pod --controller=true --resource=false

例如,要创建一个控制器来管理部署,命令如下:

create api --group apps --version v1 --kind Deployment --controller=true --resource=false

请查看为此生成的 RBAC 标记

// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
// +kubebuilder:rbac:groups=apps,resources=deployments/status,verbs=get;update;patch
// +kubebuilder:rbac:groups=apps,resources=deployments/finalizers,verbs=update

此外,上述 标记 的 RBAC:

- apiGroups:
  - apps
  resources:
  - deployments
  verbs:
  - create
  - delete
  - get
  - list
  - patch
  - update
  - watch
- apiGroups:
  - apps
  resources:
  - 部署/最终处理程序
  verbs:
  - update
- apiGroups:
  - apps
  resources:
  - 部署/状态
  verbs:
  - get
  - patch
  - update

这为 Core 类型 corev1.Pod 构建了一个控制器,但由于该类型已在 Kubernetes API 中定义,因此跳过了创建新的资源定义。

创建一个 Webhook 来管理核心类型

您将使用核心类型数据运行命令,就像您对控制器那样。请看以下示例:

kubebuilder create webhook --group core --version v1 --kind Pod --programmatic-validation