• etcd集群部署


    概述

    节点

    etcd有两种节点,分别为集群节点和代理节点。两种节点在使用上几乎没有区别,这使我们可以在每台机器上都安装etcd,进而把etcd当作本地服务使用。它们的区别在于内部原理不同:

    • 集群节点是真正的etcd集群的构成者,这些节点负责数据存取,集群管理等
    • 代理节点可以理解为一个反向代理,它只简单的接受请求,转发请求给etcd集群

    集群大小与容错

    集群的大小指集群节点的个数。根据 etcd 的分布式数据冗余策略,集群节点越多,容错能力(Failure Tolerance)越强,同时写性能也会越差。 所以关于集群大小的优化,其实就是容错和写性能的一个平衡。 另外,etcd推荐使用奇数作为集群节点个数。因为奇数个节点与和其配对的偶数个节点相比(比如 3节点和4节点对比),容错能力相同,却可以少一个节点。所以综合考虑性能和容错能力,etcd 官方文档推荐的 etcd 集群大小是 3, 5, 7。

    部署etcd集群

    etcd 集群的搭建有三种方式,包括:static方式,etcd discovery方式和DNS discovery。DNS discovery方式在实际生产中很少使用,在这里不作说明。

    我这里的部署以etcd v3.3.1为例,etcd的安装可以直接使用二进制文件,也可以使用yum或apt的方式安装,我这里默认使用二进制的方式安装,且二进制文件存放在/opt/kubernetes/bin目录下。配置文件存放在/opt/kubernetes/cfg目录下。

    static方式

    static方式是最简单的一种搭建etcd的方式。它不需要任何额外的服务,只需要知道准备用来运行etcd的所有节点的hostname或者IP即可。

    测试的三台机器如下:

    HostName Address EtcdName
    etcd1 10.5.12.16 etcd1
    etcd2 10.5.12.17 etcd2
    etcd3 10.5.12.18 etcd3

    etcd1上的/opt/kubernetes/cfg/etcd.conf配置文件如下:

    ETCD_NAME=etcd1
    ETCD_DATA_DIR="/data/etcd"
    ETCD_LISTEN_CLIENT_URLS="http://10.5.12.16:2379,http://127.0.0.1:2379"
    ETCD_LISTEN_PEER_URLS="http://10.5.12.16:2380"
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.5.12.16:2380"
    ETCD_INITIAL_CLUSTER="etcd1=http://10.5.12.16:2380,etcd2=http://10.5.12.17:2380,etcd3=http://10.5.12.18:2380"
    ETCD_INITIAL_CLUSTER_STATE="new"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
    ETCD_ADVERTISE_CLIENT_URLS="http://10.5.12.16:2379"
    

    其他节点配置基本相同,这里就不再作详细说明。

    所有节点上服务启动文件/usr/lib/systemd/system/etcd.service如下:

    [Unit]
    Description=Etcd Server
    After=network.target
    
    [Service]
    Type=simple
    WorkingDirectory=/var/lib/etcd
    EnvironmentFile=-/opt/kubernetes/cfg/etcd.conf
    # set GOMAXPROCS to number of processors
    ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /opt/kubernetes/bin/etcd"
    Type=notify
    
    [Install]
    WantedBy=multi-user.target
    

    还需要说明的是,默认etcd采用的是v2接口,在一些特定场景中,需要使用etcd的v3接口。则需要配置如下环境变量:

    export ETCDETC_API=3
    

    通过如下方式启动:

    systemctl daemon-reload
    systemctl start etcd
    systemctl enable etcd
    

    启动后,我们查看etcd进程,如下:

    
    /opt/kubernetes/bin/etcd --name etcd1 --data-dir /data/etcd --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 --listen-peer-urls http://10.5.12.16:2380 --initial-advertise-peer-urls http://10.5.12.16:2380 --initial-cluster etcd1=http://10.5.12.16:2380,etcd2=http://10.5.12.17:2380,etcd3=http://10.5.12.18:2380 --advertise-client-urls http://10.5.12.16:2379 --initial-cluster-token etcd-cluster --initial-cluster-state new
    

    下面是一些常用配置选项的说明:

    • --name:方便理解的节点名称,默认为 default,在集群中应该保持唯一,可以使用 hostname
    • --data-dir:服务运行数据保存的路径,默认为 ${name}.etcd
    • --snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
    • --heartbeat-interval:leader 多久发送一次心跳到 followers。默认值是 100ms
    • --eletion-timeout:重新投票的超时时间,如果follower在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
    • --listen-peer-urls:和同伴通信的地址,比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost
    • --listen-client-urls:对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和etcd交互
    • --advertise-client-urls:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
    • --initial-advertise-peer-urls:该节点同伴监听地址,这个值会告诉集群中其他节点
    • --initial-cluster:集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。需要注意的是,这里的 node1 是节点的--name指定的名字;后面的ip1:2380 是--initial-advertise-peer-urls 指定的值
    • --initial-cluster-state:新建集群的时候,这个值为 new;假如已经存在的集群,这个值为existing
    • --initial-cluster-token:创建集群的token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误

    这些选项,与上面我们配置文件里的配置一一对应,如ETCD_INITIAL_CLUSTER等同于--inital-cluster, ETCD_INITIAL_CLUSTER_STATE等同于--initial-cluster-state

    所有以--init开头的配置都是在第一次启动etcd集群的时候才会用到,后续节点的重启会被忽略,如--initial-cluseter参数。所以当成功初始化了一个etcd集群以后,就不再需要这个参数或环境变量了。

    可以在三个节点的前端使用haproxy做反向代理(事实上,这并不是必须的,在实际生产中,很少这么做。),haproxy.cfg配置如下:

    frontend etcd
        bind 10.5.12.19:4001
        mode tcp
        option tcplog
        default_backend etcd
        log 127.0.0.1 local3
    backend etcd
        balance roundrobin
        fullconn 1024
        server etcd1 10.5.12.16:2379 check port 4001 inter 300 fall 3
        server etcd2 10.5.12.17:2379 check port 4001 inter 300 fall 3
        server etcd3 10.5.12.18:2379 check port 4001 inter 300 fall 3
    

    etcd discovery方式

    很多时候,你只知道需要要搭建一个多大(包含多少节点)的集群,但是并不能事先知道这几个节点的ip,从而无法使用 -initial-cluster 参数。 这个时候,就需要使用discovery的方式来搭建etcd集群。事实上,这种方式在实际生产环境中,使用的也并不多。

    etcd discovery 有两种:

    • 自定义的etcd discovery
    • 公共etcd discovery。

    以下的两种配置方式因为很少用于生产,所以我只是验证了第一种方式,第二种方式完全摘抄于网上其他文档,并未作具体验证,仅供参考。

    公共的etcd discover服务

    1. 创建一个用于discovery的token:
    curl https://discovery.etcd.io/new?size=3     #size=3表示创建一个3节点的集群
    
    # 返回如下结果:
    https://discovery.etcd.io/96ca21e0510d96442a3689751cb6fdc0
    
    1. 在三台节点上分别启动etcd,方式如下:
    etcd --name etcd1 --data-dir /data/etcd 
    --initial-advertise-peer-urls http://10.5.12.16:2380 
    --listen-peer-urls http://10.5.12.16:2380 
    --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://10.5.12.16:2379 
    --discovery https://discovery.etcd.io/96ca21e0510d96442a3689751cb6fdc0
    

    如果使用变量的方式,则ETCD_DISCOVERY等于--discovery,另外,如果实际启动的etcd节点数大于discovery token创建时指定的size,多余的节点会自动变为proxy节点。

    自定义的etc discovery服务

    这种方式就是利用一个已有的etcd集群来提供discovery服务,从而创建一个新的etcd集群,假设已有的etcd集群的一个访问地址为myetcd.local,那么首先要在已有的etcd上创建一个特殊的key,如下:

    # 其中value=3表示集群的大小,5c007a14875d53d9bf0ef5a6fc0257c817f0fb83则用来做discovery的token
    curl -X PUT https://myetcd.local/v2/keys/discovery/5c007a14875d53d9bf0ef5a6fc0257c817f0fb83/_config/size -d value=3
    

    然后在三个要部署集群的节点上执行如下操作即可:

    etcd --name etcd1 --data-dir /data/etcd 
    --initial-advertise-peer-urls http://10.5.12.16:2380 
    --listen-peer-urls http://10.5.12.16:2380 
    --listen-client-urls http://10.5.12.16:2379,http://127.0.0.1:2379 
    --advertise-client-urls http://10.5.12.16:2379 
    --discovery https://discovery.etcd.io/5c007a14875d53d9bf0ef5a6fc0257c817f0fb83
    
  • 相关阅读:
    不要给技术人员做绩效
    软件开发项目的风险
    cxgrid在当前View插入记录
    cxgrid根据单元的值设置样式
    有锐捷客户端的情况下用虚拟机照样上网
    cxgrid在内置右键菜单的后面增加菜单项
    cxgrid按条件计算合计值
    cxgrid在内置右键菜单的后面增加菜单项
    微信小程序弹窗 Mr
    虚拟环境的创建 Mr
  • 原文地址:https://www.cnblogs.com/breezey/p/8836008.html
Copyright © 2020-2023  润新知