【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

etcd-operator 快速入门完全教程

  • 2020-05-18
  • 本文字数:4294 字

    阅读完需:约 14 分钟

etcd-operator快速入门完全教程

Operator 是指一类基于 Kubernetes 自定义资源对象(CRD)和控制器(Controller)的云原生拓展服务,其中 CRD 定义了每个 operator 所创建和管理的自定义资源对象,Controller 则包含了管理这些对象所相关的运维逻辑代码。


对于普通用户来说,如果要在 k8s 集群中部署一个高可用的 etcd 集群,那么不仅要了解其相关的配置,同时又需要特定的 etcd 专业知识才能完成维护仲裁,重新配置集群成员,创建备份,处理灾难恢复等等繁琐的事件。


而在 operator 这一类拓展服务的协助下,我们就可以使用简单易懂的 YAML 文件(同理参考 Deployment)来声明式的配置,创建和管理我们的 etcd 集群,下面我们就来一同了解下 etcd-operator 这个服务的架构以及它所包含的一些功能。

目 标

  • 了解 etcd-operator 的架构与 CRD 资源对象

  • 部署 etcd-operator

  • 使用 etcd-operator 创建 etcd cluster

  • 基于 etcd-operator 备份和恢复 etcd cluster

服务架构

etcd-operator 的设计是基于 k8s 的 API Extension 机制来进行拓展的,它为用户设计了一个类似于 Deployment 的 Controller,只不过这个 Controller 是用来专门管理 etcd 这一服务的。


用户默认还是通过 kubectl 或 UI 来与 k8s 的 API 进行交互,只不过在这个 k8s 集群中多了一个用户自定义的控制器(custom controller),operator controller 的服务是以 Pod 的方式运行在 k8s 集群中的,同时这个服务也需要配置所需的 RBAC 权限(比如对 Pod,Deployment,Volume 等使用到的资源进行增删改查的操作),下面我们用一个简单的架构图来进行阐述:


etcd-operator 的自定义资源对象(CRD)

在 k8s 中,所有自定义的 Controller 和其自定义的资源对象(CRD)都必须满足 k8s API 的规范(参考下图):


  • apiVersion 描述了当前自定义资源对象的版本号

  • Kind 表示自定义资源对象的名称,用户可通过执行 kubectl get $KIND_NAME 来获取所创建的 CRD 对象

  • Metadata 继承了原生 k8s 的 metadata,用于添加标签,Annotations 等元数据

  • Spec 是用户可自定义设计的服务配置参数,如镜像版本号,节点数量,资源配置等等…

  • Status 包含了当前资源的的相关状态,每个 operator controller 可自定义 status 所包含的信息,一般会选择添加如 conditions,updateTime 和 message 等一类的信息。



下面先我们来了解一下 etcd-operator 所包含的几个自定义资源对象(CRDs):


1、 EtcdCluster : etcdcluster 用来描述用户自定义的 etcd 集群,可一键式部署和配置一个相关的 etcd 集群。


apiVersion: etcd.database.coreos.com/v1beta2kind: EtcdClustermetadata:  name: etcd-clusterspec:  size: 3  version: 3.2.25
复制代码


2、 EtcdBackup : etcdbackup 用来描述和管理一个 etcd 集群的备份,当前支持定期备份到云端存储,如 AWS s3, Aliyun oss(oss 当前需使用 quay.io/coreos/etcd-operator:dev 镜像)。


apiVersion: etcd.database.coreos.com/v1beta2kind: EtcdBackupmetadata:  name: etcd-backupspec:  etcdEndpoints: [<etcd-cluster-endpoints>]  storageType: OSS #options are S3/ABS/GCS/OSS  backupPolicy:    backupIntervalInSecond: 125    maxBackups: 4  oss:    #"<oss-bucket-name>/<path-to-backup-file>"    path: <full-oss-path>    ossSecret: <oss-secret>    # Details about regions and endpoints, see https://www.alibabacloud.com/help/doc-detail/31837.htm    endpoint: <endpoint> 
复制代码


3、 EtcdRestore: etcdrestore 用来帮助将 etcdbackup 服务所创建的备份恢复到一个指定的 etcd 的集群。


apiVersion: etcd.database.coreos.com/v1beta2kind: EtcdRestoremetadata:  # name must be same to the spec.etcdCluster.name  name: example-etcd-clusterspec:  etcdCluster:    name: example-etcd-cluster  backupStorageType: OSS  oss:    path: <full-oss-path>     ossSecret: <oss-secret>    endpoint: <endpoint>
复制代码

如何部署和使用 etcd-operator

1、部署 etcd-operator


在 Rancher 最新的 stable v2.3.2 的版本中,用户可通过应用商店(Catalog)来一键式部署 etcd-operator v0.9.0 版本,同时原生 k8s 也可下载 rancher/charts 到本地后通过 helm install 的方式进行部署。



1)(可选)部署 etcd-operator 时可选择同时创建一个 etcd 集群(此集群在 etcd-operator 被删除时会被一同移除),当然用户也可待 etcd-operator 部署完成通过 kubectl apply -f myetcd.yaml 来创建一个新的 etcd 集群。



