《kubebuilder 从零开始实战》 - 06. 使用 Operator 创建并发布一个 Pod
使用 Operator 创建并发布一个 Pod
1. 组装 k8s api 创建 pod
创建 /controllers/helper
目录, 这里面的代码实现 k8s Workloads 的创建。 具体实现就是封装 k8s workloads 的 api 对象
|
|
补充说明一下,为什么要把 helper
放在 /controllers
目录下。
- 其一, helper 是 controllers 的实现操作的行为, 算 controller 的一部分
- 其二,
/Dockerfile
中在编译 go 代码的时候是有选择性的将代码目录复制进去的。 如果在根目录上自建目录( ex./helper
), 那么就需要额外修改 Dockerfile,
|
|
否则编译不通过,报错说找不到 helper 目录。
|
|
2. 添加主机并使用 rbac 授权 Operator 操作 k8s
上面实现了创建 k8s pod 的 api 之后, 将 operator 编译并发不到 k8s 集群中。
|
|
在创建 redis 实例的时候, operator controller pod 报错如下, serviceaccount 没有权限操作 pods。
2021-11-20T09:10:59.042Z ERROR controller.redis Reconciler error {"reconciler group": "myapp.tangx.in", "reconciler kind": "Redis", "name": "my-op-redis", "namespace": "default", "error": "创建 redis pod 失败: pods is forbidden: User \"system:serviceaccount:k8s-operator-demo-system:k8s-operator-demo-controller-manager\" cannot create resource \"pods\" in API group \"\" in the namespace \"default\""}
这时因为生成的 /config/rbac/role.yaml
文件中的 rbac 权限不够。
在 /controllers/redis_controller.go
的 Reconcile
方法上方,添加注解
格式如下
|
|
为了要对 pod 具有操作权限, 需要对 增加对应的 kubebuilder 注解。
|
|
这样我们实现的 operator 就可以对 pod 进行增删改等操作了。
如果不知道 资源组名称 和 资源名称, 可以使用命令 kubectl api-resources
查看
|
|
groups
: 对应的 NAME 字段就是 资源名称rexources
: 对应的 APIVERSION 字段, 去掉/版本号
就是 资源组名称- 因此 pods 隶属于 k8s core 组。 资源组名称 就是空
""
- deployments 隶属于 k8s apps 组, 资源组名称 就是
apps
- 因此 pods 隶属于 k8s core 组。 资源组名称 就是空
verbs
: 对应的就是操作动作。
同样在 yaml 文件也可以快速看出隶属于什么 apis
|
|
https://kubernetes.io/zh/docs/reference/access-authn-authz/rbac/
3. 注释 webhook 方便测试
为了方便本地测试, 对 /main.go
中的 SetupWebhookWithManager
webhook 相关代码增加了一个条件判断。
如下
|
|
同时在 Makefile 中也增加相应的环境变量注入
|
|
这样就不用在 测试和编译 之间来回注释/反注释这段代码了。
- 原文链接:https://typonotes.com/posts/books/kubebuilder-zero-to-one/06-create-pod-by-redis-operator/
- 本文为原创文章,转载注明出处。
- 欢迎 扫码关注公众号
Go与云原生
或 订阅网站 https://typonotes.com/ 。 - 第一时间看后续精彩文章。觉得好的话,请猛击文章右下角「在看」,感谢支持。