本文介绍etcd单节点
安装。
下载
使用官网
https://github.com/etcd-io/etcd/releases
提供的下载脚本下载etcd和etcdctl二进制文件
ETCD_VER=v3.4.14
# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_URL}
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
/tmp/etcd-download-test/etcd --version
/tmp/etcd-download-test/etcdctl version
安装
sudo cp /tmp/etcd-download-test/etcd /usr/local/bin/
sudo cp /tmp/etcd-download-test/etcdctl /usr/local/bin/
sudo mkdir -p /opt/etcd-data
sudo chmod 700 /opt/etcd-data
sudo mkdir -p /etc/etcd
参考
https://github.com/etcd-io/etcd/blob/master/etcd.conf.yml.sample
这里来写一个etcd.conf.yml
vi /etc/etcd/etcd.conf.yml
name: 'default'
data-dir: /opt/etcd-data
enable-v2: false
debug: false
logger: zap
log-outputs: [stderr]
编写一个systemd的unitfile
vi /lib/systemd/system/etcd.service
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd --config-file /etc/etcd/etcd.conf.yml
Restart=on-failure
RestartSec=10s
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
启动
sudo systemctl daemon-reload && sudo systemctl enable etcd.service && sudo systemctl restart etcd.service;
sudo systemctl status etcd.service -l;
测试一下子
root@31e6422c8769:/# etcd --version
etcd Version: 3.4.14
Git SHA: 8a03d2e96
Go Version: go1.12.17
Go OS/Arch: linux/amd64
root@31e6422c8769:/# etcdctl version
etcdctl version: 3.4.14
API version: 3.4
root@31e6422c8769:/# ss -tunlp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 127.0.0.1:2379 0.0.0.0:* users:(("etcd",pid=4220,fd=5))
tcp LISTEN 0 128 127.0.0.1:2380 0.0.0.0:* users:(("etcd",pid=4220,fd=3))
root@31e6422c8769:/# etcdctl endpoint health
127.0.0.1:2379 is healthy: successfully committed proposal: took = 5.809481ms
root@31e6422c8769:/# etcdctl put foo bar
OK
root@31e6422c8769:/# etcdctl get foo
foo
bar
这时,一个监听本机127.0.0.1:2379
的etcd服务端就搭建好了。但是如果要远程访问,会报错。
root@31e6422c8769:/# etcdctl --debug --endpoints="172.17.0.1:2379" get foo
ETCDCTL_CACERT=
ETCDCTL_CERT=
ETCDCTL_COMMAND_TIMEOUT=5s
ETCDCTL_DEBUG=true
ETCDCTL_DIAL_TIMEOUT=2s
ETCDCTL_DISCOVERY_SRV=
ETCDCTL_DISCOVERY_SRV_NAME=
ETCDCTL_ENDPOINTS=[172.17.0.1:2379]
ETCDCTL_HEX=false
ETCDCTL_INSECURE_DISCOVERY=true
ETCDCTL_INSECURE_SKIP_TLS_VERIFY=false
ETCDCTL_INSECURE_TRANSPORT=true
ETCDCTL_KEEPALIVE_TIME=2s
ETCDCTL_KEEPALIVE_TIMEOUT=6s
ETCDCTL_KEY=
ETCDCTL_PASSWORD=
ETCDCTL_USER=
ETCDCTL_WRITE_OUT=simple
WARNING: 2020/12/29 11:05:10 Adjusting keepalive ping interval to minimum period of 10s
WARNING: 2020/12/29 11:05:10 Adjusting keepalive ping interval to minimum period of 10s
INFO: 2020/12/29 11:05:10 parsed scheme: "endpoint"
INFO: 2020/12/29 11:05:10 ccResolverWrapper: sending new addresses to cc: [{172.17.0.1:2379 <nil> 0 <nil>}]
WARNING: 2020/12/29 11:05:10 grpc: addrConn.createTransport failed to connect to {172.17.0.1:2379 <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 172.17.0.1:2379: connect: connection refused". Reconnecting...
WARNING: 2020/12/29 11:05:10 grpc: addrConn.createTransport failed to connect to {172.17.0.1:2379 <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 172.17.0.1:2379: connect: connection refused". Reconnecting...
WARNING: 2020/12/29 11:05:11 grpc: addrConn.createTransport failed to connect to {172.17.0.1:2379 <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 172.17.0.1:2379: connect: connection refused". Reconnecting...
WARNING: 2020/12/29 11:05:11 grpc: addrConn.createTransport failed to connect to {172.17.0.1:2379 <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 172.17.0.1:2379: connect: connection refused". Reconnecting...
WARNING: 2020/12/29 11:05:13 grpc: addrConn.createTransport failed to connect to {172.17.0.1:2379 <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 172.17.0.1:2379: connect: connection refused". Reconnecting...
WARNING: 2020/12/29 11:05:13 grpc: addrConn.createTransport failed to connect to {172.17.0.1:2379 <nil> 0 <nil>}. Err :connection error: desc = "transport: Error while dialing dial tcp 172.17.0.1:2379: connect: connection refused". Reconnecting...
{"level":"warn","ts":"2020-12-29T11:05:15.879Z","caller":"clientv3/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"endpoint://client-328f5e13-8528-4771-8f97-153c1e1cdeb9/172.17.0.1:2379","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: all SubConns are in TransientFailure, latest connection error: connection error: desc = \"transport: Error while dialing dial tcp 172.17.0.1:2379: connect: connection refused\""}
Error: context deadline exceeded
解决办法是在/etc/etcd/etcd.conf.yml
增加一行
listen-client-urls: http://0.0.0.0:2379