
# 创建API和Controller
根据以上设计的CR，在项目工程中创建对应的CRD类型：
```
$ kubebuilder create api --group osctest --version v1 --kind Hwfka
Create Resource [y/n]
y
Create Controller [y/n]
y
Writing kustomize manifests for you to edit...
Writing scaffold for you to edit...
api/v1/hwfka_types.go
controllers/hwfka_controller.go
Update dependencies:
go mod tidy
Running make:
make generate
go: creating new go.mod: module tmp
Downloading sigs.k8s.io/controller-tools/cmd/controller-gen@v0.7.0
go get: added sigs.k8s.io/controller-tools v0.7.0
/mnt/d/repository/Go/GOPATH/src/hwfka-operator/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
Next: implement your new API and generate the manifests (e.g. CRDs,CRs) with:
make manifests
```
![](https://support.huaweicloud.com/devg-osc/public_sys-resources/note_3.0-zh-cn.png)
通过kubebuilder create api命令，可以发现在重复下载controller-gen的二进制文件，包括后续使用Makefile去编译operator的二进制文件及打包镜像时，都可能会重复下载使用controller-gen二进制文件，建议提前安装controller-gen二进制，并修改Makefile中有关这个命令为使用系统命令，而非每次通过go get下载并编译后使用。
该命令主要执行以下动作：
1. 在PROJECT文件中增加API资源声明。
   ```
   domain: huawei.com
   layout:
   - go.kubebuilder.io/v3
   projectName: hwfka-operator
   repo: hwfka-operator
   resources:
   - api:
       crdVersion: v1
       namespaced: true
     controller: true
     domain: huawei.com
     group: osctest
     kind: Hwfka
     path: hwfka-operator/api/v1
     version: v1
   version: "3"
   ```
   
2. 新增CRD及CR的描述文件。
   ```
   hwfka-operator
   └── config
       ├── crd
       │   ├── kustomization.yaml
       │   ├── kustomizeconfig.yaml
       │   └── patches
       │       ├── cainjection_in_hwfkas.yaml
       │       └── webhook_in_hwfkas.yaml
       ├── rbac # 增加文件
       │   ├── hwfka_editor_role.yaml
       │   └── hwfka_viewer_role.yaml
       └── samples
           └── osctest_v1_hwfka.yaml
   ```
   
3. 新增api目录，包含CRD的类型定义。
   ```
   hwfka-operator
   └── api
       └── v1
           ├── groupversion_info.go
           ├── hwfka_types.go
           └── zz_generated.deepcopy.go
   ```
   
4. 新增controllers目录，包含控制器的业务逻辑。
   ```
   hwfka-operator
   └── controllers
       ├── hwfka_controller.go
       └── suite_test.go
   ```
   
5. 在main.go的Manager启动时，创建Controller。
   ```
   if err = (&controllers.HwfkaReconciler{
       Client: mgr.GetClient(),
       Scheme: mgr.GetScheme(),
   }).SetupWithManager(mgr); err != nil {
       setupLog.Error(err, "unable to create controller", "controller", "Hwfka")
       os.Exit(1)
   }
   ```
   
 
