etcd proxy功能简介

etcd proxy功能简介

一、etcd proxy概述

etcd提供了proxy功能,即代理功能,etcd可以代理的方式来运行。

etcd代理可以运行在每一台主机,在这种代理模式下,etcd的作用就是一个反向代理,把客户端的etcd请求转发到真正的etcd集群。这种方式既加强了集群的弹性,又不会降低集群的写的性能。

etcd proxy支持2种运行模式:readwrite和readonly,缺省的是readwrite,即proxy会将所有的读写请求都转发给etcd集群;readonly模式下,只转发读请求,写请求将会返回http 501错误。

二、etcd proxy参数

启动etcd代理主要有3个参数:proxy、listen-client-urls、initial-cluster(或discovery)。

proxy指的是代理的模式,on是readwrite模式,readonly是只读模式。

listen-client-urls指的是代理的监听地址。

initial-cluster(或discovery)指的是请求将转发到在此url发现的etcd集群。discovery指的是使用服务发现方式搭建的集群url。

启动命令示例:

./etcd –proxy on  –listen-client-urls http://0.0.0.0:22379   –initial-cluster myetcd1=http://0.0.0.0:12380 –data-dir /home/cmp/temp/proxy

三、注意事项

1、proxy只支持API v2,不支持v3;

2、在服务发现集群模式下,多启动的etcd节点将会自动降级成读写模式的代理;

3、代理不会自动变成etcd集群节点,如要加入集群需要手工进行如下操作:

etcd add命令将proxy节点加入集群、停止proxy进程或服务、删除proxy数据目录、使用正确的参数配置重新启动etcd进程或服务。

四、代理实例操作演示

1、先启动一个简单etcd集群

./etcd –name myetcd1 –listen-client-urls http://0.0.0.0:12379 –advertise-client-urls http://0.0.0.0:12379 –listen-peer-urls http://0.0.0.0:12380 –initial-advertise-peer-urls http://0.0.0.0:12380 –initial-cluster myetcd1=http://0.0.0.0:12380 –data-dir /home/cmp/temp/myetcd1 &

2、再启动一个proxy节点

[root@cmp temp]# ./etcd –proxy on –listen-client-urls http://0.0.0.0:22379 –initial-cluster myetcd1=http://0.0.0.0:12380 –data-dir /home/cmp/temp/proxy &

[2] 27591
[root@cmp temp]# 2018-05-26 01:17:07.783930 I | etcdmain: etcd Version: 3.3.2
2018-05-26 01:17:07.783958 I | etcdmain: Git SHA: c9d46ab37
2018-05-26 01:17:07.783960 I | etcdmain: Go Version: go1.9.4
2018-05-26 01:17:07.783962 I | etcdmain: Go OS/Arch: linux/amd64
2018-05-26 01:17:07.783965 I | etcdmain: setting maximum number of CPUs to 4, total number of available CPUs is 4
2018-05-26 01:17:07.783971 I | etcdmain: advertising using detected default host “192.168.100.52”
2018-05-26 01:17:07.783976 N | etcdmain: proxy: this proxy supports v2 API only!
2018-05-26 01:17:07.784047 I | etcdmain: proxy: using peer urls [http://0.0.0.0:12380]
2018-05-26 01:17:07.785364 I | etcdmain: proxy: listening for client requests on http://0.0.0.0:22379
2018-05-26 01:17:07.785416 E | etcdmain: forgot to set Type=notify in systemd service file?
2018-05-26 01:17:07.785421 I | proxy/httpproxy: endpoints found [“http://0.0.0.0:12379”]

从启动信息看,proxy已经成功找到了etcd集群地址,代理的监听端口22379。

3、查看etcd集群信息

[root@cmp temp]# ./etcdctl –endpoints http://0.0.0.0:12379 member list
eb06dc1bc141ff4f: name=myetcd1 peerURLs=http://0.0.0.0:12380 clientURLs=http://0.0.0.0:12379 isLeader=true

etcd集群中只有一个leader成员。

4、通过代理进行key-value操作

[root@cmp temp]# ./etcdctl –endpoints http://127.0.0.1:22379 set key1 xxxxx
xxxxx
[root@cmp temp]# ./etcdctl –endpoints http://127.0.0.1:22379 get key1
xxxxx

API v2命令可以成功通过代理读写数据。

[root@cmp temp]# ETCDCTL_API=3 ./etcdctl –endpoints=http://127.0.0.1:12379 put key2 sssssssssss
OK
[root@cmp temp]# ETCDCTL_API=3 ./etcdctl –endpoints=http://127.0.0.1:22379 get key2
Error: context deadline exceeded

直接访问集群时,API v3命令成功将key值写入,但是通过proxy读取时,命令直接报错。

 

K8S中文社区微信公众号