2)部署时,如果用户选择启动 Enable Clusterwide of etcd Operator 这个选项,那么这个 etcd-operator 将作为集群层级对象来使用(否则为 namespaced 隔离),如果 enable 这个选项,那么在创建 etcd 集群时需添加以下注释才能创建创建:


kind: EtcdClustermetadata:  name: etcd-cluster  # add this annotation when the clusterWide is enabled  annotations:    etcd.database.coreos.com/scope: clusterwide
复制代码


2、创建 etcd 集群


接下来我们就可以使用上述的 CRD 自定义资源对象对来创建和管理我们的 etcd 集群了。


2.1 手动创建 etcd 集群


cat <<EOF | kubectl apply -f -apiVersion: etcd.database.coreos.com/v1beta2kind: EtcdClustermetadata:  name: "etcd-cluster"spec:  size: 3 # 默认etcd节点数  version: "3.2.25" # etcd版本号EOF
复制代码


2.2 部署后可通过 CRD 对象来查看我们创建的 etcd 集群和 pod 状态


$ kubectl get etcdclusterNAME            AGEetcd-cluster    2m
$ kubectl get podNAME READY STATUS RESTARTS AGEetcd-cluster-g28f552vvx 1/1 Running 0 2metcd-cluster-lpftgqngl8 1/1 Running 0 2metcd-cluster-sdpcfrtv99 1/1 Running 0 2m
复制代码


2.3 可以往 etcd 集群任意的写入几条数据验证 etcd 集群是正常工作的(后续也可用来验证集群的备份和恢复功能)


$ kubectl get svcNAME                  TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)             AGEetcd-cluster          ClusterIP   None           <none>        2379/TCP,2380/TCP   17hetcd-cluster-client   ClusterIP   10.43.130.71   <none>        2379/TCP            17h## write data$ kubectl exec -it any-etcd-pod -- env "ETCDCTL_API=3" etcdctl --endpoints http://etcd-cluster-client:2379 put foo "Hello World"## get data$ kubectl exec -it any-etcd-pod -- env "ETCDCTL_API=3" etcdctl --endpoints http://etcd-cluster-client:2379 get foofooHello World
复制代码


3、基于 operator 备份 etcd cluster


3.1 确认了 etcd 集群正常运行后,作为 devops 后面要考虑的就是如何创建 etcd 集群的自动化备份,下面以阿里云的 OSS 举例:


