Kubernetes之etcd数据库

etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。

etcd作为服务发现系统,有以下的特点:

  • 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单

  • 安全:支持SSL证书验证

  • 快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作

  • 可靠:采用raft算法,实现分布式系统数据的可用性和一致性

由于上面的特点和优势,etcd也被作为k8s默认的存储数据库,今天我们来讲一讲如何部署etcd数据库集群以及etcd的一些常见使用方法。

Docker-compose搭建etcd集群

编写docker-compose.yml文件,具体内容如下

version: '2'
networks:
  byfn:

services:
  etcd1:
    image: quay.io/coreos/etcd
    container_name: etcd1
    command: etcd -name etcd1 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
    ports:
      - 2379
      - 2380
    networks:
      - byfn

  etcd2:
    image: quay.io/coreos/etcd
    container_name: etcd2
    command: etcd -name etcd2 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
    ports:
      - 2379
      - 2380
    networks:
      - byfn

  etcd3:
    image: quay.io/coreos/etcd
    container_name: etcd3
    command: etcd -name etcd3 -advertise-client-urls http://0.0.0.0:2379 -listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380" -initial-cluster-state new
    ports:
      - 2379
      - 2380
    networks:
      - byfn

参数介绍:

  • data-dir 指定节点的数据存储目录,这些数据包括节点ID,集群ID,集群初始化配置,

  • Snapshot文件,若未指定—wal-dir,还会存储WAL文件;

  • wal-dir 指定节点的was文件的存储目录,若指定了该参数,wal文件会和其他数据文件分开存储。

  • name 节点名称

  • initial-advertise-peer-urls 告知集群其他节点url.

  • listen-peer-urls 监听URL,用于与其他节点通讯

  • advertise-client-urls 告知客户端url, 也就是服务的url

  • initial-cluster-token 集群的ID

  • initial-cluster 集群中所有节点

  • initial-cluster-state 监听客户端状态

  • listen-client-urls 监听客户端地址

  • initial-cluster-state new 初始化集群 为新节点

然后docker-compose运行etcd的yaml文件,并且插入数据进行检查验证

二进制部署etcd集群

这个可以参考之前的文章 二进制搭建k8s集群 https://www.niewx.cn/kubernetes/docker/2020/09/20/%E4%BA%8C%E8%BF%9B%E5%88%B6%E9%83%A8%E7%BD%B2k8s/

其中部署etcd集群章节有说明如何搭建

kubeadm集群如何使用etcd集群

一般我们如果通过kubeadm创建的集群都是单节点的etcd,那么如何配置一个高可用的etcd集群给kubeadm的集群。首先你需要通过kubeadm搭建一个集群,你可以参考文章进行部署https://www.niewx.cn/kubernetes/docker/2020/09/15/kubeadm%E9%83%A8%E7%BD%B2k8s/

也可以通过https://www.niewx.cn/kubernetes/docker/2020/05/10/k8s%E4%B8%80%E9%94%AE%E9%83%A8%E7%BD%B2%E8%84%9A%E6%9C%AC/ 一键部署包进行安装,这里就不细说了

集群部署好之后,我们下面来部署etcd集群,并接入对应的集群中,大致步骤如下

  • 新建一个 2 节点的 etcd cluster

  • 查看 etcd 的状态

  • 迁移原来 master 节点上的 etcd 数据到上面新建的 etcd cluster 中

  • 切换 kube-apiserver 使用新的 etcd endpoint 地址

  • 清理掉原来的单节点 etcd 服务

  • 重建一个 etcd 服务,加入新集群

  • 部署新的 etcd 节点

  • 更新另外2个节点的 etcd.yaml 配置

新建一个2节点的 etcd cluster

查看 etcd 的状态

迁移原来 master 节点上的 etcd 数据到上面新建的 etcd cluster 中

切换 kube-apiserver 使用新的 etcd endpoint 地址

清理掉原来的单节点 etcd 服务

重建一个 etcd 服务,加入新集群

先配置 etcd cluster 增加一个 member 用于后续操作

更新另外2个节点的 etcd.yaml 配置

kubeadm使用已有etcd集群

假如我们已经提前搭建好了一个etcd集群,那么在kubeadm进行部署的时候如何去使用这个集群,其实只需要在kubeadm中进行配置即可

如何在k8s中搭建etcd集群

这里我们可以使用 StatefulSet 这个控制器来运行 etcd 集群,etcd 集群的编排的资源清单文件我们可以使用 Kubernetes 源码中提供的,位于目录:test/e2e/testing-manifests/statefulset/etcd下面。

service.yaml文件中就是一个用户 StatefulSet 使用的 headless service:

pdb.yaml文件是用来保证 etcd 的高可用的一个 PodDisruptionBudget 资源对象,PodDisruptionBudget 说明详情可以参考文档https://kubernetes.io/zh/docs/tasks/run-application/configure-pdb/

statefulset.yaml,这里修改下http://${HOSTNAME}.${SET_NAME}成http://${POD_IP}:PORT这样

执行命令进行部署

等pod运行成功后,我们该如何访问呢,这我们给service改成对应的lb类型,这样可以直接通过公网ip个接口就可以访问了

这里我们将2379端口通过LoadBalancer 类型的service映射成公网访问了,下面我们来用命令检查下集群。 首先下载etcdctl工具,我们登录客户端机器执行下面命令安装etcdctl工具

然后执行命令检查集群,这边查看集群都是正常,说明这边集群部署成功

下面我们对etcd的pod进行扩缩容看看是否会有影响

这边扩缩容都是正常,这边可以给etcd配置hpa来实现整真正的高可用。

etcdctl常用的命令

为了执行命名方便,我们在客户端机器直接写这个alias,将下面命令写到root目录下的.bashrc文件然后bash一下这个文件,新开一个session窗口,后续直接执行etcdcluster这个命令加参数即可。

PUT [options]

GET [options] [range_end]

DEL [options] [range_end]

数据备份

数据恢复

这里只做一些常用简单的命令进行操作,更多的命令使用可以参考https://github.com/etcd-io/etcd/tree/master/etcdctl进行操作使用。

最后更新于

这有帮助吗?