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

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

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

目 标

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

  2. 部署etcd-operator

  3. 使用etcd-operator创建etcd cluster

  4. 基于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/v1beta2
kind: EtcdCluster
metadata:
name: etcd-cluster
spec:
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/v1beta2
kind: EtcdBackup
metadata:
name: etcd-backup
spec:
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/v1beta2
kind: EtcdRestore
metadata:
# name must be same to the spec.etcdCluster.name
name: example-etcd-cluster
spec:
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: EtcdCluster
metadata:
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/v1beta2
kind: EtcdCluster
metadata:
name: "etcd-cluster"
spec:
size: 3 # 默认etcd节点数
version: "3.2.25" # etcd版本号
EOF

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

$ kubectl get etcdcluster
NAME AGE
etcd-cluster 2m $ kubectl get pod
NAME READY STATUS RESTARTS AGE
etcd-cluster-g28f552vvx 1/1 Running 0 2m
etcd-cluster-lpftgqngl8 1/1 Running 0 2m
etcd-cluster-sdpcfrtv99 1/1 Running 0 2m

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

$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
etcd-cluster ClusterIP None <none> 2379/TCP,2380/TCP 17h
etcd-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 foo
foo
Hello World

3、基于operator备份etcd cluster

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

cat <<EOF | kubectl apply -f -
apiVersion: etcd.database.coreos.com/v1beta2
kind: EtcdBackup
metadata:
name: example-etcd-cluster-periodic-backup
spec:
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.com
EOF

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

cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: oss-secret
type: Opaque
stringData:
accessKeyID: myAccessKey
accessKeySecret: mySecret
EOF

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/v1beta2
kind: EtcdCluster
metadata:
name: "etcd-cluster2"
spec:
size: 3
version: "3.2.25"
EOF

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


cat <<EOF | kubectl apply -f -
apiVersion: etcd.database.coreos.com/v1beta2
kind: EtcdRestore
metadata:
# name必须与下面的spec.etcdCluster.name保持一致
name: etcd-cluster2
spec:
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.com
EOF

待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=controller
time="2019-08-07T06:56:25Z" level=info msg="serving backup for restore CR etcd-cluster2"

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

NAME                       READY   STATUS    RESTARTS   AGE
etcd-cluster2-5tq2d5bvpf 0/1 Terminating 0 93s
etcd-cluster2-kfgvc692pp 1/1 Terminating 0 101s
etcd-cluster2-xqkgz8chb8 0/1 Init:1/3 0 6s
etcd-cluster2-pf2qxgtg9d 1/1 Running 0 48s
etcd-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 foo
foo
Hello 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