cat <<EOF | kubectl apply -f -apiVersion: etcd.database.coreos.com/v1beta2kind: EtcdBackupmetadata:  name: example-etcd-cluster-periodic-backupspec:  etcdEndpoints: [http://etcd-cluster-client:2379] #内网可使用svc地址,外网可用NodePort或LB代理地址  storageType: OSS  backupPolicy:    backupIntervalInSecond: 120 #备份时间间隔    maxBackups: 4 #最大备份数  oss:    path: my-bucket/etcd.backup    ossSecret: oss-secret #需预先创建oss secret    endpoint: oss-cn-hangzhou.aliyuncs.comEOF
复制代码


3.2 若 OSS Secret 不存在,用户可先手动创建,具体配置可参考如下:


cat << EOF | kubectl apply -f -apiVersion: v1kind: Secretmetadata:  name: oss-secrettype: OpaquestringData:  accessKeyID: myAccessKey  accessKeySecret: mySecretEOF
复制代码


3.3 待 etcdbackup 创建成功后,用户可以通过 kubectl describe etcdbackup 或查看 etcd-backup controller 日志来查看备份状态,如状态显示为 Succeeded: true,可以前往 oss 查看具体的备份内容。



4、基于 operator 恢复 etcd cluster


最后,假设我们要将 etcd 集群 A 的备份数据恢复到另一个新的 etcd 集群 B,那么我们先手动创建一个名为 etcd-cluster2 的新集群(oss 备份/恢复当前需使用 quay.io/coreos/etcd-operator:dev 镜像)。


cat <<EOF | kubectl apply -f -apiVersion: etcd.database.coreos.com/v1beta2kind: EtcdClustermetadata:  name: "etcd-cluster2"spec:  size: 3  version: "3.2.25"EOF
复制代码


然后通过创建 etcdresotre 将备份数据恢复到 etcd-cluster2 集群


cat <<EOF | kubectl apply -f -apiVersion: etcd.database.coreos.com/v1beta2kind: EtcdRestoremetadata:  # name必须与下面的spec.etcdCluster.name保持一致  name: etcd-cluster2spec:  etcdCluster:    name: etcd-cluster2  backupStorageType: OSS  oss:    path: my-bucket/etcd.backup_v1_2019-08-07-06:44:17    ossSecret: oss-secret    endpoint: oss-cn-hangzhou.aliyuncs.comEOF

复制代码


待 etcdresotre 对象创建成功后,可以查看 etcd-operator-restore 的日志,大致内容如下,


$ kubectl logs -f etcd-operator-restore...time="2019-08-07T06:50:26Z" level=info msg="listening on 0.0.0.0:19999"time="2019-08-07T06:50:26Z" level=info msg="starting restore controller" pkg=controllertime="2019-08-07T06:56:25Z" level=info msg="serving backup for restore CR etcd-cluster2"
复制代码


通过 kubectl 查看 pod 我们可以看到 etcd-cluster2 集群的 etcd 节点被删除重建:


NAME                       READY   STATUS    RESTARTS   AGEetcd-cluster2-5tq2d5bvpf    0/1     Terminating   0      93setcd-cluster2-kfgvc692pp    1/1     Terminating   0      101setcd-cluster2-xqkgz8chb8    0/1     Init:1/3      0      6setcd-cluster2-pf2qxgtg9d    1/1     Running       0      48setcd-cluster2-x92l9vpx97    1/1     Running       0      40s
复制代码


最后可通过 etcdctl 来验证之前的数据是否存在(需设置 ETCDCTL_API=3):


$ kubectl exec -it etcd-pod -- env "ETCDCTL_API=3" etcdctl --endpoints http://etcd-cluster2-client:2379 get foofooHello World
复制代码

小 结

Etcd 作为当前非常流行的 key-value 分布式文件存储,它本身的强一致性和较优的性能可以为许多分布式计算解决分布式存储的需求,如果你的微服务和应用需要用到此类的数据库,不妨来试试 Rancher Catalog 应用中的 etcd-operator 吧,Just do it!


相关资料:


https://github.com/coreos/etcd-operator


https://coreos.com/blog/introducing-the-etcd-operator.html


https://github.com/rancher/charts/tree/master/charts/etcd-operator/v0.9.0


2020-05-18 18:052464

评论 1 条评论

发布
用户头像
请教一下,我通过:https://operatorhub.io/operator/etcd 指导部署了olm和etcd-operator,然后创建etcdcluster,资源成功创建了,但etcd-operator日志只到了选主,后面没有了,etcdcluster对应的资源也没创建,看起来好像没有watch到etcdcluster的创建一样
2021-01-28 16:04
回复
没有更多了
发现更多内容

滴滴Logi-KafkaManager开源之路:一站式Kafka集群指标监控与运维管控平台

滴滴云

kafka 运维 监控 滴滴Logi

快速了解云原生架构

阿里巴巴云原生

架构 容器 微服务 云原生 k8s

姐夫深夜不睡觉就在看spring+mybatis这两份源码资料,吸引力就这么强大吗?

荒芜

Java spring 源码 mybatis spring Boot Starter

Git操作文档

Paul

28天瞎写的第二百三十二天:转角遇到蚵仔煎

树上

28天写作

《王者荣耀》背后的数据秘密

数据君

Spark底层原理详细解析(深度好文,建议收藏)

五分钟学大数据

大数据 spark

半导体芯片小白基础知识(1) (28天写作 Day22/28)

mtfelix

芯片 半导体 集成电路 28天写作

Elasticsearch Bulk API 批量增删改查

escray

elastic 七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试

交易系统架构演进之路:服务治理

比伯

Java 编程 程序员 架构 技术宅

驶向数字智能的瀚海,“懂行人”助力石油人乘风破浪

脑极体

就这?Object类一点不难理解

后台技术汇

28天写作

使用nodejs构建Docker image最佳实践

程序那些事

Docker nodejs 程序那些事 docker image nodejs和docker

开发质量提升系列:系统建起来就能解决项目的困难?

罗小龙

最佳实践 方法论 28天写作

还在为计算机网络协议烦恼?了解这一篇就够了

Java架构师迁哥

加速AI边云协同创新!KubeEdge社区建立Sedna子项目

华为云原生团队

人工智能 开源 边缘计算 边缘技术

全球首例银行“大型机”下移背后

数据君

【得物技术】无侵入式mock平台在得物的实践

得物技术

测试 数据 得物技术 Mock hulk

程序员面试时一定要注意这五个陷阱!你记住了吗?

Java架构师迁哥

管理笔记[1]:成为管理者的开端“以人文本“

L3C老司机

2021首次分享面试阿里P6心得:1000字超全面试题答案解析

比伯

Java 编程 程序员 架构 面试

我们,让9300万人办事少跑一趟

数据君

Cisco路由器调试命令大全,看完就全部学会!

JS 防抖与节流

旗袍码农

《程序员修炼之道》- 务实的方法(4)

石云升

程序员 28天写作

架构师训练营第 2 期 第 6 周 作业一:CAP原理.md

老腊肉

架构师训练营第2期

如何为多元化的产品场景选择完美的色彩组合?

百度Geek说

产品 设计

在世界球场一球成名:HMS 生态为游戏开发者送出的助攻

脑极体

CSS(八)——CSS盒模型

程序员的时光

程序员 大前端 七日更 28天写作

线程有哪些状态,彼此之间如何切换

武哥聊编程

Java 多线程 28天写作

webpack | plugin机制详解

梁龙先森

大前端 webpack 28天写作

etcd-operator快速入门完全教程_文化 & 方法_Rancher_InfoQ精选文章