使用外部资源
在某些情况下,您的项目可能需要与未由您自己定义的API的资源进行协作。这些外部资源主要分为两个类别:
- 核心类型:由Kubernetes本身定义的API类型,例如
Pods
、Services
和Deployments
。 - 外部类型:在其他项目中定义的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 类型,例如 Pods
、Services
和 Deployments
,是由 Kubernetes 预定义的。要为这些核心类型创建一个控制器,而不使用资源脚手架,请使用以下表中描述的 Kubernetes 组名称,并指定版本和类型。
组 | K8s API组 |
---|---|
入学 | k8s.io/入场管理 |
入学注册 | k8s.io/admissionregistration |
apps | apps |
审计注册 | k8s.io/auditregistration |
apiextensions 的中文翻译是“API 扩展“。 | k8s.io/apiextensions |
身份验证 | k8s.io/authentication |
授权 | k8s.io/authorization |
自动扩展 | 自动扩展 |
batch | batch |
证书 | k8s.io/证书 |
调整 | k8s.io/调整 |
核心 | 核心 |
events | k8s.io/events |
扩展包 | 扩展包 |
图像策略 | k8s.io/imagepolicy |
网络连接 | k8s.io/networking |
节点 | k8s.io/node |
指标 | k8s.io/metrics |
政策 | 政策 |
rbac.authorization | k8s.io/rbac.authorization |
调度 | k8s.io/调度 |
设置 | k8s.io/设置 |
storage | k8s.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