(Last Updated On: June 7, 2019)

This guide will explain how to install etcd on RHEL / CentOS 8. Etcd is a simple, reliable, fast and secure open source key-value store written in Go. It uses the Raft consensus algorithm to manage a highly-available replicated log. The installation shared here is not for use in Production environments as it is on a single node (one member etcd).

Note: This is a single node cluster setup, for three node cluster, refer to the guide below.

Setup Etcd Cluster on Ubuntu/Debian/CentOS

Install etcd on RHEL / CentOS 8

Being written in Go, etcd is distributed as a binary package but installation from source is also available. In this guide, we’re going to download a pre-built binary package.

Ensure you have vim and wget installed on your RHEL / CentOS 8 server.

sudo dnf -y install curl vim

Step 1: Download Etcd binary

Check the latest release on releases page before you proceed to get the latest release tag.

export RELEASE="3.3.13"
wget https://github.com/etcd-io/etcd/releases/download/v${RELEASE}/etcd-v${RELEASE}-linux-amd64.tar.gz

Extract downloaded archive file.

tar xvf etcd-v${RELEASE}-linux-amd64.tar.gz

Change to new file directory

cd etcd-v${RELEASE}-linux-amd64

Move etcd and etcdctl binary files to /usr/local/bin directory.

sudo mv etcd etcdctl /usr/local/bin 

Confirm version.

$ etcd --version
etcd Version: 3.3.13
Git SHA: 98d3084
Go Version: go1.10.8
Go OS/Arch: linux/amd64

Step 2: Configure Etcd Systemd service

We’re going to use systemd to manage etcd service. First, create data directory for etcd.

sudo mkdir -p /var/lib/etcd/
sudo mkdir /etc/etcd

Create etcd system user

sudo groupadd --system etcd
sudo useradd -s /sbin/nologin --system -g etcd etcd

Set /var/lib/etcd/ directory ownership to etcd user.

sudo chown -R etcd:etcd /var/lib/etcd/

Configure Systemd and start etcd service

Create a new systemd service file for etcd.

 sudo vim /etc/systemd/system/etcd.service

Paste below contents to the file.

[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
After=network.target

[Service]
User=etcd
Type=notify
Environment=ETCD_DATA_DIR=/var/lib/etcd
Environment=ETCD_NAME=%m
ExecStart=/usr/local/bin/etcd
Restart=always
RestartSec=10s
LimitNOFILE=40000

[Install]
WantedBy=multi-user.target

Reload systemd service and start etcd on CentOS / RHEL system.

sudo systemctl daemon-reload
sudo systemctl start etcd.service

If you have SELinux running in enforcing mode, then generate a local policy module to allow access to data directories.

sudo ausearch -c '(etcd)' --raw | audit2allow -M my-etcd

To make this policy package active, execute:

sudo semodule -X 300 -i my-etcd.pp
sudo restorecon -Rv /usr/local/bin/etcd

Restart etcd service.

sudo systemctl restart etcd

Check service status to confirm it is running.

[[email protected] ~]# systemctl status etcd
 ● etcd.service - etcd key-value store
    Loaded: loaded (/etc/systemd/system/etcd.service; disabled; vendor preset: disabled)
    Active: active (running) since Fri 2019-03-22 22:38:07 EAT; 36s ago
      Docs: https://github.com/etcd-io/etcd
  Main PID: 1938 (etcd)
     Tasks: 10 (limit: 11510)
    Memory: 3.7M
    CGroup: /system.slice/etcd.service
            └─1938 /usr/local/bin/etcd
 Mar 22 22:38:05 rhel8.local etcd[1938]: enabled capabilities for version 3.3
 Mar 22 22:38:07 rhel8.local etcd[1938]: 8e9e05c52164694d is starting a new election at term 2
 Mar 22 22:38:07 rhel8.local etcd[1938]: 8e9e05c52164694d became candidate at term 3
 Mar 22 22:38:07 rhel8.local etcd[1938]: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 3
 Mar 22 22:38:07 rhel8.local etcd[1938]: 8e9e05c52164694d became leader at term 3
 Mar 22 22:38:07 rhel8.local etcd[1938]: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 3
 Mar 22 22:38:07 rhel8.local etcd[1938]: published {Name:992462394b1c4f2e80e7e2fd978f04f8 ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c>
 Mar 22 22:38:07 rhel8.local etcd[1938]: ready to serve client requests
 Mar 22 22:38:07 rhel8.local systemd[1]: Started etcd key-value store.
 Mar 22 22:38:07 rhel8.local etcd[1938]: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!

The service will start on localhost address port 2379

$ ss -tunelp | grep 2379
tcp LISTEN 0 128 127.0.0.1:2379 0.0.0.0:* uid:998 ino:72981 sk:45c <->

$ etcdctl member list
8e9e05c52164694d: name=992462394b1c4f2e80e7e2fd978f04f8 peerURLs=http://localhost:2380 clientURLs=http://localhost:2379 isLeader=true

Step 3: Test Etcd Installation

Test your etcd installation on CentOS / RHEL 8 by writing to etcd.

$ etcdctl set /message "Hello World"
Hello World

Read the value of message back:

$ etcdctl get /message
Hello World

Create directory.

$ etcdctl mkdir /myservice
$ etcdctl set /myservice/container1 localhost:8080
localhost:8080
$ etcdctl ls /myservice
/myservice/container1

To watch directory for changes, use:

$ etcdctl watch --recursive /myservice

To delete the key run:

$ etcdctl rm /message
PrevNode.Value: Hello World

$ etcdctl rm /myservice/container1
PrevNode.Value: localhost:8080

There you have it. Etcd has been installed on RHEL / CentOS 8 system. For the Ubuntu systems, check how to install etcd on Ubuntu.