Operator是指一类基于Kubernetes自定义资源对象(CRD)和控制器(Controller)的云原生拓展服务,其中CRD定义了每一个operator所建立和管理的自定义资源对象,Controller则包含了管理这些对象所相关的运维逻辑代码。html
对于普通用户来讲,若是要在k8s集群中部署一个高可用的etcd集群,那么不只要了解其相关的配置,同时又须要特定的etcd专业知识才能完成维护仲裁,从新配置集群成员,建立备份,处理灾难恢复等等繁琐的事件。
git
而在operator这一类拓展服务的协助下,咱们就可使用简单易懂的YAML文件(同理参考Deployment)来声明式的配置,建立和管理咱们的etcd集群,下面咱们就来一同了解下etcd-operator这个服务的架构以及它所包含的一些功能。
github
了解etcd-operator的架构与CRD资源对象数据库
部署etcd-operatorapi
使用etcd-operator建立etcd cluster架构
etcd-operator的设计是基于k8s的API Extension机制来进行拓展的,它为用户设计了一个相似于Deployment的Controller,只不过这个Controller是用来专门管理etcd这一服务的。app
用户默认仍是经过kubectl或UI来与k8s的API进行交互,只不过在这个k8s集群中多了一个用户自定义的控制器(custom controller),operator controller的服务是以Pod的方式运行在k8s集群中的,同时这个服务也须要配置所需的RBAC权限(好比对Pod,Deployment,Volume等使用到的资源进行增删改查的操做),下面咱们用一个简单的架构图来进行阐述:
运维
在k8s中,全部自定义的Controller和其自定义的资源对象(CRD)都必须知足k8s API的规范(参考下图):分布式
apiVersion
描述了当前自定义资源对象的版本号ide
Kind
表示自定义资源对象的名称,用户可经过执行kubectl get $KIND_NAME
来获取所建立的CRD对象
Metadata
继承了原生k8s的metadata,用于添加标签,Annotations等元数据
Spec
是用户可自定义设计的服务配置参数,如镜像版本号,节点数量,资源配置等等..
Status
包含了当前资源的的相关状态,每一个operator controller可自定义status所包含的信息,通常会选择添加如conditions,updateTime和message等一类的信息。
一、EtcdCluster: etcdcluster用来描述用户自定义的etcd集群,可一键式部署和配置一个相关的etcd集群。
apiVersion: etcd.database.coreos.com/v1beta2 kind: EtcdCluster metadata: name: etcd-cluster spec: size: 3 version: 3.2.25
二、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>
三、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
在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
二、建立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
三、基于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查看具体的备分内容。
四、基于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