{"id":17201917,"url":"https://github.com/googs1025/k8s-controller-runtime-practice","last_synced_at":"2025-03-25T09:14:29.922Z","repository":{"id":138976557,"uuid":"562989812","full_name":"googs1025/k8s-controller-runtime-practice","owner":"googs1025","description":"controller-runtime的实践练习与简易源码分析","archived":false,"fork":false,"pushed_at":"2023-06-06T15:28:41.000Z","size":740,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-30T08:28:52.503Z","etag":null,"topics":["controller-runtime"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/googs1025.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"code-of-conduct.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY_CONTACTS","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-07T17:17:36.000Z","updated_at":"2022-12-03T04:24:15.000Z","dependencies_parsed_at":null,"dependency_job_id":"2c76930b-fad1-4060-915d-d335fbe5cbbc","html_url":"https://github.com/googs1025/k8s-controller-runtime-practice","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googs1025%2Fk8s-controller-runtime-practice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googs1025%2Fk8s-controller-runtime-practice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googs1025%2Fk8s-controller-runtime-practice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/googs1025%2Fk8s-controller-runtime-practice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/googs1025","download_url":"https://codeload.github.com/googs1025/k8s-controller-runtime-practice/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245431723,"owners_count":20614184,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["controller-runtime"],"created_at":"2024-10-15T02:13:05.105Z","updated_at":"2025-03-25T09:14:29.914Z","avatar_url":"https://github.com/googs1025.png","language":"Go","readme":"# 调用controller-runtime练习\n### 本项目是在controller-runtime的包下进行练习的项目，会把一些test文件与代码注释在上面。\n\n```\n1. download controller-runtime包文件\n2. 加入resources文件，里面放入.kube/config文件\n3. 主要测试代码都在pkg/test/test文件中\n```\n\n### 项目目录\n(主要是在test文件中，其馀都是源码)\n controller_runtime/pkg/test\n```\ntest\n├── common  // 读取配置\n│   └── common.go\n├── src // 代码\n│   ├── controllerDemo.go   // 控制器对象，重要\n│   ├── watches.go  // 监听不同资源 \n│   └── webForReconciler.go // 回调\n├ // 测试文件\n├── test_controller.go  \n├── test_reconciler.go\n├── test_scheme.go\n├── test_watches.go\n└── test_workqueue.go\n\n```\n![](https://github.com/googs1025/k8s-controller-runtime-practice/blob/main/image/controller_runtime.jpeg?ram=true)\n\n### 不同组件\n\n#### Schema: \n定义k8s中资源序列化和反序列化的方法以及资源类型和版本的对应关系(本身是个map对应关系)。\n\n可以根据GVK找到Go Type, 也可以通过Go Type找到GVK。\n\n#### Informer机制\n客户端均通过client-go(K8s系统使用client-go作为Go语言的官方编程式交互客户端库,提供对 K8s API Server服务的交互访问)的Informer机制与Kubernetes API Server进行通信的。\n\n#### Clients \n提供访问API对象的客户端。\n\n#### Caches \n默认情况下客户端从本地缓存读取对象。缓存将自动缓存需要Watch的对象，同时也会缓存其他被请求的结构化对象。\nCache内部是通过Informer负责监听对应 GVK 的 GVR 的创建/删除/更新操作,然后通知所有 Watch 该 GVK 的 Controller, Controller 将对应的资源名称添加到 Queue 里面,最终触发 Reconciler 的调协。\n\n#### Managers\nController runtime抽象的最外层的管理对象，负责管理 Controller、Caches、Client。\n\n#### Controllers\n控制器响应事件(Create/Update/Delete)来触发调协(reconcile)请求,与要实现的调协逻辑一一对应，会创建限速Queue, 一个Controller 可以关注很多**GVK**,然后根据**GVK**到Cache里面找到对应的Share Informer去Watch资源,Watch到的事件会加入到 Queue里面, Queue 最终触发开发者的Reconciler 的调和。\n\n#### Reconcilers\n开发者主要实现的逻辑，用来接收Controller的GVK事件，然后获取GVR 进行协调并决定是否更新或者重新入队。\n\n### controller-runtime流程\n```bigquery\n1. 初始化Schema注册表, 注册内置资源以及自定义资源;\n2. 创建并初始化manager对象，将注册表schema传入，并在内部初始化cache和client等资源;\n3. 初始化 Reconciler, 传入 client 和 schema\n4. 将Reconciler方法加入manager对象，并创建controller对象与Reconciler方法绑定;\n5. 用Controller Watch 资源(可以是CR)，controller会从 Cache 里面去拿到Share Informer,如果没有则创建,\n6. 然后对ShareInformer 进行 Watch,将得到的资源的名字和 Namespace存入到Queue中；\n7. Controller 不断获取 Queue 中的数据并调用 Reconciler 进行调协；\n```\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogs1025%2Fk8s-controller-runtime-practice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgoogs1025%2Fk8s-controller-runtime-practice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgoogs1025%2Fk8s-controller-runtime-practice/lists"}