etcd-operator快速入门完全教程的更多相关文章

  1. Qt快速入门系列教程目录

    Qt快速入门系列教程目录

  2. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 7. 条件循环

    条件循环能够让程序在条件成立时(即为真时)重复执行循环体中的语句.如果条件一直成立(即永远不会为假),则循环会一直进行下去,不会停止.如果初始时,条件不成立,则循环 1 次也不会执行.Python 中 ...

  3. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 6. 条件

    前面的教程中,我们已经可以让小海龟绘制出各种图形了.但是,所有绘图的代码都是预先编好的,程序一旦运行起来,运行结果(绘制的图形)就是固定不变的.这一节中,咪博士将教大家如何让海龟响应用户的输入. im ...

  4. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 5. 参数

    上一个教程中,咪博士带大家学习了函数的使用.例如,line_without_moving 函数,可以让海龟先画出一条线段,然后再回来起点. def line_without_moving(): tur ...

  5. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 4. 函数

    什么样的程序员才是优秀的程序员?咪博士认为“慵懒”的程序员才是真正优秀的程序员.听起来不合逻辑?真正优秀的程序员知道如何高效地工作,而不是用不止境的加班来完成工作任务.函数便是程序员高效工作的利器之一 ...

  6. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 3. 循环

    在前面的教程中,咪博士留了一道练习题给大家—-画正方形,相信聪明的你应该已经画出来了. 下面是咪博士实现的代码. 是不是跟你的代码很像呢? import turtle turtle.forward(2 ...

  7. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 2. 变量

    大家在中学就已经学过变量的概念了.例如:我们令 x = 100,则可以推出 x*2 = 200 试试下面这段 Python 代码 import turtle turtle.shape("tu ...

  8. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 1. 神秘朋友

    Python (Windows 下) 自带了一个非常有趣的 海龟绘图程序 (turtle),它是本系列课程的主角. 在 PyCharm 中,新建一个项目,然后在代码编辑器中输入 import turt ...

  9. Python 零基础 快速入门 趣味教程 (咪博士 海龟绘图 turtle) 0. 准备工作

    一.关于 Python Python 是全球使用人数增长最快的编程语言!它易于入门.功能强大,从 Web 后端 到 数据分析.人工智能,到处都能看到 Python 的身影. Python 有两个主要的 ...

  10. .Net5 WPF快速入门系列教程

    一.概要 在工作中大家会遇到需要学习新的技术或者临时被抽调到新的项目当中进行开发.通常这样的情况比较紧急没有那么多的时间去看书学习.所以这里向wpf技术栈的开发者分享一套wpf教程,基于.net5框架 ...

随机推荐

  1. Msfvenom命令总结大全

    1.    –p (- -payload-options) 添加载荷payload. 载荷这个东西比较多,这个软件就是根据对应的载荷payload生成对应平台下的后门,所以只有选对payload,再填 ...

  2. Redis中是如何实现分布式锁的?

    分布式锁常见的三种实现方式: 数据库乐观锁: 基于Redis的分布式锁: 基于ZooKeeper的分布式锁. 本地面试考点是,你对Redis使用熟悉吗?Redis中是如何实现分布式锁的. 要点 Red ...

  3. php有orm吗

    ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中.本质上就是将数据从一种形式转换到另外一种形式. ORM提供了所有SQL语句的生成,代码人员远离了数据库概念.从 ...

  4. shell传递参数(三)

    $n:n代表一个数字,指执行脚本的第n个参数.特别地,$0指执行的文件名 [root@ipha-dev71- exercise_shell]# cat test.sh #!/bin/bash echo ...

  5. vue系列---Mustache.js模板引擎介绍及源码解析(十)

    mustache.js(3.0.0版本) 是一个javascript前端模板引擎.官方文档(https://github.com/janl/mustache.js) 根据官方介绍:Mustache可以 ...

  6. IntelliJ IDEA 2019.2最新版本免费激活码

    IntelliJ IDEA 2019.2最新版本免费激活码 支持IDEA所有版本 正版授权激活码 今天更新了一下,支持java13等新功能.下面是激活码 812LFWMRSH-eyJsaWNlbnNl ...

  7. GO基础之闭包

    一.闭包的理解 闭包是匿名函数与匿名函数所引用环境的组合.匿名函数有动态创建的特性,该特性使得匿名函数不用通过参数传递的方式,就可以直接引用外部的变量. 这就类似于常规函数直接使用全局变量一样,个人理 ...

  8. Robot Framework——对时间操作的datetime库常用关键字

    1.对固定日期进行操作,增加或减去单位时间或者时间段 2.对两个时间段进行操作 3.对时间格式转化,获取时间戳 4.从完整时间中取指定年月日等 5.对时间类型进行格式化 6.获取当前时间或者指定时区时 ...

  9. JVM(7) Java内存模型与线程

    衡量一个服务性能的高低好坏,每秒事务处理数(Transactions Per Second,TPS)是最重要的指标之一,它代表着一秒内服务端平均能响应的请求总数,而 TPS 值与程序的并发能力又有非常 ...

  10. Redis(三)Redis附加功能

    一.慢查询分析 许多存储系统(例如MySql)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作. 所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阈值,就将这条命令的相关信息 ...