路漫漫其修远兮
吾将上下而求索

operator:还原 etcd operator 开发

本章我们来实现编写一个用于 etcd 还原的 operator。

介绍

前面我们已经实现了 etcd 备份的 Operator 开发,有了备份必然还需要还原,要实现还原的功能也很简单,直接指定备份好的元数据,然后使用snapshot restore 命令即可还原了。

根据前面我们设计的 EtcdBackup 这个 CRD 资源,我们可以设计一个用于还原的 EtcdRestore 资源对象:

apiVersion: etcd.ydzs.io/v1alpha1
kind: EtcdRestore
metadata:
  name: etcdrestore-sample
spec:
	etcdCluster:  # EtcdCluster 资源对象引用
		name: etcd-demo
  backupStorageType: s3  # 指定备份类型
  s3:
    path: "foo-bucket/snapshot.db"  # 数据备份的目录
    secret: "secret"   # 包含 accessKeyID 与 secretAccessKey

设计好了 CR 资源过后,接下来我们只需要去创建这个 API 资源,然后实现对应的控制器就可以了。

添加接口

同样直接在项目目录下面执行创建 API 的命令:

$ kubebuilder create api --group etcd --version v1alpha1 --kind EtcdRestore
Create Resource [y/n]
y
Create Controller [y/n]
y
Writing scaffold for you to edit...
api/v1alpha1/etcdrestore_types.go
controllers/etcdrestore_controller.go
Running make:
$ make
/Users/ych/devs/projects/go/bin/controller-gen object:headerFile="hack/boilerplate.go.txt" paths="./..."
go fmt ./...
go vet ./...
go build -o bin/manager main.go

创建完成后,在项目中会新增 EtcdBackup 相关的 API 和对应的控制器,我们可以用上面设计的 CR 资源覆盖 samples 目录中的 EtcdBackup 对象。

然后可以根据上面的设计重新修改 etcdrestore_types.go 文件中的资源结构体:

// api/v1alpha1/etcdrestore_types.go

package v1alpha1

import (
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)

type EtcdRestorePhase string

var (
	EtcdRestorePhasePending   EtcdRestorePhase = "Pending"
	EtcdRestorePhaseFailed    EtcdRestorePhase = "Failed"
	EtcdRestorePhaseCompleted EtcdRestorePhase = "Completed"
)

// EtcdRestoreSpec defines the desired state of EtcdRestore
type EtcdRestoreSpec struct {
	// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
	// Important: Run "make" to regenerate code after modifying this file

	EtcdCluster EtcdClusterRef `json:"etcdCluster"`

	BackupStorageType BackupStorageType `json:"backupStorageType"`

	// restore data source
	RestoreSource `json:",inline"`
}

type EtcdClusterRef struct {
	// Name is the EtcdCluster resource name.
	Name string `json:"name"`
}

type RestoreSource struct {
	S3  *S3BackupSource  `json:"s3,omitempty"`
	OSS *OSSBackupSource `json:"oss,omitempty"`
}

// EtcdRestoreStatus defines the observed state of EtcdRestore
type EtcdRestoreStatus struct {
	Phase EtcdRestorePhase `json:"phase,omitempty"`
	// Reason indicates the reason for any restore related failures.
	Reason string `json:"reason,omitempty"`
}

// +kubebuilder:object:root=true
// +kubebuilder:subresource:status

// EtcdRestore is the Schema for the etcdrestores API
type EtcdRestore struct {
	metav1.TypeMeta   `json:",inline"`
	metav1.ObjectMeta `json:"metadata,omitempty"`

	Spec   EtcdRestoreSpec   `json:"spec,omitempty"`
	Status EtcdRestoreStatus `json:"status,omitempty"`
}

// +kubebuilder:object:root=true

// EtcdRestoreList contains a list of EtcdRestore
type EtcdRestoreList struct {
	metav1.TypeMeta `json:",inline"`
	metav1.ListMeta `json:"metadata,omitempty"`
	Items           []EtcdRestore `json:"items"`
}

func init() {
	SchemeBuilder.Register(&EtcdRestore{}, &EtcdRestoreList{})
}

修改完成后需要执行 make 命令,

未经允许不得转载:江哥架构师笔记 » operator:还原 etcd operator 开发

分享到:更多 ()