一、etcd集群部署哪个最稳定
对于etcd的部署方式,我们可以选择Standalone,Cluster和HA模式。
其中Standalone模式适用于开发、测试环境,Cluster适用于小型生产环境,HA适用于中大型的生产环境。因此,如果在生产环境中使用etcd集群,建议选择HA模式,以确保稳定和可靠性。
二、etcd集群恢复
在etcd集群中,可能会发生一些异常情况,需要对etcd集群进行恢复。如果发生类似节点宕机的情况,我们需要进行集群节点的重新加入。
具体步骤如下:
1. 确定宕机节点的状态
etcdctl endpoint status -w table | grep 'unreachable'
以上命令行显示的为unreachable或者down,那么就表示该节点宕机了。
2. 去掉宕机节点
如果打算重新加入一个节点,要先去掉之前失联的节点。
etcdctl member remove [memberid]
也可以直接在其他节点上执行。
etcdctl --endpoints=http://[otherIP]:2379 member remove [memberid]
3. 重新加入节点
etcdctl member add [member.node.name] --peer-urls=http://[memberIP]:2380
4. 上报节点信息给所有节点
etcdctl member list //需要获取到 memberID,peer-urls,name
这里的memberID 是etcd集群认证的节点凭证之一,可以通过member list拿到,也可以看etcd.log
etcdctl member update [memberid] [flags]
如果宕机节点不支持恢复,那么建议重新创建一个新的etcd节点,然后将数据迁移到新的节点上。
三、etcd集群原理
etcd是一种高可用性的分布式键值存储系统,能够保证分布式应用程序的一致性。
etcd集群的核心机制是Raft协议,利用Raft协议实现节点之间的一致性和数据的同步。
集群中的每个节点都有自己的ID(节点编号)、地址、磁盘存储等信息。在etcd集群中,数据是以key-value的形式存储的。当一个节点收到一个写请求时,它会将请求广播给其集群中的其他节点,并等待各节点的反馈。如果反馈成功,则将写请求处理完成并返回给客户端,否则重新发起广播。当集群中有节点宕机时,etcd能够自动进行故障转移,确保数据的一致性和可靠性。
四、etcd集群数据同步
etcd的数据同步采用Raft协议,Raft协议是一种分布式一致性算法。它将整个集群分为Leader、Follower和Candidate三种角色,通过选举Leader的过程来实现数据复制和同步。
当Follower节点有更新时,会通知Leader,随后Leader根据Raft协议将变更复制给其他Follower节点。当节点失效或者新节点加入集群时,etcd能够通过Raft协议自动进行数据迁移和重新分配。
五、etcd集群搭建
etcd集群的搭建,主要分为如下几个步骤:
1. 下载etcd二进制文件
wget https://github.com/coreos/etcd/releases/download/v3.5.0/etcd-v3.5.0-linux-amd64.tar.gz
tar -zxvf etcd-v3.5.0-linux-amd64.tar.gz
cd etcd-v3.5.0-linux-amd64
2. 创建etcd集群配置文件
cp etcd.conf.sample etcd.conf
vi etcd.conf
3. 配置etcd集群
name:当前节点名称
data-dir:数据目录
initial-cluster-state:新建集群时设为new
initial-cluster-token:集群身份标识符,任选一取
initial-cluster:集群中所有机器的地址
listen-peer-urls:集群内所有节点的监听地址
listen-client-urls:服务的请求地址
4. 启动etcd集群
./etcd -conf-file=etcd.conf
六、k8s etcd集群
k8s官方文档建议将etcd集群部署在k8s集群外部,以确保etcd的高可用性。
kops是一种常用的k8s集群部署工具,我们可以使用kops来部署etcd集群。具体步骤如下:
1. 安装kops和kubectl
# Mac
brew update && brew install kops kubectl
# Ubuntu
sudo apt-get update && sudo apt-get install -y kops kubectl
2. 创建kops集群
kops create cluster --name=mycluster.example.com --state=s3://mybucket --node-count=2 --zones=us-east-1a --node-size=t2.micro --master-size=t2.micro
3. 配置etcd集群
可以按照上面的方法在较为简单的环境下,单独对etcd集群进行配置。使用kops在AWS上部署集群并不少见,如果使用AWS,还需要开放相关端口,确保集群正常运转。
4. 删除集群
kops delete cluster --name=mycluster.example.com --state=s3://mybucket --yes
七、k8s部署etcd集群
kubernetes的control plane中使用了etcd来存储所有的集群状态信息。etcd状态集群的容量应该与kubernetes集群大小成比例,而且它们必须同时运行才能达到预期的高可用性。
默认情况下,kubernetes会在所有master节点中部署一个etcd实例副本。但是,也可以将etcd集群独立部署在外部,这需要修改kubernetes的etcd集群地址或证书配置。
具体步骤如下:
1. 进入Kubernetes的github项目目录
cd kubernetes
2. 编译etcd镜像
在需要编译 etcd 的版本时,执行如下操作.
cd ./build/
make WHAT=cmd/etcd
make WHAT=cmd/etcdctl
make WHAT=cmd/etcd-migrate
3. 部署etcd集群
运行部署etcd集群的脚本
./hack/local-up-etcd.sh
注: 使用二进制方式部署应该详细的阅读文档。
4. 现在kubernetes etcd配置项就变成了:
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"\
设置env变量KUBE_ETCD_SERVERS 连接新etcd集群
八、查看etcd集群状态
我们可以使用以下命令来查看etcd集群状态:
etcdctl member list
其中,member list命令可以用于查看当前etcd集群中的所有成员,包括其ID、名称、状态和地址信息。