‘Installing and configuring etcd’

インストール

Debian/Ubuntuパッケージ

公式のDebian/Ubuntu aptリポジトリからetcdをインストールするには:

$ sudo apt-get -y install etcd
インストールされているバージョンと利用可能な最新バージョンを確認できます。インストールされているバージョンが古く、最新のバージョンをインストールする場合は、

ビルド済みバイナリ メソッドを使用します。

RedHat互換パッケージ

PGDG yum extras リポジトリにはetcdパッケージが含まれています。

システムで yum.postgresql.org を設定して使用するには、 PostgreSQL Linux downloads website を参照してください。

システムに応じて、次のリポジトリを有効にします。

  • RHEL 9:pgdg-rhel9-extras

  • RHEL 8:pgdg-rhel8-extras

  • RHEL 7:pgdg-rhel7-extras

たとえば、次のコマンドはetcdをRHEL 8にインストールします。

$ sudo dnf --enablerepo=pgdg-rhel8-extras install -y etcd
インストールされているバージョンと利用可能な最新バージョンを確認できます。インストールされているバージョンが古く、最新のバージョンをインストールする場合は、

ビルド済みバイナリ メソッドを使用します。

ビルド済みバイナリ

これらのコマンドは、インストールされたetcdバイナリのバージョンを出力し、etcd-io Webサイトから最新バージョンを取得します。

$ etcd --version |head -1
etcd Version: 3.5.7

$ ETCD_RELEASE=$(curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest|grep tag_name | cut -d " -f 4)
$ echo "Latest etcd version released: $ETCD_RELEASE"
Latest etcd version released: v3.5.7

etcdの最新リリースをインストールする最も簡単な方法は、ビルド済みバイナリからのものです。

amd64 ホストでは、次のコマンドを使用します。

$ ETCD_RELEASE=$(curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest|grep tag_name | cut -d " -f 4)
$ curl -sL https://github.com/etcd-io/etcd/releases/download/${ETCD_RELEASE}/etcd-${ETCD_RELEASE}-linux-amd64.tar.gz \
 | sudo tar xz -C /usr/bin --strip=1 --wildcards --no-anchored etcdctl etcd
$ etcd --version |head -1
etcd Version: 3.5.7

次に、データディレクトリとシステムユーザーを作成します。

$ sudo mkdir -p /var/lib/etcd/
$ sudo mkdir /etc/etcd
$ sudo groupadd --system etcd
$ sudo useradd -s /sbin/nologin --system -g etcd etcd
$ sudo chown -R etcd:etcd /var/lib/etcd/
$ sudo chmod -R a+rw /var/lib/etcd

systemdユニットファイルを構成します。

$ cat <<EOF | sudo tee /etc/systemd/system/etcd.service
[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
After=network-online.target local-fs.target remote-fs.target time-sync.target
Wants=network-online.target local-fs.target remote-fs.target time-sync.target

[Service]
User=etcd
Type=notify
Environment=ETCD_DATA_DIR=/var/lib/etcd
Environment=ETCD_NAME=%H
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd
Restart=always
RestartSec=10s
LimitNOFILE=40000

[Install]
WantedBy=multi-user.target
EOF

$ sudo systemctl daemon-reload

構成

必要に応じてファイアウォールを構成します。

$ sudo firewall-cmd --quiet --zone=public --add-port=2379/tcp --permanent
$ sudo firewall-cmd --quiet --zone=public --add-port=2380/tcp --permanent
$ sudo firewall-cmd --quiet --reload

新しいetcdクラスターを構成して作成するには、 ETCD_INITIAL_CLUSTER 変数を設定して初期クラスター構成を定義する必要があります。そのリストには、すべてのetcdホストとそのIPアドレスが含まれている必要があります。

この例では、3つのetcdホストを示しています。

$ ETCD_INITIAL_CLUSTER="etcd1=http://192.168.121.35:2380,etcd2=http://192.168.121.245:2380,etcd3=http://192.168.121.191:2380"

動的に取得するには、次の単純なシェルスクリプトを使用できます。 etcd1 etcd2 etcd3 は3つのetcdホストです。

#  Fetch the IP addresses of all etcd hosts

etcd_nodes=( etcd1 etcd2 etcd3 )
i=0
for node in "${etcd_nodes[@]}"
do
  i=$i+1
  target_ip=$(dig +short $node)
  target_array[$i]="$node=http://$target_ip:2380"
done
ETCD_CLUSTER_URL=$(printf ",%s" "${target_array[@]}")
export ETCD_CLUSTER_URL=${ETCD_CLUSTER_URL:1}
echo "ETCD_CLUSTER_URL=\"$ETCD_CLUSTER_URL\""

次に、ローカル etcd 構成を設定し、サービスを開始します。

$ MY_IP=$(hostname -I | awk  {print $1})
$ MY_NAME=$(hostname --short)
$ cat <<EOF | sudo tee /etc/etcd/etcd.conf
# [Member]
ETCD_LISTEN_PEER_URLS="http://$MY_IP:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379,http://$MY_IP:2379"
ETCD_NAME="$MY_NAME"
# [Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://$MY_IP:2380"
ETCD_INITIAL_CLUSTER="$ETCD_CLUSTER_URL"
ETCD_ADVERTISE_CLIENT_URLS="http://$MY_IP:2379"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-1"
ETCD_INITIAL_CLUSTER_STATE="new"
EOF
$ sudo systemctl enable etcd.service
$ sudo systemctl start etcd.service

注釈

ビルド済みバイナリ方法またはRed Hat互換パッケージを使用する場合、構成ファイルは`/etc/etcd/etcd.conf` です。 Debian/Ubuntuパッケージを使用する場合、構成ファイルは`/etc/default/etcd` です。

サービスを開始し、ポート2379 および2380 でリッスンします。クラスターのステータスを確認します。

$ ss -tunelp | grep 2379
tcp   LISTEN 0      4096       127.0.0.1:2379      0.0.0.0:*    ...
tcp   LISTEN 0      4096   192.168.121.7:2379      0.0.0.0:*    ...

$ ss -tunelp | grep 2380
tcp   LISTEN 0      4096   192.168.121.245:2380      0.0.0.0:*    ...

$ etcdctl member list
3078f511def8f5a9, started, etcd1, http://192.168.121.7:2380, http://192.168.121.7:2379, false
493bb0ea8338d60a, started, etcd2, http://192.168.121.174:2380, http://192.168.121.174:2379, false
bfdda4bcab677625, started, etcd3, http://192.168.121.226:2380, http://192.168.121.226:2379, false

$ etcdctl endpoint health
127.0.0.1:2379 is healthy: successfully committed proposal: took = 2.103463ms

$ etcdctl endpoint status
127.0.0.1:2379, 3078f511def8f5a9, 3.5.4, 29 kB, true, false, 2, 12, 12,