- kubernetes学习系列快捷链接
在 Kubernetes控制平面组件:etcd高可用集群搭建 中,我们学习了如何搭建一个高可用的etcd集群,但需要大量的手工操作,生产上是有一些解决方案可以做到 自动化的高可用。本节就来学习一些etcd高可用解决方案
1.etcd主要的2种高可用解决方案
2.etcd-operator
2.1.工作原理
- operator 是 Kubernetes 的扩展机制(CRD + Controller)
- etcd-operator 自定义了2个资源类型:
EtcdCluster
、EtcdRestore
,并为之开发了Controller - 核心功能:
- Controller 根据
EtcdCluster
定义,自动创建etcd pod构建高可用集群,可以指定版本和副本数量,也可以动态调整集群规模‘ - Controller 根据
EtcdRestore
定义,进行数据的恢复
- Controller 根据
2.2.架构特点
- Operator 创建出的Pod会有两个Container:
- ETCD Server(主容器)
- Backup 容器(定期进行数据备份)
- 备份恢复机制:
- ETCD Server 的存储一般推荐使用本地SSD,提高数据的访问速度
- Backup 容器 一般推荐远程存储,进行数据的定期备份
- 周期性的snapshot快照备份
- 支持远程存储
- 通过
EtcdRestore
CRD 进行数据恢复
- 另外,不只是etcd,像中间件这种有状态的服务,都推荐使用外挂存储,数据不要直接存储在pod本身,保证pod重建后不会丢失数据
2.3.适用场景
- 已有 Kubernetes 集群
- 需要在该集群上部署新的 ETCD 集群
- 典型用例:
- 多集群管理
- 创建新的控制平面集群
- 种子集群部署模式
2.4.现状
- 项目已经归档,不再维护
- etcd-operator 的版本比较老了,我们现在的k8s版本都比较新,不兼容,就不做演示了
3.etcd statefulset helm chart: bitnami
3.1.实现方式
- github:
- 基于 StatefulSet 的部署
- 使用 Helm 进行模板化管理
- Helm 工作机制:
- 模板 + 自定义值 → 生成最终 Spec
- 支持离线安装
- Helm 工作机制:
3.2.使用演示:使用helm chart部署etcd高可用集群
参考:https://github.com/cncamp/101/blob/master/module5/6.statefulset-etcd.MD
3.2.1.Install helm
- 请参考:环境安装篇 之 安装Helm
3.2.2.Download bitnami etcd
- 安装具体命令
helm repo add bitnami https://charts.bitnami.com/bitnami helm pull bitnami/etcd tar -xvf etcd-6.8.4.tgz vi etcd/values.yaml
- 下载etcd helm chart包,解压后可以看到 chart包中的内容
- Chart.yaml:当前chart包的一些信息
- template:安装时会创建的k8s资源
- values.yaml:供用户动态配置的参数值,部署时helm会把values.yaml文件中的配置渲染到 templates 中具体的资源中,作为更高优先级配置
[root@VM-226-235-tencentos ~/go/src/github.com/etcd-io/etcd/hack/tls-setup/etcd]# tree . ├── Chart.lock ├── charts │ └── common │ ├── Chart.yaml │ ├── README.md │ ├── templates │ │ ├── _affinities.tpl │ │ ├── _capabilities.tpl │ │ ├── _compatibility.tpl │ │ ├── _errors.tpl │ │ ├── _images.tpl │ │ ├── _ingress.tpl │ │ ├── _labels.tpl │ │ ├── _names.tpl │ │ ├── _resources.tpl │ │ ├── _secrets.tpl │ │ ├── _storage.tpl │ │ ├── _tplvalues.tpl │ │ ├── _utils.tpl │ │ ├── validations │ │ │ ├── _cassandra.tpl │ │ │ ├── _mariadb.tpl │ │ │ ├── _mongodb.tpl │ │ │ ├── _mysql.tpl │ │ │ ├── _postgresql.tpl │ │ │ ├── _redis.tpl │ │ │ └── _validations.tpl │ │ └── _warnings.tpl │ └── values.yaml ├── Chart.yaml ├── README.md ├── templates │ ├── configmap.yaml │ ├── cronjob-defrag.yaml │ ├── cronjob-snapshotter.yaml │ ├── extra-list.yaml │ ├── _helpers.tpl │ ├── networkpolicy.yaml │ ├── NOTES.txt │ ├── pdb.yaml │ ├── podmonitor.yaml │ ├── preupgrade-hook-job.yaml │ ├── prometheusrule.yaml │ ├── secrets.yaml │ ├── serviceaccount.yaml │ ├── snapshot-pvc.yaml │ ├── statefulset.yaml │ ├── svc-headless.yaml │ ├── svc.yaml │ └── token-secrets.yaml └── values.yaml 5 directories, 46 files
- 在本地做实验的话,需要把
values.yaml
中persistence.enabled
改为false。这样就不会使用pvc,而是使用emptyDir了
persistence:
## @param persistence.enabled If true, use a Persistent Volume Claim. If false, use emptyDir.
##
enabled: false
3.2.3.Install etcd by helm chart
- 执行安装命令,my-release 为应用名称,可以任意起
helm install my-release ./etcd
- 默认会在default命名空间下,为我们创建一个statefulset,由sts负责启动etcd集群
- 除此之外,还会创建secret、service等一系列资源
3.2.4.Start etcd client
- etcd集群有了,我们创建一个etcd的客户端,用于测试
- 下面的命令会创建一个 etcd-client 的 pod
kubectl run my-release-etcd-client --restart='Never' --image docker.io/bitnami/etcd:3.5.0-debian-10-r94 --env ROOT_PASSWORD=$(kubectl get secret --namespace default my-release-etcd -o jsonpath="{.data.etcd-root-password}" | base64 --decode) --env ETCDCTL_ENDPOINTS="my-release-etcd.default.svc.cluster.local:2379" --namespace default --command -- sleep infinity
3.2.5.Test Etcd Server
kubectl exec --namespace default -it my-release-etcd-client -- bash
etcdctl --user root:$ROOT_PASSWORD put /message Hello
etcdctl --user root:$ROOT_PASSWORD get /message