写点什么

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:052833

评论 1 条评论

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

"不敢去怀疑代码,又不得不怀疑代码"记一次网络请求超时分析

华为云开发者联盟

前端 开发 HTTP 华为云

万字攻略,详解腾讯面试(T1-T9)核心技术点,面试题整理

C++后台开发

后台开发 面试题 Linux服务器开发 C++后台开发 腾讯面试

关河因果将机器学习融合逻辑规则,突破黑盒壁垒

6979阿强

数据分析 大数据分析 关河因果 关河智图 因果分析

2022年中国重卡智能化升级专题研究

易观分析

智能汽车

web技术分享| 【高德地图】实现自定义的轨迹回放

anyRTC开发者

前端 Web 音视频 地图 轨迹回放

Vue-17-组件

Python研究所

6月月更

VHEDT业务发展框架

凌晞

框架 构架

短视频源码开发,优质的短视频源码需要做好哪几点?

开源直播系统源码

软件开发 短视频源码

企业级软件开发新模式:低代码

力软低代码开发平台

活动预约|阿里云如何搭建云服务 SRE 与可观测体系

阿里巴巴云原生

阿里云 云原生 可观测 峰会

博睿数据出席阿里云可观测技术峰会,数字体验管理驱动可持续发展

博睿数据

可观测性 智能运维 博睿数据 数字体验管理

5分钟快速上线Web应用和API(Vercel)

Liam

前端 前端开发 开发 Postman API

洞见科技牵头的全球「首个」IEEE隐私计算「互联互通」国际标准正式启动

洞见科技

隐私计算 IEEE 互联互通

视频爆炸时代,谁在支撑视频生态网高速运行?

郑州埃文科技

flow IP地址 NetFlow

DAP事实表加工汇总功能应用说明

agileai

数据分析 数据集成 数仓建设 基础事实表 汇总事实表

网页制作存在的一些难点

源字节1号

如何给研发团队分钱?

菜根老谭

研发体系 绩效管理 激励体系

物联网开源开发平台 Shifu 开放内测!第一版技术文档发布

亚马逊云科技 (Amazon Web Services)

物联网 Tech 专栏

IntelliJ IDEA中有什么让你相见恨晚的好用插件?

Jackpop

如何做好研发效能度量及指标选取

思码逸研发效能

研发效能

如何为政企移动办公加上一道“安全锁”?

BeeWorks

什么是RESTful,REST api设计时应该遵守什么样的规则?

wljslmz

RESTful 6月月更

机器学习实践:基于支持向量机算法对鸢尾花进行分类

华为云开发者联盟

人工智能 模型 华为云

[译]关于 Python 中的数字你可能不知道的 3 件事

宇宙之一粟

Python 6月月更

学习 | 写论文看这一篇就够了~

写程序的小王叔叔

学习笔记 论文阅读 论文写作 6月月更

Java不支持协程?那是你不知道Quasar!

码农参上

协程 Java后端

华为云招募工业智能领域合作伙伴,强力扶持+商业变现

华为云开发者联盟

云计算 华为云 工业数据智能

再读凤凰架构-分布式架构更清晰

AiDaddy

分布式 凤凰架构

详解openGauss多线程架构启动过程

华为云开发者联盟

数据库 后端

预约直播|机器学习PAI:AI加速计划

阿里云大数据AI技术

AI 模型开发训练

年中大促 | 集成无忧,超值套餐 6 折起

融云 RongCloud

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