分类
devops

手工部署etcd单节点

Table of Contents

本文介绍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