operator简介

打印 上一主题 下一主题

主题 908|帖子 908|积分 2724

原理

operator 是一种 kubernetes 的扩展形式,利用自定义资源对象(Custom Resource)来管理应用和组件,允许用户以 Kubernetes 的声明式 API 风格来管理应用及服务。

  • CRD (Custom Resource Definition): 允许用户自定义 Kubernetes 资源,是一个类型;
  • CR (Custom Resourse): CRD 的一个具体实例;
  • webhook: 它本质上是一种 HTTP 回调,会注册到 apiserver 上。在 apiserver 特定事件发生时,会查询已注册的 webhook,并把相应的消息转发过去。按照处理类型的不同,一般可以将其分为两类:一类可能会修改传入对象,称为 mutating webhook;一类则会只读传入对象,称为 validating webhook。
  • 工作队列: controller 的核心组件。它会监控集群内的资源变化,并把相关的对象,包括它的动作与 key,例如 Pod 的一个 Create 动作,作为一个事件存储于该队列中;
  • controller :它会循环地处理上述工作队列,按照各自的逻辑把集群状态向预期状态推动。不同的 controller 处理的类型不同,比如 replicaset controller 关注的是副本数,会处理一些 Pod 相关的事件;
  • operator:operator 是描述、部署和管理 kubernetes 应用的一套机制,从实现上来说,可以将其理解为 CRD 配合可选的 webhook 与 controller 来实现用户业务逻辑,即 operator = CRD + webhook + controller。
工作流程



  • 用户创建一个自定义资源 (CRD);
  • apiserver 根据自己注册的一个 pass 列表,把该 CRD 的请求转发给 webhook;
  • webhook 一般会完成该 CRD 的缺省值设定和参数检验。webhook 处理完之后,相应的 CR 会被写入数据库,返回给用户;
  • 与此同时,controller 会在后台监测该自定义资源,按照业务逻辑,处理与该自定义资源相关联的特殊操作;
  • 上述处理一般会引起集群内的状态变化,controller 会监测这些关联的变化,把这些变化记录到 CRD 的状态中。
构建工具

两者实际上并没有本质的区别,它们的核心都是使用官方的 controller-tools 和 controller-runtime。
operator SDK

operator framework,是 CoreOS 公司开发和维护的用于快速创建 operator 的工具,可以帮助我们快速构建 operator 应用。
安装
  1. #下载operator sdk
  2. wget https://github.com/operator-framework/operator-sdk/releases
复制代码
创建项目
  1. mkdir -p /root/go/src/github.com/memcached-operator
  2. cd /root/go/src/github.com/memcached-operator
  3. operator-sdk init --domain example.com --repo github.com/memcached-operator
复制代码
创建API
  1. operator-sdk create api --group cache --version v1alpha1 --kind Memcached --resource --controller
复制代码
项目结构
  1. # tree
  2. .
  3. ├── api
  4. │   └── v1alpha1
  5. │       ├── groupversion_info.go
  6. │       ├── memcached_types.go
  7. │       └── zz_generated.deepcopy.go
  8. ├── bin
  9. │   └── controller-gen
  10. ├── config
  11. │   ├── crd
  12. │   │   ├── kustomization.yaml
  13. │   │   ├── kustomizeconfig.yaml
  14. │   │   └── patches
  15. │   │       ├── cainjection_in_memcacheds.yaml
  16. │   │       └── webhook_in_memcacheds.yaml
  17. │   ├── default
  18. │   │   ├── kustomization.yaml
  19. │   │   ├── manager_auth_proxy_patch.yaml
  20. │   │   └── manager_config_patch.yaml
  21. │   ├── manager
  22. │   │   ├── controller_manager_config.yaml
  23. │   │   ├── kustomization.yaml
  24. │   │   └── manager.yaml
  25. │   ├── manifests
  26. │   │   └── kustomization.yaml
  27. │   ├── prometheus
  28. │   │   ├── kustomization.yaml
  29. │   │   └── monitor.yaml
  30. │   ├── rbac
  31. │   │   ├── auth_proxy_client_clusterrole.yaml
  32. │   │   ├── auth_proxy_role_binding.yaml
  33. │   │   ├── auth_proxy_role.yaml
  34. │   │   ├── auth_proxy_service.yaml
  35. │   │   ├── kustomization.yaml
  36. │   │   ├── leader_election_role_binding.yaml
  37. │   │   ├── leader_election_role.yaml
  38. │   │   ├── memcached_editor_role.yaml
  39. │   │   ├── memcached_viewer_role.yaml
  40. │   │   ├── role_binding.yaml
  41. │   │   └── service_account.yaml
  42. │   ├── samples
  43. │   │   ├── cache_v1alpha1_memcached.yaml
  44. │   │   └── kustomization.yaml
  45. │   └── scorecard
  46. │       ├── bases
  47. │       │   └── config.yaml
  48. │       ├── kustomization.yaml
  49. │       └── patches
  50. │           ├── basic.config.yaml
  51. │           └── olm.config.yaml
  52. ├── controllers
  53. │   ├── memcached_controller.go
  54. │   └── suite_test.go
  55. ├── Dockerfile
  56. ├── go.mod
  57. ├── go.sum
  58. ├── hack
  59. │   └── boilerplate.go.txt
  60. ├── main.go
  61. ├── Makefile
  62. └── PROJECT
  63. 17 directories, 43 files
