Here's how to deploy etcd cluster with systemd.
etcd needs data directory on host machine. Configure the data directory accessible to systemd as:
sudo mkdir -p /var/lib/etcd sudo chown -R root:$(whoami) /var/lib/etcd sudo chmod -R a+rw /var/lib/etcd
In each machine, write etcd systemd service files:
cat > /tmp/my-etcd-1.service <<EOF [Unit] Description=etcd Documentation=https://github.com/coreos/etcd Conflicts=etcd.service Conflicts=etcd2.service [Service] Type=notify Restart=always RestartSec=5s LimitNOFILE=40000 TimeoutStartSec=0 ExecStart=etcd --name my-etcd-1 \ --data-dir /var/lib/etcd \ --listen-client-urls http://${IP_1}:2379 \ --advertise-client-urls http://${IP_1}:2379 \ --listen-peer-urls http://${IP_1}:2380 \ --initial-advertise-peer-urls http://${IP_1}:2380 \ --initial-cluster my-etcd-1=http://${IP_1}:2380,my-etcd-2=http://${IP_2}:2380,my-etcd-3=http://${IP_3}:2380 \ --initial-cluster-token my-etcd-token \ --initial-cluster-state new [Install] WantedBy=multi-user.target EOF sudo mv /tmp/my-etcd-1.service /etc/systemd/system/my-etcd-1.service
cat > /tmp/my-etcd-2.service <<EOF [Unit] Description=etcd Documentation=https://github.com/coreos/etcd Conflicts=etcd.service Conflicts=etcd2.service [Service] Type=notify Restart=always RestartSec=5s LimitNOFILE=40000 TimeoutStartSec=0 ExecStart=etcd --name my-etcd-2 \ --data-dir /var/lib/etcd \ --listen-client-urls http://${IP_2}:2379 \ --advertise-client-urls http://${IP_2}:2379 \ --listen-peer-urls http://${IP_2}:2380 \ --initial-advertise-peer-urls http://${IP_2}:2380 \ --initial-cluster my-etcd-1=http://${IP_1}:2380,my-etcd-2=http://${IP_2}:2380,my-etcd-3=http://${IP_3}:2380 \ --initial-cluster-token my-etcd-token \ --initial-cluster-state new [Install] WantedBy=multi-user.target EOF sudo mv /tmp/my-etcd-2.service /etc/systemd/system/my-etcd-2.service
cat > /tmp/my-etcd-3.service <<EOF [Unit] Description=etcd Documentation=https://github.com/coreos/etcd Conflicts=etcd.service Conflicts=etcd2.service [Service] Type=notify Restart=always RestartSec=5s LimitNOFILE=40000 TimeoutStartSec=0 ExecStart=etcd --name my-etcd-3 \ --data-dir /var/lib/etcd \ --listen-client-urls http://${IP_3}:2379 \ --advertise-client-urls http://${IP_3}:2379 \ --listen-peer-urls http://${IP_3}:2380 \ --initial-advertise-peer-urls http://${IP_3}:2380 \ --initial-cluster my-etcd-1=http://${IP_1}:2380,my-etcd-2=http://${IP_2}:2380,my-etcd-3=http://${IP_3}:2380 \ --initial-cluster-token my-etcd-token \ --initial-cluster-state new [Install] WantedBy=multi-user.target EOF sudo mv /tmp/my-etcd-3.service /etc/systemd/system/my-etcd-3.service
The service needs to be enabled first, in case of system reboot:
sudo systemctl daemon-reload sudo systemctl enable my-etcd-1.service sudo systemctl start my-etcd-1.service
sudo systemctl daemon-reload sudo systemctl enable my-etcd-2.service sudo systemctl start my-etcd-2.service
sudo systemctl daemon-reload sudo systemctl enable my-etcd-3.service sudo systemctl start my-etcd-3.service
systemd stores etcd server logs with journald:
sudo systemctl status my-etcd-1.service -l --no-pager sudo journalctl -u my-etcd-1.service -l --no-pager|less sudo journalctl -f -u my-etcd-1.service
sudo systemctl status my-etcd-2.service -l --no-pager sudo journalctl -u my-etcd-2.service -l --no-pager|less sudo journalctl -f -u my-etcd-2.service
sudo systemctl status my-etcd-3.service -l --no-pager sudo journalctl -u my-etcd-3.service -l --no-pager|less sudo journalctl -f -u my-etcd-3.service
To disable etcd process:
sudo systemctl stop my-etcd-1.service sudo systemctl disable my-etcd-1.service
sudo systemctl stop my-etcd-2.service sudo systemctl disable my-etcd-2.service
sudo systemctl stop my-etcd-3.service sudo systemctl disable my-etcd-3.service