由於測試的需要,有時需要搭建一個單機版的etcd 環境,為了方便以后搭建查看,現在對單機部署進行記錄。
一、部署單機etcd
- 下載 指定版本的etcd
下載地址ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/updates/22/x86_64/e/etcd-2.2.5-1.fc22.x86_64.rpm
先判斷是否已經安裝了etcd,已經安裝的話就需要先刪除掉,注意權限問題
[vagrant@localhost wae]$ yum list installed | grep etcd etcd.x86_64 2.2.0-1.el7 installed [vagrant@localhost wae]$ yum remove etcd.x86_64 Loaded plugins: fastestmirror You need to be root to perform this command. [vagrant@localhost wae]$ sudo yum remove etcd.x86_64 Loaded plugins: fastestmirror Resolving Dependencies --> Running transaction check ---> Package etcd.x86_64 0:2.2.0-1.el7 will be erased --> Finished Dependency Resolution Dependencies Resolved =================================================================================================== Package Arch Version Repository Size =================================================================================================== Removing: etcd x86_64 2.2.0-1.el7 installed 26 M Transaction Summary =================================================================================================== Remove 1 Package Installed size: 26 M Is this ok [y/N]: y Downloading packages: Running transaction check Running transaction test Transaction test succeeded Running transaction Erasing : etcd-2.2.0-1.el7.x86_64 1/1 warning: /etc/etcd/etcd.conf saved as /etc/etcd/etcd.conf.rpmsave Verifying : etcd-2.2.0-1.el7.x86_64 1/1 Removed: etcd.x86_64 0:2.2.0-1.el7 Complete!
安裝下載的rpm包
[vagrant@localhost etcd]$ sudo yum localinstall etcd-2.2.5-1.fc22.x86_64.rpm
驗證安裝成功
[vagrant@localhost etcd]$ etcdctl --version etcdctl version 2.2.5
- 創建一個服務描述文件,放入systemd的服務目錄下,一般安裝完成都會自動創建
[vagrant@localhost etcd]$ sudo vi /usr/lib/systemd/system/etcd.service [Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf User=etcd # set GOMAXPROCS to number of processors ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\"" Restart=on-failure LimitNOFILE=65536 [Install] WantedBy=multi-user.target
- 修改etcd的配置
一般默認訪問的地址是http://localhost:2379,這邊我們可以自定義,因為是單機,我們就直接127.0.0.1,有想法的就端口修改下好了[vagrant@localhost etcd]$ sudo vi /etc/etcd/etcd.conf# [member]
ETCD_NAME=default
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:4001"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[cluster]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
# if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:4001"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#
#[proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#
#[logging]
#ETCD_DEBUG="false"
# examples for -log-package-levels etcdserver=WARNING,security=DEBUG
#ETCD_LOG_PACKAGE_LEVELS=""如果想要局域網可以訪問的話,則將 127.0.0.1 換成宿主機的 ip 即可了,最后外部用 ip 進行接口訪問即可。
- 啟動並測試ETCD
首先設置開機啟動:systemctl enable etcd
[vagrant@localhost etcd]$ sudo systemctl daemon-reload [vagrant@localhost etcd]$ sudo systemctl start etcd [vagrant@localhost etcd]$ sudo systemctl status etcd ● etcd.service - Etcd Server Loaded: loaded (/usr/lib/systemd/system/etcd.service; disabled; vendor preset: disabled) Active: active (running) since Fri 2018-03-09 08:55:47 UTC; 8s ago Main PID: 4624 (etcd) Memory: 26.0M CGroup: /system.slice/etcd.service └─4624 /usr/bin/etcd --name=default --data-dir=/var/lib/etcd/default.etcd --listen-cl... Mar 09 08:55:46 localhost.localdomain systemd[1]: Starting Etcd Server... Mar 09 08:55:47 localhost.localdomain systemd[1]: Started Etcd Server.
查看集群健康狀態
[vagrant@localhost etcd]$ sudo etcdctl cluster-health member ce2a822cea30bfca is healthy: got healthy result from http://127.0.0.1:4001 cluster is healthy
ok,沒有問題
- 卸載與刪除etcd
[vagrant@localhost wae]$ yum list installed | grep etcd etcd.x86_64 2.2.0-1.el7 installed [vagrant@localhost wae]$ yum remove etcd.x86_64
二、接口測試
etcd的數據形式是以健對值方式存在的。
- 通過接口獲取版本信息
[vagrant@localhost etcd]$ curl http://127.0.0.1:4001/version -XGET {"etcdserver":"2.2.5","etcdcluster":"2.2.0"}
- 更新一個健對值信息,並通過 ke y獲取到 value
[vagrant@localhost etcd]$ etcdctl set /tmp/message wozainali wozainali [vagrant@localhost etcd]$ etcdctl get /tmp/message wozainali
設置的方式:etcdctl set key value
獲取的方式:etcdctl get key - 通過接口獲取健對值信息
[vagrant@localhost etcd]$ curl http://127.0.0.1:4001/v2/keys/tmp/message -XGET {"action":"get","node":{"key":"/tmp/message","value":"wozainali","modifiedIndex":12,"createdIndex":12}}
再看看 詳細的請求信息
[vagrant@localhost etcd]$ curl http://127.0.0.1:4001/v2/keys/tmp/message -XGET {"action":"get","node":{"key":"/tmp/message","value":"wozainali","modifiedIndex":12,"createdIndex":12}} [vagrant@localhost etcd]$ curl http://127.0.0.1:4001/v2/keys/tmp/message -XGET -vv * About to connect() to 127.0.0.1 port 4001 (#0) * Trying 127.0.0.1... * Connected to 127.0.0.1 (127.0.0.1) port 4001 (#0) > GET /v2/keys/tmp/message HTTP/1.1 > User-Agent: curl/7.29.0 > Host: 127.0.0.1:4001 > Accept: */* > < HTTP/1.1 200 OK < Content-Type: application/json < X-Etcd-Cluster-Id: 7e27652122e8b2ae < X-Etcd-Index: 12 < X-Raft-Index: 37173 < X-Raft-Term: 3 < Date: Fri, 09 Mar 2018 09:16:15 GMT < Content-Length: 104 < {"action":"get","node":{"key":"/tmp/message","value":"wozainali","modifiedIndex":12,"createdIndex":12}} * Connection #0 to host 127.0.0.1 left intact
- 通過接口更新一個健對值信息
[vagrant@localhost etcd]$ curl http://127.0.0.1:4001/v2/keys/tmp/message -XPUT -d value=nihaoha {"action":"set","node":{"key":"/tmp/message","value":"nihaoha","modifiedIndex":13,"createdIndex":13},"prevNode":{"key":"/tmp/message","value":"wozainali","modifiedIndex":12,"createdIndex":12}} [vagrant@localhost etcd]$ curl http://127.0.0.1:4001/v2/keys/tmp/message -XGET {"action":"get","node":{"key":"/tmp/message","value":"nihaoha","modifiedIndex":13,"createdIndex":13}}
我們看到更新的時候,會有兩條記錄,一條是當前記錄,一條是之前的記錄,多次更新也只會保留最近的信息,獲取的時候默認獲取最新的信息
[vagrant@localhost etcd]$ curl http://127.0.0.1:4001/v2/keys/tmp/message -XPUT -d value=wowowow {"action":"set","node":{"key":"/tmp/message","value":"wowowow","modifiedIndex":14,"createdIndex":14},"prevNode":{"key":"/tmp/message","value":"nihaoha","modifiedIndex":13,"createdIndex":13}}
具體復雜的操作需要去看官方文檔,這邊只做了解使用。https://coreos.com/etcd/docs/latest/v2/api.html
- 通過接口刪除健對值信息
[vagrant@localhost etcd]$ curl http://127.0.0.1:4001/v2/keys/tmp/message -XDELETE {"action":"delete","node":{"key":"/tmp/message","modifiedIndex":15,"createdIndex":14},"prevNode":{"key":"/tmp/message","value":"wowowow","modifiedIndex":14,"createdIndex":14}} [vagrant@localhost etcd]$ curl http://127.0.0.1:4001/v2/keys/tmp/message -XGET {"errorCode":100,"message":"Key not found","cause":"/tmp/message","index":15}
可以看到刪除之后,重新去獲取該 key 的值,提示Key not found,證明我們刪除成功了。
以上就是,簡單的指定etcd單機安裝,以及api的幾個簡單應用。
三、問題
- 在修改訪問ip問局域網ip之后發現,使用 etcdctl 進行操作的時候會出現如下錯誤
[vagrant@localhost etcd]$ etcdctl ls Error: dial tcp 127.0.0.1:4001: getsockopt: connection refused [vagrant@localhost etcd]$ [vagrant@localhost etcd]$ [vagrant@localhost etcd]$ etcdctl cluster-health cluster may be unhealthy: failed to list members Error: client: etcd cluster is unavailable or misconfigured error #0: dial tcp 127.0.0.1:4001: getsockopt: connection refused error #1: dial tcp 127.0.0.1:2379: getsockopt: connection refused
查詢之后,發現應該是 ETCD_LISTEN_CLIENT_URLS 沒有寫入 http://127.0.0.1:4001 的原因,追加配置 http://127.0.0.1:4001,重新試一下
[vagrant@localhost etcd]$ etcdctl ls /test /test123 /tmp /test1223 [vagrant@localhost etcd]$ etcdctl cluster-health member ce2a822cea30bfca is healthy: got healthy result from http://192.168.10.50:4001 cluster is healthy [vagrant@localhost etcd]$
現在就可以了。
注意,添加配置的時候,用英文的逗號隔開.