复制代码
测试

将 CRD 安装到k8s集群中
  1. make install
复制代码
部署operator
  1. make deploy
复制代码
安装CR实例
  1. kubectl apply -f config/samples/cache_v1alpha1_memcached.yaml
复制代码
卸载operator
  1. make undeploy
复制代码
卸载CRD
  1. make uninstall
复制代码
kubebuilder

安装
  1. # 下载 kubebuilder
  2. wget https://github.com/kubernetes-sigs/kubebuilder/releases/download/v2.3.1/kubebuilder_2.3.1_linux_amd64.tar.gz
复制代码
创建项目
  1. mkdir -p /root/go/src/github.com/testcrd-controller
  2. cd /root/go/src/github.com/testcrd-controller
  3. #--domain 指定了后续注册 CRD 对象的 Group 域名
  4. kubebuilder init --domain edas.io
复制代码
创建API
  1. kubebuilder create api --group apps --version v1alpha1 --kind Application
复制代码
参数说明:

  • group 加上之前的 domian 即此 CRD 的 Group: apps.edas.io;
  • version 一般分三种,按社区标准:

    • v1alpha1: 此 api 不稳定,CRD 可能废弃、字段可能随时调整,不要依赖;
    • v1beta1: api 已稳定,会保证向后兼容,特性可能会调整;
    • v1: api 和特性都已稳定;

  • kind: 此 CRD 的类型,类似于 Service 的概念;
项目结构
  1. # ls
  2. api  bin  config  controllers  Dockerfile  go.mod  go.sum  hack  main.go  Makefile  PROJECT
  3. # tree
  4. .
  5. ├── api
  6. │   └── v1alpha1
  7. │       ├── application_types.go
  8. │       ├── groupversion_info.go
  9. │       └── zz_generated.deepcopy.go
  10. ├── bin
  11. │   └── manager
  12. ├── config
  13. │   ├── certmanager
  14. │   │   ├── certificate.yaml
  15. │   │   ├── kustomization.yaml
  16. │   │   └── kustomizeconfig.yaml
  17. │   ├── crd
  18. │   │   ├── bases
  19. │   │   │   └── apps.edas.io_applications.yaml
  20. │   │   ├── kustomization.yaml
  21. │   │   ├── kustomizeconfig.yaml
  22. │   │   └── patches
  23. │   │       ├── cainjection_in_applications.yaml
  24. │   │       └── webhook_in_applications.yaml
  25. │   ├── default
  26. │   │   ├── kustomization.yaml
  27. │   │   ├── manager_auth_proxy_patch.yaml
  28. │   │   ├── manager_webhook_patch.yaml
  29. │   │   └── webhookcainjection_patch.yaml
  30. │   ├── manager
  31. │   │   ├── kustomization.yaml
  32. │   │   └── manager.yaml
  33. │   ├── prometheus
  34. │   │   ├── kustomization.yaml
  35. │   │   └── monitor.yaml
  36. │   ├── rbac
  37. │   │   ├── application_editor_role.yaml
  38. │   │   ├── application_viewer_role.yaml
  39. │   │   ├── auth_proxy_client_clusterrole.yaml
  40. │   │   ├── auth_proxy_role_binding.yaml
  41. │   │   ├── auth_proxy_role.yaml
  42. │   │   ├── auth_proxy_service.yaml
  43. │   │   ├── kustomization.yaml
  44. │   │   ├── leader_election_role_binding.yaml
  45. │   │   ├── leader_election_role.yaml
  46. │   │   ├── role_binding.yaml
  47. │   │   └── role.yaml
  48. │   ├── samples
  49. │   │   └── apps_v1alpha1_application.yaml
  50. │   └── webhook
  51. │       ├── kustomization.yaml
  52. │       ├── kustomizeconfig.yaml
  53. │       └── service.yaml
  54. ├── controllers
  55. │   ├── application_controller.go
  56. │   └── suite_test.go
  57. ├── Dockerfile
  58. ├── go.mod
  59. ├── go.sum
  60. ├── hack
  61. │   └── boilerplate.go.txt
  62. ├── main.go
  63. ├── Makefile
  64. └── PROJECT
