
K8s创建自定义资源CRD实操技术栈Kubernetes v1.32.13 CustomResourceDefinition Operator SDK v1.34.x Rocky Linux 8.6操作环境 / 对接原理 / 详细步骤 / 完整命令 / 配置文件 / 验证流程 / 排错方案K8s创建自定义资源CRD实操操作环境K8s 集群版本 v1.32.13支持 CRD v1 版本已安装 kubectl v1.32.13配置集群访问权限开发环境安装 Go 1.22.x、Operator SDK v1.34.x、controller-gen已部署 Cert-Manager v1.14.x、Ingress-NGINX v1.10.x、ExternalDNS v0.14.x命名空间默认 default可按需创建专用命名空间对接原理CRDCustomResourceDefinition是 K8s 扩展机制允许用户定义自定义资源类型。CRD 定义资源的名称、组、版本、作用域、字段校验 SchemaOpenAPI v3、子资源status/scale、打印列、短名称等。Operator 模式通过自定义控制器监听 CRD 资源的增删改事件在 Reconcile 循环中调谐实际状态至期望状态实现自动化运维。Cert-Manager 通过 Issuer/Certificate CRD 自动化证书签发和续期Ingress-NGINX 通过 Ingress CRD 配置七层路由ExternalDNS 通过 DNSRecord 同步域名解析。详细步骤1. 编写和创建 CRDcat myresource-crd.yaml EOF apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: myresources.example.com spec: group: example.com names: kind: MyResource listKind: MyResourceList plural: myresources singular: myresource shortNames: - mr categories: - all scope: Namespaced versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: size: type: integer minimum: 1 maximum: 10 image: type: string enabled: type: boolean default: true required: - size - image status: type: object properties: readyReplicas: type: integer phase: type: string subresources: status: {} scale: specReplicasPath: .spec.size statusReplicasPath: .status.readyReplicas additionalPrinterColumns: - name: Size type: integer jsonPath: .spec.size - name: Phase type: string jsonPath: .status.phase - name: Age type: date jsonPath: .metadata.creationTimestamp EOF kubectl apply -f myresource-crd.yaml # 验证 CRD kubectl get crd myresources.example.com kubectl explain myresource2. 创建自定义资源实例cat myresource-instance.yaml EOF apiVersion: example.com/v1 kind: MyResource metadata: name: demo spec: size: 3 image: nginx:1.25 enabled: true EOF kubectl apply -f myresource-instance.yaml # 查看资源 kubectl get myresources kubectl get mr kubectl describe myresource demo kubectl get myresource demo -o yaml验证流程# 1. 验证 CRD 创建 kubectl get crd crd-name # 显示 ESTABLISHED 条件为 True # 2. 验证自定义资源创建 kubectl get resource-plural # 资源列表正常显示 # 3. 验证字段校验 kubectl apply -f invalid-resource.yaml # 不合规资源应被 APIServer 拒绝并返回错误 # 4. 验证子资源 status kubectl get resource name -o jsonpath{.status} # status 字段可更新 # 5. 验证打印列 kubectl get resource # 自定义列正常显示 # 6. 验证控制器调谐 kubectl logs -f deployment/operator-name # 控制器日志显示 Reconcile 循环正常执行排错方案CRD 创建失败检查 API 版本apiextensions.k8s.io/v1group/name 是否符合规范Schema 是否有语法错误自定义资源创建被拒检查 spec 字段是否符合 OpenAPI Schemarequired 字段是否提供类型是否匹配枚举值是否合法控制器不调谐检查控制器是否 RunningRBAC 权限是否允许 watch/list 自定义资源日志是否有报错Status 无法更新确认 CRD 启用了 status 子资源subresources.status: {}控制器有 update status 权限Webhook 调用失败检查 webhook 服务是否可达TLS 证书是否正确conversionReviewVersions 是否匹配Cert-Manager 证书不签发检查 Issuer 状态DNS01/HTTP01 验证是否通过域名是否指向正确查看 Certificate 事件Ingress 不生效检查 ingressClassName 是否为 nginxIngress 控制器是否运行Service 和端口是否正确注解语法是否正确ExternalDNS 不同步检查 Provider 配置和凭据域名过滤是否正确TXT 记录所有权是否冲突查看 Pod 日志