etcd 网关
什么是etcd 网关
etcd 网关是一个简单的TCP 代理,可将网络数据转发到 etcd 集群。网关是无状态且透明的,它既不会检查客户端请求,也不会干扰集群响应,支持多个 etcd 服务器实例,并采用简单的循环策略。etcd 网关将请求路由到可用端点,并向客户端隐藏故障,使得客户端感知不到服务端的故障。后期可能会支持其他访问策略,例如加权轮询。
我们使用客户端连接到 etcd 服务器时,每个访问 etcd 的应用程序必须知道所要访问的 etcd 集群实例的地址,即用来提供客户端服务的地址:ETCD_LISTEN_CLIENT_URLS。
如果将 etcd 集群重新配置,拥有不同的端点,那么每个应用程序还需要更新其端点列表。在大规模集群环境下,重新配置的操作既造成了重复又容易出错。
这些问题可以通过 etcd 网关来解决:使用 etcd 网关作为稳定的本地端点,对于客户端应用程序来说,不会感知到集群实例的变化。典型的 etcd 网关配置是使每台运行网关的计算机在本地地址上侦听,并且每个 etcd 应用程序都连接对应的本地网关,发生 etcd 集群实例的变更时,只需要网关更新其端点,而不需要更新每个客户端应用程序的代码实现。
不实用etcd 网关的场景:
- 性能提升
etcd 网关不是为提高 etcd 集群性能设计的。它不提供缓存、watch 流合并或批量处理等功能。etcd 团队目前正在开发一种缓存代理,旨在提高集群的可伸缩性。
- 运行在集群管理系统之上
高级集群管理系统比如 Kubernetes 原生支持服务发现。应用可以访问使用 DNS 名称 或者系统管理的虚拟IP地址来访问 etcd 集群。例如,kube-proxy 等价于 etcd 网关。
开启etcd 网关
etcd gateway start --endpoints=http://127.0.0.1:12379,http://127.0.0.1:22379,http://127.0.0.1:32379 --listen-addr=192.168.70.100:23790
注意:--endpoints是以逗号分隔的、用于转发客户端连接的 etcd 服务器目标列表。默认值为127.0.0.1:2379,url不支持https,因为网关并不能决定 TLS。
--listen-addr :绑定的接口和端口,用于接受客户端请求,默认配置为127.0.0.1:23790
--retry-delay: 重试连接到失败的端点延迟时间,默认为 1m0s
--insecure-discovery :接受不安全或容易受到中间人攻击的 SRV 记录,默认为 false。
--trusted-ca-file: 是 etcd 集群的客户端 TLS CA 文件的路径,用于认证端点。
gRPC-Gateway
etcd v3 使用 gRPC作为其消息传递协议。etcd 项目包括一个基于 gRPC 的 Go 客户端和一个命令行实用程序 etcdctl,用于通过 gRPC 与 etcd 集群通信。对于不支持 gRPC 的语言,etcd 提供了一个 JSON gRPC 网关。此网关提供 RESTful 代理,将 HTTP/JSON 请求转换为 gRPC 消息。
自 etcd v3.3 以来 gRPC 网关端点已更改:
- etcd v3.2 或之前的版本仅使用
[CLIENT-URL]/v3alpha/*
。 - etcd v3.3 使用
[CLIENT-URL]/v3beta/*
同时保留[CLIENT-URL]/v3alpha/*
. - etcd v3.4 使用
[CLIENT-URL]/v3/*
同时保留[CLIENT-URL]/v3beta/*
.[CLIENT-URL]/v3alpha/*
已弃用。
- etcd v3.5 或更高版本仅使用
[CLIENT-URL]/v3/*
.[CLIENT-URL]/v3beta/*
已弃用。
gRPC-gateway 不支持使用 TLS 公用名进行身份验证。
这里你需要注意的是,在 HTTP 请求体中的 JSON 对象,其包含的 key 和 value 字段都被定义成了 byte 数组,因此必须在 JSON 对象中,使用 base64 编码对内容进行处理。
键值对读写操作
- put
key:test1(base64编码:dGVzdDE=)
value:hello1(base64编码:aGVsbG8x)
- range
- 获取范围内的值
- watch
监听:
修改:
etcd事务
事务用于完成一组操作,通过对比指定的条件,成功的情况下执行相应的操作,否则回滚。在 gRPC-Gateway 中提供了 API接口,通过 /v3/kv/txn 接口发起一个事务。
对比指定键值对的创建版本,如果成功则执行更新操作:
发起事务,用以设置键值,compare 是断言列表,拥有多个联合的条件,这里的条件是当 createRevision 的值为 9时(我们在上面请求查询到该键值的创建版本为 9),表示符合条件,因此事务可以成功执行。
对比指定键值对版本的事务:
compare 中 target 的枚举值为 VERSION。通过比较,发现键 dGVzdDE=对应的 version 确实是 5,因此执行查询结果,返回dGVzdDE=对应的正确值
HTTP 请求的安全认证
HTTP 的方式访问 etcd 服务端,需要考虑安全的问题,gRPC-Gateway 中提供的 API 接口支持开启安全认证。通过 /v3/auth 接口设置认证,流程如下:
创建 root 用户
创建 root 角色
为 root 用户授予角色
开启权限
认证令牌
请求获取到 token 的值为 cMVhTOjIuxOqpjvf.28,接下来,设置请求的头部 Authorization 为刚刚获取到的身份验证令牌,以使用身份验证凭据来请求etcd
如图,左边请求未设置 正确的Authorization值,etcd拒绝请求;右边设置正确的Authorization值,请求正常