复制代码
测试

将 CRD 安装到k8s集群中
  1. make install
复制代码
本地运行controller
  1. make run
复制代码
安装CR实例
  1. kubectl apply -f config/samples/
复制代码
卸载CRD
  1. make uninstall
复制代码
创建webhook
  1. kubebuilder create webhook --group apps --version v1alpha1 --kind Application --defaulting --programmatic-validation
复制代码
案例

Mongodb

安装mongodb operator

安装mongodb实例
  1. ---
  2. apiVersion: mongodbcommunity.mongodb.com/v1
  3. kind: MongoDBCommunity
  4. metadata:
  5.   name: example-mongodb
  6. spec:
  7.   members: 1
  8.   type: ReplicaSet
  9.   version: "4.2.6"
  10.   security:
  11.     authentication:
  12.       modes: ["SCRAM"]
  13.   users:
  14.     - name: my-user
  15.       db: admin
  16.       passwordSecretRef: # a reference to the secret that will be used to generate the user's password
  17.         name: my-user-password
  18.       roles:
  19.         - name: clusterAdmin
  20.           db: admin
  21.         - name: userAdminAnyDatabase
  22.           db: admin
  23.       scramCredentialsSecretName: my-scram
  24.   additionalMongodConfig:
  25.     storage.wiredTiger.engineConfig.journalCompressor: zlib
  26. # the user credentials will be generated from this secret
  27. # once the credentials are generated, this secret is no longer required
  28. ---
  29. apiVersion: v1
  30. kind: Secret
  31. metadata:
  32.   name: my-user-password
  33. type: Opaque
  34. stringData:
  35.   password: "123456"
复制代码
使用mongodb
  1. # kubectl exec -it example-mongodb-0 -n mongodb bash   
  2. I have no name!@example-mongodb-0:/$ mongo
  3. MongoDB shell version v4.2.6
  4. connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
  5. Implicit session: session { "id" : UUID("51607c54-bc7d-4006-8ef6-a9ff0a2e767a") }
  6. MongoDB server version: 4.2.6
  7. Welcome to the MongoDB shell.
  8. For interactive help, type "help".
  9. For more comprehensive documentation, see
  10.         http://docs.mongodb.org/
  11. Questions? Try the support group
  12.         http://groups.google.com/group/mongodb-user
  13. 2021-08-23T03:21:29.304+0000 I  STORAGE  [main] In File::open(), ::open for '//.mongorc.js' failed with Permission denied
  14. example-mongodb:PRIMARY> use admin
  15. switched to db admin
  16. example-mongodb:PRIMARY> db.auth('my-user', '123456')
  17. 1
  18. example-mongodb:PRIMARY> show dbs
  19. admin   0.000GB
  20. config  0.000GB
  21. local   0.000GB
  22. example-mongodb:PRIMARY> exit
复制代码
ECK

Elastic Cloud on Kubernetes(ECK)是一个 Elasticsearch Operator。 ECK 使用 Kubernetes Operator 模式构建而成,需要安装在您的 Kubernetes 集群内,其功能绝不仅限于简化 Kubernetes 上 Elasticsearch 和 Kibana 的部署工作这一项任务。ECK 专注于简化所有后期运行工作,例如:

  • 管理和监测多个集群
  • 轻松升级至新的版本
  • 扩大或缩小集群容量
  • 更改集群配置
  • 动态调整本地存储的规模(包括 Elastic Local Volume(一款本地存储驱动器))
  • 备份
安装 ECK 对应的 Operator 资源对象
  1. #kubectl apply -f https://download.elastic.co/downloads/eck/1.6.0/all-in-one.yaml
复制代码
Elasticsearch

创建单节点Elasticsearch 集群

[code]cat

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莫张周刘王

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表