Kubernetes控制平面组件:etcd高可用解决方案

发布于:2025-02-17 ⋅ 阅读:(222) ⋅ 点赞:(0)

云原生学习路线导航页(持续更新中)

Kubernetes控制平面组件:etcd高可用集群搭建 中,我们学习了如何搭建一个高可用的etcd集群,但需要大量的手工操作,生产上是有一些解决方案可以做到 自动化的高可用。本节就来学习一些etcd高可用解决方案

1.etcd主要的2种高可用解决方案

在这里插入图片描述

2.etcd-operator

2.1.工作原理

在这里插入图片描述

  • operator 是 Kubernetes 的扩展机制(CRD + Controller)
  • etcd-operator 自定义了2个资源类型:EtcdClusterEtcdRestore,并为之开发了Controller
  • 核心功能:
    • Controller 根据 EtcdCluster 定义,自动创建etcd pod构建高可用集群,可以指定版本和副本数量,也可以动态调整集群规模‘
    • Controller 根据 EtcdRestore 定义,进行数据的恢复

2.2.架构特点

  • Operator 创建出的Pod会有两个Container:
    1. ETCD Server(主容器)
    2. 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
      • 支持离线安装

3.2.使用演示:使用helm chart部署etcd高可用集群

参考:https://github.com/cncamp/101/blob/master/module5/6.statefulset-etcd.MD

3.2.1.Install 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.yamlpersistence.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