本文内容基于 etcd3。 CoreOS 中的 etcd 是以 rkt 容器方式启动的。自带的 etcd2 命令已经过时,操作请使用 etcdctl。
etcd3 ab147-1vmabujczdkr4tgiezkkfag.png 我们将讨论最新版本的etcd(etcd v3),与之前的etcd v2相比,它有很大的变化。 API etcd3 提供了在分布式存储上执行的以下操作。这些操作大部分类似于 ZooKeeper 提供的操作,并没有因为底层数据结构的不同而有区别。 Put:将一个新的键值对存储。 etcd3 拥有一个滑动窗口来保留旧事件,以便断开连接不会导致所有事件丢失。 缺点 请注意,如果客户端超时或者客户端与 etcd 成员之间出现网络中断,客户端的运行状态可能不确定。 结论 我们讨论了 Apache ZooKeeper 和 etcd3 的主要特性和优缺点。 Introduction to etcd3 by CoreOS CTO Brandon Philips etcd3 API Apache Curator in 5 Minutes
https://medium.com/opsguru/securing-kubernetes-secrets-how-to-efficiently-secure-access-to-etcd-and-protect-your-secrets-b147791da768
该问题从 2016 年引入,所有开启鉴权的 etcd3 集群都会受到影响,在特定场景下,会导致 etcd 集群多个节点之间的数据不一致,并且 etcd 对外表现还可以正常读写,日志无明显报错。 触发条件 使用的为 etcd3 集群,并且开启了鉴权。 etcd 集群中节点发生重启。
--election-timeout=1250' - '--initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3 /store/etcd2/data:/etcd_data etcd3: image: "quay.io/coreos/etcd:v3.4.7" entrypoint: /usr/local =http://etcd3:2380' - '--listen-peer-urls=http://0.0.0.0:2380' - '--listen-client-urls=http ://0.0.0.0:2379' - '--advertise-client-urls=http://etcd3:2379' - '--initial-cluster-token /store/etcd3/data:/etcd_data 从上述脚本可见,宿主机的2379、2380、2381三个端口被用来映射三个etcd容器的2379端口; 执行命令docker-compose up
=http://etcd3:2380 - ETCD_INITIAL_CLUSTER_STATE=new volumes: - ${DOCKER_ROOT_DIR:-.} =http://etcd3:2380 - ETCD_INITIAL_CLUSTER_STATE=new volumes: - ${DOCKER_ROOT_DIR:-.} /volumes/etcd/data2:/bitnami/etcd etcd3: container_name: builder-etcd3 image: bitnami/etcd - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd3:2380 - ETCD_LISTEN_PEER_URLS=http://0.0.0.0 =http://etcd3:2380 - ETCD_INITIAL_CLUSTER_STATE=new volumes: - ${DOCKER_ROOT_DIR:-.}
TES默认的版本都是3.x以上的,并且支持http和https的2种访问方式,因为是3.x以上版本,需要etcd3这个python模块,需要先下载这个模块 pip install etcd3 首先获取下 etcd的访问地址,如果是https的方式,需要获取证书 获取连接地址和ca证书和客户端证书以及客户端私钥,保存到本地文件 import etcd3 etcd = etcd3.client(host
接下来以GO语言为例,简单介绍下基于Etcd3的关键代码实现: 1)命名解析实现:resolver.go package etcdv3 import ( "errors" "fmt" "strings" etcd3 "github.com/coreos/etcd/clientv3" "google.golang.org/grpc/naming" ) // resolver = nil { return nil, fmt.Errorf("grpclb: creat etcd3 client failed: %s", err.Error()) } = nil { return fmt.Errorf("grpclb: create etcd3 client failed: %v", err) } go func() 关闭Etcd3服务器,观察客户端与服务端通信是否正常? 关闭通信仍然正常,但新服务端不会注册进来,服务端掉线了也无法摘除掉。 重新启动Etcd3服务器,服务端上下线可自动恢复正常。
本文主要以etcd3插件为示例。 要求: python插件需要附属在自己的软件包程序中,以os.path.append的方式加载 实现步骤: 1、搜索找到etcd3的pthon插件 A)通过找pypi插件界面:https://pypi.org/project/etcd3/并下载最新软件包 B) 在pypi插件界面进入项目的homepage地址:https://github.com requirements.txt 关联插件:grpcio>=1.2.0 tenacity==4.10.0 protobuf==3.5.2.post1 2.1、搜索etcd3 File "/root/test/py_third/etcd3/etcdrpc/__init__.py", line 1, in <module> from .rpc_pb2 import
--election-timeout=1250' - '--initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3 /store/etcd2/data:/etcd_data etcd3: image: "quay.io/coreos/etcd:v3.4.7" entrypoint: /usr/local =http://etcd3:2380' - '--listen-peer-urls=http://0.0.0.0:2380' - '--listen-client-urls=http ://0.0.0.0:2379' - '--advertise-client-urls=http://etcd3:2379' - '--initial-cluster-token /store/etcd3/data:/etcd_data 从上述脚本可见,宿主机的2379、2380、2381三个端口被用来映射三个etcd容器的2379端口; 执行命令docker-compose up
关闭防火墙和SELinux 名称 地址 主机名 备注 etcd1 172.24.8.31 etcd1.example.com etcd2 172.24.8.32 etcd2.example.com etcd3 etcd-cluster-1 \ 7 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3 etcd-cluster-1 \ 7 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3 =http://172.24.8.33:2380 \ 8 --initial-cluster-state new 9 10 [root@etcd3 ~]# etcd --name etcd3 etcd-cluster-1 \ 16 --initial-cluster etcd1=http://172.24.8.31:2380,etcd2=http://172.24.8.32:2380,etcd3
=http://etcd3:2380 - ETCD_INITIAL_CLUSTER_STATE=new volumes: - ${DOCKER_ROOT_DIR:-.} =http://etcd3:2380 - ETCD_INITIAL_CLUSTER_STATE=new volumes: - ${DOCKER_ROOT_DIR:-.} /volumes/etcd/data2:/bitnami/etcd etcd3: container_name: builder-etcd3 image: bitnami/etcd - ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd3:2380 - ETCD_LISTEN_PEER_URLS=http://0.0.0.0 =http://etcd3:2380 - ETCD_INITIAL_CLUSTER_STATE=new volumes: - ${DOCKER_ROOT_DIR:-.}
= 100 queryLimit = 100 } } registry.conf registry { # file 、nacos 、eureka、redis、zk、consul、etcd3 "" password = "" } consul { cluster = "default" serverAddr = "127.0.0.1:8500" } etcd3 2181" sessionTimeout = 6000 connectTimeout = 2000 username = "" password = "" } etcd3 log { exceptionRate = 100 } } registry.conf registry { # file 、nacos 、eureka、redis、zk、consul、etcd3 "" password = "" } consul { cluster = "default" serverAddr = "127.0.0.1:8500" } etcd3
etcd-c1uster ETCD_INITIAL_CLUSTER="etcd1=https://192.168.3.135:2380,etcd2=https://192.168.3.136:2380,etcd3 etcd-c1uster ETCD_INITIAL_CLUSTER="etcd1=https://192.168.3.135:2380,etcd2=https://192.168.3.136:2380,etcd3 =https://192.168.3.137:2380" ETCD_INITIAL_CLUSTER_STATE=new # 节点3的配置 ETCD_NAME=etcd3 ETCD_DATA_DIR=/ etcd-c1uster ETCD_INITIAL_CLUSTER="etcd1=https://192.168.3.135:2380,etcd2=https://192.168.3.136:2380,etcd3 ETCD_NAME:etcd节点名称,每个节点都应不同,例如etcd1、etcd2、etcd3。 ETCD_DATA_DIR:etcd数据存储目录,例如/etc/etcd/data/etcd1。
(尚未合并) Share a single etcd3 client logger across all clients by negz · Pull Request #111477 · kubernetes 经过分析,发现这是由于未在实例化 etcd3 client 时候共享 logger,所以每个 etcd3 client 实例的时候,都会创建一个自己的 logger,从而导致占用了很多的资源。 在这个 PR 中是通过在创建 etcd3 client 的时候,传递已经创建好的 logger,让所有的 clients 共享,以此来减少资源的浪费。
1、准备工作 创建如图文件夹 将registry.conf文佳放置在conf文件下 registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa default" username = "nacos" password = "nacos" } } config { # file、nacos 、apollo、zk、consul、etcd3
我们在 node 里面链接下 etcd 服务: 使用 etcd 官方提供的 npm 包 etcd3: const { Etcd3 } = require('etcd3'); const client = new Etcd3({ hosts: 'http://localhost:2379', auth: { username: 'root', password 全部代码如下: const { Etcd3 } = require('etcd3'); const client = new Etcd3({ hosts: 'http://localhost:2379 在 node 里可以通过 etcd3 这个包来操作 etcd server。 稍微封装一下就可以实现配置管理和服务注册、发现的功能。
在数据访问层的设计上,也是秉承接口和实现的原则,定义接口功能,由相关的具体实现类(etcd3 实现)来实现功能。 cachedExistingObject runtime.Object) error Count(key string) (int64, error) } // k8s.io/apiserver/pkg/storage/etcd3 etcd3.store 结构体实现了上述定义的接口功能,在该结构体中的实现中封装了对象 clientv3.Client 用来完成对 etcd3 集群的访问和对象操作。 对于目前的 kubernetes 版本来说, 只支持 etcd3 的数据访问层。 对于 etcd2 或者其它类型存储的数据访问层是不支持的。
--election-timeout=1250' - '--initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3 /store/etcd2/data:/etcd_data etcd3: image: "quay.io/coreos/etcd:v3.4.7" entrypoint: /usr/local =http://etcd3:2380' - '--listen-peer-urls=http://0.0.0.0:2380' - '--listen-client-urls=http ://0.0.0.0:2379' - '--advertise-client-urls=http://etcd3:2379' - '--initial-cluster-token /store/etcd3/data:/etcd_data 准备好上述文件后,执行docker-compose up -d即可创建集群; 将服务端应用的IP地址和端口写入etcd 我这边local-server
--election-timeout=1250' - '--initial-cluster=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3 /store/etcd2/data:/etcd_data etcd3: image: "quay.io/coreos/etcd:v3.4.7" entrypoint: /usr/local =http://etcd3:2380' - '--listen-peer-urls=http://0.0.0.0:2380' - '--listen-client-urls=http ://0.0.0.0:2379' - '--advertise-client-urls=http://etcd3:2379' - '--initial-cluster-token /store/etcd3/data:/etcd_data 准备好上述文件后,执行docker-compose up -d即可创建集群; 将服务端应用的IP地址和端口写入etcd 我这边local-server