Distributed reliable key-value store for the most critical data of a distributed system

Overview

etcd

Go Report Card Coverage Build Status Travis Build Status Semaphore Docs Godoc Releases LICENSE

Note: The master branch may be in an unstable or even broken state during development. Please use releases instead of the master branch in order to get stable binaries.

etcd Logo

etcd is a distributed reliable key-value store for the most critical data of a distributed system, with a focus on being:

  • Simple: well-defined, user-facing API (gRPC)
  • Secure: automatic TLS with optional client cert authentication
  • Fast: benchmarked 10,000 writes/sec
  • Reliable: properly distributed using Raft

etcd is written in Go and uses the Raft consensus algorithm to manage a highly-available replicated log.

etcd is used in production by many companies, and the development team stands behind it in critical deployment scenarios, where etcd is frequently teamed with applications such as Kubernetes, locksmith, vulcand, Doorman, and many others. Reliability is further ensured by rigorous testing.

See etcdctl for a simple command line client.

Community meetings

etcd contributors and maintainers have monthly (every four weeks) meetings at 11:00 AM (USA Pacific) on Thursday.

An initial agenda will be posted to the shared Google docs a day before each meeting, and everyone is welcome to suggest additional topics or other agendas.

Time:

Join Hangouts Meet: meet.google.com/umg-nrxn-qvs

Join by phone: +1 405-792-0633‬ PIN: ‪299 906‬#

Getting started

Getting etcd

The easiest way to get etcd is to use one of the pre-built release binaries which are available for OSX, Linux, Windows, and Docker on the release page.

For more installation guides, please check out play.etcd.io and operating etcd.

For those wanting to try the very latest version, build the latest version of etcd from the master branch. This first needs Go installed (version 1.15+ is required). All development occurs on master, including new features and bug fixes. Bug fixes are first targeted at master and subsequently ported to release branches, as described in the branch management guide.

Running etcd

First start a single-member cluster of etcd.

If etcd is installed using the pre-built release binaries, run it from the installation location as below:

/tmp/etcd-download-test/etcd

The etcd command can be simply run as such if it is moved to the system path as below:

mv /tmp/etcd-download-test/etcd /usr/local/bin/
etcd

If etcd is built from the master branch, run it as below:

./bin/etcd

This will bring up etcd listening on port 2379 for client communication and on port 2380 for server-to-server communication.

Next, let's set a single key, and then retrieve it:

etcdctl put mykey "this is awesome"
etcdctl get mykey

etcd is now running and serving client requests. For more, please check out:

etcd TCP ports

The official etcd ports are 2379 for client requests, and 2380 for peer communication.

Running a local etcd cluster

First install goreman, which manages Procfile-based applications.

Our Procfile script will set up a local example cluster. Start it with:

goreman start

This will bring up 3 etcd members infra1, infra2 and infra3 and optionally etcd grpc-proxy, which runs locally and composes a cluster.

Every cluster member and proxy accepts key value reads and key value writes.

Follow the steps in Procfile.learner to add a learner node to the cluster. Start the learner node with:

goreman -f ./Procfile.learner start

Next steps

Now it's time to dig into the full etcd API and other guides.

Contact

Contributing

See CONTRIBUTING for details on submitting patches and the contribution workflow.

Reporting bugs

See reporting bugs for details about reporting any issues.

Reporting a security vulnerability

See security disclosure and release process for details on how to report a security vulnerability and how the etcd team manages it.

Issue and PR management

See issue triage guidelines for details on how issues are managed.

See PR management for guidelines on how pull requests are managed.

etcd Emeritus Maintainers

These emeritus maintainers dedicated a part of their career to etcd and reviewed code, triaged bugs, and pushed the project forward over a substantial period of time. Their contribution is greatly appreciated.

  • Fanmin Shi
  • Anthony Romano

License

etcd is under the Apache 2.0 license. See the LICENSE file for details.

Comments
  • Random performance issue on etcd 3.4

    Random performance issue on etcd 3.4

    Hello,

    We are running a 5 node etcd cluster:

    $ etcdctl endpoint status 
    etcd01, 507905ef22a349ce, 3.4.7, 3.1 GB, true, false, 785, 17694912855, 17694912855, 
    etcd02, 96622104eaa8652d, 3.4.7, 3.1 GB, false, false, 785, 17694912881, 17694912880, 
    ectd03, e91fce12ee84c080, 3.4.7, 3.1 GB, false, false, 785, 17694912903, 17694912903, 
    etcd04, 400fc14411f50272, 3.4.7, 3.1 GB, false, false, 785, 17694912989, 17694912985, 
    etcd05, 87c46f0b178dc777, 3.4.7, 3.1 GB, false, false, 785, 17694913043, 17694913028, 
    

    And we're having some weird performance issue eg:

    # etcdctl endpoint health
    etcd01 is healthy: successfully committed proposal: took = 12.462058ms
    etcd03 is healthy: successfully committed proposal: took = 18.826686ms
    etcd02 is healthy: successfully committed proposal: took = 19.418745ms
    etcd04 is healthy: successfully committed proposal: took = 24.314474ms
    etcd05 is healthy: successfully committed proposal: took = 244.761598ms
    
    # etcdctl endpoint health
    etcd01 is healthy: successfully committed proposal: took = 13.505405ms
    etcd03 is healthy: successfully committed proposal: took = 21.905048ms
    etcd04 is healthy: successfully committed proposal: took = 22.569332ms
    etcd02 is healthy: successfully committed proposal: took = 23.10597ms
    etcd05 is healthy: successfully committed proposal: took = 24.182998ms
    
    # etcdctl endpoint health
    etcd05is healthy: successfully committed proposal: took = 24.854541ms
    etcd01 is healthy: successfully committed proposal: took = 86.045049ms
    etcd03 is healthy: successfully committed proposal: took = 171.771975ms
    etcd04 is healthy: successfully committed proposal: took = 576.218846ms
    etcd02 is healthy: successfully committed proposal: took = 1.06666032s
    

    Not sure how to debug it, it looks pretty random. Feel free to ask for more info!

    stale 
    opened by Sh4d1 76
  • Data inconsistency in etcd version 3.3.11

    Data inconsistency in etcd version 3.3.11

    etcdctl get command returns values sometimes and sometimes it does not return a value even if key value is present in etcd. You can see following command output executed immediately one by one.

    bash-4.4$ etcdctl put /test thisistestvalue OK bash-4.4$ etcdctl get /test bash-4.4$ bash-4.4$ etcdctl get /test bash-4.4$ etcdctl get /test /test thisistestvalue bash-4.4$ etcdctl get /test /test thisistestvalue

    From below command, we can see that the inconsistence happens. We can see each time we query using etcdctl get and create_revision is different sometimes giving different values.

    bash-4.4$ ETCDCTL_API=3 etcdctl get /test --write-out json --consistency="s" {"header":{"cluster_id":10661059405016682411,"member_id":7511149175418186860,"revision":36793,"raft_term":16}} bash-4.4$ ETCDCTL_API=3 etcdctl get /test --write-out json --consistency="s"

    {"header":{"cluster_id":10661059405016682411,"member_id":14491470182485552592,"revision":10495,"raft_term":16} ,"kvs":[{"key":"L3Rlc3Q=","create_revision":6830,"mod_revision":6830,"version":1,"value":"dGVzdHZhbHVl"}],"count":1} bash-4.4$ ETCDCTL_API=3 etcdctl get /test --write-out json --consistency="s" {"header":{"cluster_id":10661059405016682411,"member_id":12240595110633392601,"revision":36802,"raft_term":16}} bash-4.4$

    bash-4.4$ ETCDCTL_API=3 etcdctl get /test1 --prefix=true --write-out json

    {"header":{"cluster_id":10661059405016682411,"member_id":12240595110633392601,"revision":36818,"raft_term":16} ,"kvs":[{"key":"L2VyaWMtY2Nlcy1leHRlbnNpb24tbWFuYWdlci90ZXN0","create_revision":33064,"mod_revision":33064,"version":1,"value":"dmFsdWV0ZXN0"}],"count":1} bash-4.4$ bash-4.4$ ETCDCTL_API=3 etcdctl get /test1 --prefix=true --write-out json

    {"header":{"cluster_id":10661059405016682411,"member_id":14491470182485552592,"revision":10511,"raft_term":16} ,"kvs":[{"key":"L2VyaWMtY2Nlcy1leHRlbnNpb24tbWFuYWdlci90ZXN0","create_revision":3641,"mod_revision":3641,"version":1,"value":"bXl0ZXN0dmFsdWU="}],"count":1} bash-4.4$ ETCDCTL_API=3 etcdctl get /test1 --prefix=true --write-out json

    {"header":{"cluster_id":10661059405016682411,"member_id":7511149175418186860,"revision":36819,"raft_term":16} ,"kvs":[{"key":"L2VyaWMtY2Nlcy1leHRlbnNpb24tbWFuYWdlci90ZXN0","create_revision":33064,"mod_revision":33064,"version":1,"value":"dmFsdWV0ZXN0"}],"count":1}

    Check the operation test as below: After performing Delete operation also we are able to get value for the deleted key.

    bash-4.4$ etcdctl put /temp/test mytestvalue OK bash-4.4$ etcdctl get /temp/test /temp/test mytestvalue bash-4.4$ bash-4.4$ etcdctl del /temp/test 1 bash-4.4$ etcdctl get /temp/test /temp/test mytestvalue bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test /temp/test mytestvalue bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test /temp/test mytestvalue bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test /temp/test mytestvalue bash-4.4$ etcdctl del /temp/test 0 bash-4.4$ etcdctl get /temp/test /temp/test mytestvalue bash-4.4$ etcdctl del /temp/test 0 bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test bash-4.4$ etcdctl get /temp/test /temp/test mytestvalue

    These kind of data inconsistency is seen in etcd . ETCD guarantees Data consistency. Could you please help understanding the issue here.? whats happening exactly?

    opened by rahulbapumore 73
  • 3.5 release next steps: Code freeze Monday 5/17

    3.5 release next steps: Code freeze Monday 5/17

    etcd 3.5 has seen a tremendous amount of new features bug fixes and performance and stability improvements. At this time I would like to thank everyone for the hard work and dedication. As per the community meeting on May 6th we have outlined Monday, May 17th as code freeze for the 3.5 release. Below are the proposed series of events for input.

    Steps:

    • [x] cut release-3.5 branch from master (now main). All future merges to main will be 3.6 moving forward (Monday AM 5/17).
    • [x] cut new v3.5.0-beta.3
    • [x] cut new modularized release v3.5.0-beta.3 (Monday AM 5/17).
    • [x] begin correctness and performance/stress testing (ideas, ownership?)

    After testing and validation of the beta, we can consider a sequential beta release or move towards a v3.5 release candidate.

    Your input is greatly appreciated.

    cc @xiang90 @wenjiaswe @ptabor @gyuho @jingyih @lilic @jpbetz @spzala

    area/community 
    opened by hexfusion 73
  • Bad latency (>100ms) of storage

    Bad latency (>100ms) of storage

    https://github.com/coreos/etcd/pull/4070 added a new benchmark for stressing etcd storage. It found a very high latency of put process.

    When a number of written keys is not so large (e.g. 1000), the result will be like this:

    total: 2.686489ms
    average: 2.686µs
    minimum latency: 1.545µs
    maximum latency: 18.209µs
    

    When the number of keys is larger (e.g. 10000), the result will be like this:

    total: 184.821125ms
    average: 18.482µs
    rate: 54106.3691
    minimum latency: 1.719µs
    maximum latency: 142.160798ms
    

    The high latency is also confirmed by @xiang90 : https://github.com/coreos/etcd/pull/4070#issuecomment-168287088

    The result can be easily reproduced with the benchmark e.g. ./benchmark storage put --total 10000.

    opened by mitake 62
  • client: file and environment variables based configuration

    client: file and environment variables based configuration

    Current etcd client library doesn't provide a mechanism for creating client.Client object based on file or env vars. Therefore users must write their own feature for the purpose in their applications.

    For avoiding the duplicated implementations, this PR adds new functions for creating client with file and environment variables based on viper.

    NewWithFile(client.Config, configPath string): create a new Client with a file. Any file formats supported by viper will be accepted.

    NewWithEnv(client.Config): create a new Client with values in environment variables.

    Like the existing New(), application must pass a client.Config object because there are some fields which isn't related to configuration (e.g. Transport).

    Fixes https://github.com/coreos/etcd/issues/4008

    opened by mitake 60
  • Move etcd to github.com/etcd-io/etcd*

    Move etcd to github.com/etcd-io/etcd*

    We are moving etcd and other sub-projects to its own GitHub organization.

    The new org will be https://github.com/etcd-io.

    Many popular Go projects have done this, for better project management:

    • https://github.com/google/protobuf/issues/4796
    • https://github.com/kubernetes/kubernetes/issues/12211, https://github.com/kubernetes/kubernetes/issues/29014
    • https://github.com/vitessio/vitess/pull/3702, https://github.com/vitessio/vitess/pull/3725

    Some of our motivations are:

    • Better team management.
    • Better CI resource utilization; currently, etcd relies on free-tier public CI service, and sharing all resources with other github.com/coreos projects slows down development process.
    • More visibilities to sub-projects and adopt more community projects under etcd organization.

    Move github.com/coreos/etcd and github.com/coreos/bbolt:

    • [x] Decide which namespace we will be using (1 ~ 2 weeks)
    • [x] Announce to etcd and Kubernetes communities (Mon, August 6, 2018)
    • [x] Update all internal github.com/coreos/etcd import paths in all branches (5PM PST, Mon, August 27, 2018)
    • [x] Disable CI integration with current org (5PM PST, Mon, August 27, 2018)
    • [x] Transfer ownership (5PM PST, Mon, August 27, 2018)
    • [x] Set up new CIs (5PM PST, Mon, August 27, 2018)
      • Add environmental variable ETCD_ELECTION_TIMEOUT_TICKS=600
    • [x] Make sure old URL redirects to new URL (5PM PST, Mon, August 27, 2018)
    • [x] Set up vanity import paths to go.etcd.io/$proj

    Sub-projects that do not have downstream projects can be transferred right away:

    • [x] https://github.com/coreos/cetcd (9PM PST, Tue, August 7, 2018)
    • [x] https://github.com/coreos/zetcd (9PM PST, Tue, August 7, 2018)
    • [x] https://github.com/coreos/gofail (9PM PST, Tue, August 7, 2018)
    • [x] https://github.com/coreos/dbtester (Mon, August 6, 2018)
    • [x] https://github.com/coreos/etcdlabs (Mon, August 6, 2018)
    • [x] https://github.com/coreos/etcd-play (Mon, August 6, 2018)
    • [x] https://github.com/coreos/protodoc (Mon, August 6, 2018)
    • [x] https://github.com/coreos/jetcd (9PM PST, Tue, August 7, 2018)

    Projects that won't be moved:

    • https://github.com/coreos/etcd-operator
    • https://github.com/coreos/discovery.etcd.io

    Note: GitHub will redirect all requests to new URL.

    /cc @xiang90 @jpbetz @lburgazzoli @philips @jberkus

    opened by gyuho 59
  • Durability API guarantee broken in single node cluster

    Durability API guarantee broken in single node cluster

    I observed the possibility of data loss and I would like the community to comment / correct me otherwise.

    Before explaining that, I would like to explain the happy path when user does a PUT <key, value>. I have tried to only necessary steps to focus this issue. And considered a single etcd instance.

    ==================================================================================== ----------api thread --------------

    User calls etcdctl PUT k v

    It lands in v3_server.go::put function with the message about k,v

    Call delegates to series of function calls and enters v3_server.go::processInternalRaftRequestOnce

    It registers for a signal with wait utility against this keyid

    Call delegates further to series of function calls and enters raft/node.go::stepWithWaitOption(..message..)

    It wraps this message in a msgResult channel and updates its result channel; then sends this message to propc channel.

    After sending it waits on msgResult.channel ----------api thread waiting --------------

    On seeing a message in propc channel, raft/node.go::run(), it wakes up and sequence of calls adds the message.Entries to raftLog

    Notifies the msgResult.channel

    ----------api thread wakes-------------- 10. Upon seeing the msgResult.channel, api thread wakes and returns down the stack back to v3_server.go::processInternalRaftRequestOnce and waits for signal that it registered at step#4 ----------api thread waiting --------------

    In next iteration of raft/node.go::run(), it gets the entry from raftLog and add it to readyc etcdserver/raft.go::start wakes up on seeing this entry in readyc and adds this entry to applyc channel and synchronously writes to wal log ---------------------> wal log etcdserver/server.go wakes up on seeing entry in applyc channel (added in step https://github.com/etcd-io/etcd/pull/12) From step#14, the call goes through series of calls and lands in server.go::applyEntryNormal applyEntryNormal calls applyV3.apply which will eventually puts the KV to mvcc kvstore txn kvindex applyEntryNormal now sends the signal for this key which is basically to wake up api thread that is waiting in 7 ----------api thread wakes-------------- 18. User thread here wakes and sends back acknowledgement ----------user sees ok--------------

    Batcher flushes the entries added to kvstore txn kvindex to database file. (also this can happen before 18 based on its timer)

    Here if step https://github.com/etcd-io/etcd/pull/13 thread is pre-empted and rescheduled by the underlying operating system after completing step https://github.com/etcd-io/etcd/pull/18 and when there is a power failure at the end of step 18 where after user sees error, then the kv is neither written to wal nor to database file

    I think this is not seen today because it is a small window where the server has to restart immediately after step 18 (and immediately after step 12 the underlying os must have pre-empted the etcdserver/raft.go::start and added to end of the runnable Q.). Given these multiple conditions, it appears that we dont see data loss.

    But it appears from the code that it is possible. To simulate, added sleep after step 12 (also added exit) and 19. I was able to see ok but the data is not in both wal and db.

    If I am not correct, my apology and also please correct my understanding.

    Before repro please do the changes:

    1. Do the code changes in raft.go image

    2.Do the code changes in tx.go image

    1. Rebuild etcd server

    Now follow the steps to repro //1. Start etcd server with changes

    //2. Add a key value. Allow etcdserver to acknowledge and exit immediately (with just sleep and exit to simulate the explanation) $ touch /tmp/exitnow; ./bin/etcdctl put /k1 v1 OK

    //3. Remove this control flag file and restart the etcd server $ rm /tmp/exitnow

    //4. Check if key present $ ./bin/etcdctl get /k --prefix $

    // We can see no key-value

    type/bug priority/important 
    opened by hasethuraman 58
  • etcd not compatible with grpc v1.30.0

    etcd not compatible with grpc v1.30.0

    To reproduce:

    $ go get google.golang.org/grpc@latest
    go: google.golang.org/grpc latest => v1.30.0
    $ go mod tidy
    ...
    go.etcd.io/etcd/v3/clientv3/naming imports
            google.golang.org/grpc/naming: module google.golang.org/grpc@latest found (v1.30.0), but does not contain package google.golang.org/grpc/naming
    

    This is a problem for dependents of etcd who want to use the latest grpc.

    The naming package was removed at https://github.com/grpc/grpc-go/pull/3314 and was deprecated in favour of resolver.

    I can work on a pull request if that's helpful.

    area/clientv3 
    opened by xiegeo 56
  • clientv3: grpc-go (v1.27.0) made API changes to balancer / resolver.

    clientv3: grpc-go (v1.27.0) made API changes to balancer / resolver.

    After the release of grpc-go v1.27.0, an error occurred while pulling etcd / clientv3. The steps to reproduce it are as follows:

    1. go.mod:
    go 1.13
    
    require (
    	github.com/coreos/etcd v3.3.18+incompatible // indirect
    	github.com/coreos/go-systemd v0.0.0-00010101000000-000000000000 // indirect
    	github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect
    	github.com/gogo/protobuf v1.3.1 // indirect
    	github.com/google/uuid v1.1.1 // indirect
    	go.etcd.io/etcd v3.3.18+incompatible // indirect
    	go.uber.org/zap v1.13.0 // indirect
    	google.golang.org/grpc v1.27.0 // indirect
    )
    
    replace github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0
    
    1. command:
    $ go get go.etcd.io/etcd/clientv3
    # github.com/coreos/etcd/clientv3/balancer/resolver/endpoint
    ../../go/pkg/mod/github.com/coreos/[email protected]+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:114:78: undefined: resolver.BuildOption
    ../../go/pkg/mod/github.com/coreos/[email protected]+incompatible/clientv3/balancer/resolver/endpoint/endpoint.go:182:31: undefined: resolver.ResolveNowOption
    # github.com/coreos/etcd/clientv3/balancer/picker
    ../../go/pkg/mod/github.com/coreos/[email protected]+incompatible/clientv3/balancer/picker/err.go:37:44: undefined: balancer.PickOptions
    ../../go/pkg/mod/github.com/coreos/[email protected]+incompatible/clientv3/balancer/picker/roundrobin_balanced.go:55:54: undefined: balancer.PickOptions
    
    1. PR:https://github.com/etcd-io/etcd/pull/11564
    area/clientv3 
    opened by eddycjy 54
  • Proxies & Config API

    Proxies & Config API

    Overview

    This pull request adds the ability for nodes to join as proxies when the cluster size limit is reached.

    Changes

    • Peer & Proxy Management added to Registry.
    • Mode added to PeerServer. This can be either PeerMode or ProxyMode.
    • JoinCommand sets overflow nodes as proxies.
    • RemoveCommand removes proxies in addition to peers.
    • Leader responses return X-Leader-Peer-URL & X-Leader-Client-URL headers.
    • New Error (402): Proxy Internal Error

    Questions

    How should we update the proxy urls?

    I would like to minimize the internal state that proxies have to hold and make them as dumb as possible. Currently it retrieves the proxy url via the initial join command. It can also update the proxy urls if the leader changes but the original leader is still available. However, it doesn't handle a leader failure.

    My thought is to simply have a new leader continually ping the proxies after leader change until all proxies have been notified.

    The other option would be to maintain a cluster configuration within the proxies but that means that we're maintaining more state.

    /cc @philips @xiangli-cmu

    opened by benbjohnson 54
  • Etcd size sometimes starts growing and grows until

    Etcd size sometimes starts growing and grows until "mvcc: database space exceeded"

    We have observed already few cases, where suddenly (after days of running a GKE cluster), the size of database starts growing.

    As an example, we have a cluster, that was running without any issues for ~2 weeks (size of database was ~16MB), and then its database started growing. The growth wasn't immediate - it took ~2days, before it reached 4GB limit and there were steps of growing. For the reference we have backups (snapshots) (done via etcdctl snapshot) that reflect the growth speed (the name contains the time when it was made)

      ... // all snapshots are roughly 16MB
      2017-05-24T04:57:24-07:00_snapshot.db 16,27 MB
      2017-05-24T05:57:26-07:00_snapshot.db 29,06 MB
      2017-05-24T06:57:30-07:00_snapshot.db 108,98 MB
      2017-05-24T07:57:36-07:00_snapshot.db 177,57 MB
      2017-05-24T08:57:51-07:00_snapshot.db 308,4 MB        
      2017-05-24T09:58:32-07:00_snapshot.db 534,54 MB
      2017-05-24T11:00:16-07:00_snapshot.db 655,73 MB
      2017-05-24T12:00:55-07:00_snapshot.db 764,22 MB
      ... // all snapshots of the same size
      2017-05-25T15:15:10-07:00_snapshot.db 764,22 MB
      2017-05-25T16:16:25-07:00_snapshot.db 818,14 MB
      2017-05-25T17:26:35-07:00_snapshot.db 963,93 MB
      ... // all snapshots of the same size
      2017-05-25T22:25:08-07:00_snapshot.db 963,93 MB
      2017-05-25T23:27:03-07:00_snapshot.db 1,56 GB
      2017-05-26T00:30:13-07:00_snapshot.db 1,56 GB
      2017-05-26T01:05:24-07:00_snapshot.db 1,56 GB
      2017-05-26T02:24:21-07:00_snapshot.db 2,18 GB
      ... // all snapshots of the same size
      2017-05-26T08:43:07-07:00_snapshot.db 2,18 GB
      2017-05-26T09:46:47-07:00_snapshot.db 2,19 GB
      ... // all snapshots of the same size
      2017-05-26T16:11:31-07:00_snapshot.db 2,19 GB
      2017-05-26T17:16:47-07:00_snapshot.db 2,65 GB
      2017-05-26T18:22:37-07:00_snapshot.db 3,12 GB
      2017-05-26T19:29:07-07:00_snapshot.db 3,86 GB
      2017-05-26T20:33:24-07:00_snapshot.db 4,6 GB
      <boom>
    

    We've checked that we were doing compaction very regularly every 5m for the whole time - so it doesn't seem to be the same as: https://github.com/coreos/etcd/issues/7944 I'm attaching the interested lines from etcd logs in etcd-compaction.txt

    [Note time in that logs are in UTC, and time in snapshot names is PST, so 7 hours difference]

    To summarize, the compaction was always at most few thousands of transactions (so it's not that we did a lot during some 5m period), though there were some longer compactions, up to ~7s.

    I started digging into individual snapshots and found some strange thing (I was using bolt)

    1. 16MB snapshot:
    Aggregate statistics for 10 buckets
    
    Page count statistics
            Number of logical branch pages: 10
            Number of physical branch overflow pages: 0
            Number of logical leaf pages: 789
            Number of physical leaf overflow pages: 518
    Tree statistics
            Number of keys/value pairs: 1667
            Number of levels in B+tree: 3
    Page size utilization
            Bytes allocated for physical branch pages: 40960
            Bytes actually used for branch data: 26494 (64%)
            Bytes allocated for physical leaf pages: 5353472
            Bytes actually used for leaf data: 3411680 (63%)
    Bucket statistics
            Total number of buckets: 10
            Total number on inlined buckets: 9 (90%)
            Bytes used for inlined buckets: 536 (0%)
    
    1. 534MB snapshot (5 hours later):
    Aggregate statistics for 10 buckets
    
    Page count statistics
            Number of logical branch pages: 65
            Number of physical branch overflow pages: 0
            Number of logical leaf pages: 5559
            Number of physical leaf overflow pages: 107743
    Tree statistics
            Number of keys/value pairs: 13073
            Number of levels in B+tree: 3
    Page size utilization
            Bytes allocated for physical branch pages: 266240
            Bytes actually used for branch data: 186912 (70%)
            Bytes allocated for physical leaf pages: 464084992
            Bytes actually used for leaf data: 451590110 (97%)
    Bucket statistics
            Total number of buckets: 10
            Total number on inlined buckets: 9 (90%)
            Bytes used for inlined buckets: 536 (0%)
    
    1. 1.56GB snapshot (another ~36 hours later):
    Aggregate statistics for 10 buckets
    
    Page count statistics
            Number of logical branch pages: 70
            Number of physical branch overflow pages: 0
            Number of logical leaf pages: 4525
            Number of physical leaf overflow pages: 115179
    Tree statistics
            Number of keys/value pairs: 10978
            Number of levels in B+tree: 3
    Page size utilization
            Bytes allocated for physical branch pages: 286720
            Bytes actually used for branch data: 152723 (53%)
            Bytes allocated for physical leaf pages: 490307584
            Bytes actually used for leaf data: 478196884 (97%)
    Bucket statistics
            Total number of buckets: 10
            Total number on inlined buckets: 9 (90%)
            Bytes used for inlined buckets: 536 (0%)
    
    1. 3.86GB snapshot (another ~18 hours later)
    Aggregate statistics for 10 buckets
    
    Page count statistics
            Number of logical branch pages: 90
            Number of physical branch overflow pages: 0
            Number of logical leaf pages: 6219
            Number of physical leaf overflow pages: 6791
    Tree statistics
            Number of keys/value pairs: 15478
            Number of levels in B+tree: 3
    Page size utilization
            Bytes allocated for physical branch pages: 368640
            Bytes actually used for branch data: 209621 (56%)
            Bytes allocated for physical leaf pages: 53288960
            Bytes actually used for leaf data: 36704465 (68%)
    Bucket statistics
            Total number of buckets: 10
            Total number on inlined buckets: 9 (90%)
            Bytes used for inlined buckets: 536 (0%)
    
    1. 4.6GB snapshot (1hour later, right before exceeding space):
    Aggregate statistics for 10 buckets
    
    Page count statistics
            Number of logical branch pages: 89
            Number of physical branch overflow pages: 0
            Number of logical leaf pages: 6074
            Number of physical leaf overflow pages: 6713
    Tree statistics
            Number of keys/value pairs: 15173
            Number of levels in B+tree: 3
    Page size utilization
            Bytes allocated for physical branch pages: 364544
            Bytes actually used for branch data: 204788 (56%)
            Bytes allocated for physical leaf pages: 52375552
            Bytes actually used for leaf data: 36092789 (68%)
    Bucket statistics
            Total number of buckets: 10
            Total number on inlined buckets: 9 (90%)
            Bytes used for inlined buckets: 564 (0%)
    

    What is extremely interesting to me is that both:

    • Number of physical leaf overflow pages
    • Bytes allocated for physical leaf pages dropped by order of magnitude in this 3.86GB snapshot, but the total size of database didn't drop

    Unfortunately I can't provide any of those snapshots due to privacy reasons, but maybe you can see anything that we can investigate (or share results of some commands) that can help with debugging?

    @xiang90 @hongchaodeng @mml @lavalamp

    opened by wojtek-t 53
  • changelog: add 3.5 item to cover the fix for last partically synced WAL record

    changelog: add 3.5 item to cover the fix for last partically synced WAL record

    Linked to https://github.com/etcd-io/etcd/pull/15069

    Signed-off-by: Benjamin Wang [email protected]

    Please read https://github.com/etcd-io/etcd/blob/main/CONTRIBUTING.md#contribution-flow.

    opened by ahrtr 1
  • [3.5] etcdserver: process the scenaro of the last WAL record being partially synced to disk

    [3.5] etcdserver: process the scenaro of the last WAL record being partially synced to disk

    Backport https://github.com/etcd-io/etcd/pull/15068 to 3.5.

    See also https://github.com/etcd-io/etcd/issues/14114#issuecomment-1373620727

    Signed-off-by: Benjamin Wang [email protected]

    opened by ahrtr 0
  • Process the case of the last WAL record being partially synced to disk

    Process the case of the last WAL record being partially synced to disk

    There is a regression in https://github.com/etcd-io/etcd/pull/14122. When the last record is only partially synced to disk, we should return io.ErrUnexpectedEOF in the error chain, otherwise etcdserver will not repair it and etcdserver will also fail to get started.

    See also https://github.com/etcd-io/etcd/issues/14114#issuecomment-1373620727

    backport/v3.5 
    opened by ahrtr 1
  • bug: One of the three etcd nodes is broken (once every two weeks)

    bug: One of the three etcd nodes is broken (once every two weeks)

    What happened?

    One of the three etcd nodes is broken (once every two weeks)

    image

    What did you expect to happen?

    Three nodes should be operating normally

    How can we reproduce it (as minimally and precisely as possible)?

    1.insatll the etcd cluster: helm upgrade etcd-release --install --create-namespace --namespace etcd --version v8.5.11 --values apisix/etcd.yaml etcd-repo/etcd 2.install the apisix: helm upgrade apisix-release --install --create-namespace --namespace apisix --version v0.11.4 --values apisix/apisix-new.values.yml apisix/apisix

    Anything else we need to know?

    this is apisix logs (24 houres) apisix_20230106A_query_data.csv

    this is etcd logs (24 houres) etcd_20230106A_query_data.csv

    Etcd version (please run commands below)

    APISIX version (run apisix version): 2.15.0 Operating system (run uname -a): Linux etcd-release-2 5.4.0-1089-azure OpenResty / Nginx version (run openresty -V or nginx -V): openresty/1.21.4.1 etcd version, if relevant (run curl http://127.0.0.1:9090/v1/server_info): helm.sh/chart:etcd-8.5.11 APISIX Dashboard version, if relevant: Plugin runner version, for issues related to plugin runners: LuaRocks version, for installation issues (run luarocks --version): 3.8.0

    k8s version : 1.24.3 in azure aks.

    Etcd configuration (command line flags or environment variables)

    @section Global parameters

    Global Docker image parameters

    Please, note that this will override the image parameters, including dependencies, configured to use the global value

    Current available global Docker image parameters: imageRegistry, imagePullSecrets and storageClass

    @param global.imageRegistry Global Docker image registry

    @param global.imagePullSecrets [array] Global Docker registry secret names as an array

    @param global.storageClass Global StorageClass for Persistent Volume(s)

    global: imageRegistry: ""

    E.g.

    imagePullSecrets:

    - myRegistryKeySecretName

    imagePullSecrets: [] storageClass: ""

    @section Common parameters

    @param kubeVersion Force target Kubernetes version (using Helm capabilities if not set)

    kubeVersion: ""

    @param nameOverride String to partially override common.names.fullname template (will maintain the release name)

    nameOverride: ""

    @param fullnameOverride String to fully override common.names.fullname template

    fullnameOverride: ""

    @param commonLabels [object] Labels to add to all deployed objects

    commonLabels: {}

    @param commonAnnotations [object] Annotations to add to all deployed objects

    commonAnnotations: {}

    @param clusterDomain Default Kubernetes cluster domain

    clusterDomain: cluster.local

    @param extraDeploy [array] Array of extra objects to deploy with the release

    extraDeploy: []

    Enable diagnostic mode in the deployment

    diagnosticMode:

    @param diagnosticMode.enabled Enable diagnostic mode (all probes will be disabled and the command will be overridden)

    enabled: false

    @param diagnosticMode.command Command to override all containers in the deployment

    command: - sleep

    @param diagnosticMode.args Args to override all containers in the deployment

    args: - infinity

    @section etcd parameters

    Bitnami etcd image version

    ref: https://hub.docker.com/r/bitnami/etcd/tags/

    @param image.registry etcd image registry

    @param image.repository etcd image name

    @param image.tag etcd image tag

    @param image.digest etcd image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag

    image: registry: docker.io repository: bitnami/etcd tag: 3.5.6-debian-11-r10 digest: ""

    @param image.pullPolicy etcd image pull policy

    Specify a imagePullPolicy

    Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent'

    ref: https://kubernetes.io/docs/user-guide/images/#pre-pulling-images

    pullPolicy: IfNotPresent

    @param image.pullSecrets [array] etcd image pull secrets

    Optionally specify an array of imagePullSecrets.

    Secrets must be manually created in the namespace.

    ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/

    e.g:

    pullSecrets:

    - myRegistryKeySecretName

    pullSecrets: []

    @param image.debug Enable image debug mode

    Set to true if you would like to see extra information on logs

    debug: false

    Authentication parameters

    auth:

    Role-based access control parameters

    ref: https://etcd.io/docs/current/op-guide/authentication/

    rbac: ## @param auth.rbac.create Switch to enable RBAC authentication ## create: true ## @param auth.rbac.allowNoneAuthentication Allow to use etcd without configuring RBAC authentication ## allowNoneAuthentication: true ## @param auth.rbac.rootPassword Root user password. The root user is always root ## rootPassword: "aVrfpSsbbVtchxgg" ## @param auth.rbac.existingSecret Name of the existing secret containing credentials for the root user ## existingSecret: "" ## @param auth.rbac.existingSecretPasswordKey Name of key containing password to be retrieved from the existing secret ## existingSecretPasswordKey: ""

    Authentication token

    ref: https://etcd.io/docs/latest/learning/design-auth-v3/#two-types-of-tokens-simple-and-jwt

    token: ## @param auth.token.type Authentication token type. Allowed values: 'simple' or 'jwt' ## ref: https://etcd.io/docs/latest/op-guide/configuration/#--auth-token ## type: jwt ## @param auth.token.privateKey.filename Name of the file containing the private key for signing the JWT token ## @param auth.token.privateKey.existingSecret Name of the existing secret containing the private key for signing the JWT token ## NOTE: Ignored if auth.token.type=simple ## NOTE: A secret containing a private key will be auto-generated if an existing one is not provided. ## privateKey: filename: jwt-token.pem existingSecret: "" ## @param auth.token.signMethod JWT token sign method ## NOTE: Ignored if auth.token.type=simple ## signMethod: RS256 ## @param auth.token.ttl JWT token TTL ## NOTE: Ignored if auth.token.type=simple ## ttl: 10m

    TLS authentication for client-to-server communications

    ref: https://etcd.io/docs/current/op-guide/security/

    client: ## @param auth.client.secureTransport Switch to encrypt client-to-server communications using TLS certificates ## secureTransport: false ## @param auth.client.useAutoTLS Switch to automatically create the TLS certificates ## useAutoTLS: false ## @param auth.client.existingSecret Name of the existing secret containing the TLS certificates for client-to-server communications ## existingSecret: "" ## @param auth.client.enableAuthentication Switch to enable host authentication using TLS certificates. Requires existing secret ## enableAuthentication: false ## @param auth.client.certFilename Name of the file containing the client certificate ## certFilename: cert.pem ## @param auth.client.certKeyFilename Name of the file containing the client certificate private key ## certKeyFilename: key.pem ## @param auth.client.caFilename Name of the file containing the client CA certificate ## If not specified and auth.client.enableAuthentication=true or auth.rbac.enabled=true, the default is is ca.crt ## caFilename: ""

    TLS authentication for server-to-server communications

    ref: https://etcd.io/docs/current/op-guide/security/

    peer: ## @param auth.peer.secureTransport Switch to encrypt server-to-server communications using TLS certificates ## secureTransport: false ## @param auth.peer.useAutoTLS Switch to automatically create the TLS certificates ## useAutoTLS: false ## @param auth.peer.existingSecret Name of the existing secret containing the TLS certificates for server-to-server communications ## existingSecret: "" ## @param auth.peer.enableAuthentication Switch to enable host authentication using TLS certificates. Requires existing secret ## enableAuthentication: false ## @param auth.peer.certFilename Name of the file containing the peer certificate ## certFilename: cert.pem ## @param auth.peer.certKeyFilename Name of the file containing the peer certificate private key ## certKeyFilename: key.pem ## @param auth.peer.caFilename Name of the file containing the peer CA certificate ## If not specified and auth.peer.enableAuthentication=true or rbac.enabled=true, the default is is ca.crt ## caFilename: ""

    @param autoCompactionMode Auto compaction mode, by default periodic. Valid values: "periodic", "revision".

    - 'periodic' for duration based retention, defaulting to hours if no time unit is provided (e.g. 5m).

    - 'revision' for revision number based retention.

    autoCompactionMode: ""

    @param autoCompactionRetention Auto compaction retention for mvcc key value store in hour, by default 0, means disabled

    autoCompactionRetention: ""

    @param initialClusterState Initial cluster state. Allowed values: 'new' or 'existing'

    If this values is not set, the default values below are set:

    - 'new': when installing the chart ('helm install ...')

    - 'existing': when upgrading the chart ('helm upgrade ...')

    initialClusterState: ""

    @param logLevel Sets the log level for the etcd process. Allowed values: 'debug', 'info', 'warn', 'error', 'panic', 'fatal'

    logLevel: "info"

    @param maxProcs Limits the number of operating system threads that can execute user-level

    Go code simultaneously by setting GOMAXPROCS environment variable

    ref: https://golang.org/pkg/runtime

    maxProcs: ""

    @param removeMemberOnContainerTermination Use a PreStop hook to remove the etcd members from the etcd cluster on container termination

    they the containers are terminated

    NOTE: Ignored if lifecycleHooks is set or replicaCount=1

    removeMemberOnContainerTermination: true

    @param configuration etcd configuration. Specify content for etcd.conf.yml

    e.g:

    configuration: |-

    foo: bar

    baz:

    configuration: ""

    @param existingConfigmap Existing ConfigMap with etcd configuration

    NOTE: When it's set the configuration parameter is ignored

    existingConfigmap: ""

    @param extraEnvVars [array] Extra environment variables to be set on etcd container

    e.g:

    extraEnvVars:

    - name: FOO

    value: "bar"

    extraEnvVars: []

    @param extraEnvVarsCM Name of existing ConfigMap containing extra env vars

    extraEnvVarsCM: ""

    @param extraEnvVarsSecret Name of existing Secret containing extra env vars

    extraEnvVarsSecret: ""

    @param command [array] Default container command (useful when using custom images)

    command: []

    @param args [array] Default container args (useful when using custom images)

    args: []

    @section etcd statefulset parameters

    @param replicaCount Number of etcd replicas to deploy

    replicaCount: 3

    Update strategy

    ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies

    @param updateStrategy.type Update strategy type, can be set to RollingUpdate or OnDelete.

    updateStrategy: type: RollingUpdate

    @param podManagementPolicy Pod management policy for the etcd statefulset

    ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#pod-management-policies

    podManagementPolicy: Parallel

    @param hostAliases [array] etcd pod host aliases

    ref: https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/

    hostAliases: []

    @param lifecycleHooks [object] Override default etcd container hooks

    lifecycleHooks: {}

    etcd container ports to open

    @param containerPorts.client Client port to expose at container level

    @param containerPorts.peer Peer port to expose at container level

    containerPorts: client: 2379 peer: 2380

    etcd pods' Security Context

    ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod

    @param podSecurityContext.enabled Enabled etcd pods' Security Context

    @param podSecurityContext.fsGroup Set etcd pod's Security Context fsGroup

    podSecurityContext: enabled: true fsGroup: 1001

    etcd containers' SecurityContext

    ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container

    @param containerSecurityContext.enabled Enabled etcd containers' Security Context

    @param containerSecurityContext.runAsUser Set etcd container's Security Context runAsUser

    @param containerSecurityContext.runAsNonRoot Set etcd container's Security Context runAsNonRoot

    @param containerSecurityContext.allowPrivilegeEscalation Force the child process to be run as nonprivilege

    containerSecurityContext: enabled: true runAsUser: 1001 runAsNonRoot: true allowPrivilegeEscalation: false

    etcd containers' resource requests and limits

    ref: https://kubernetes.io/docs/user-guide/compute-resources/

    We usually recommend not to specify default resources and to leave this as a conscious

    choice for the user. This also increases chances charts run on environments with little

    resources, such as Minikube. If you do want to specify resources, uncomment the following

    lines, adjust them as necessary, and remove the curly braces after 'resources:'.

    @param resources.limits [object] The resources limits for the etcd container

    @param resources.requests [object] The requested resources for the etcd container

    resources:

    Example:

    limits:

    cpu: 500m

    memory: 1Gi

    limits: {} requests: {}

    Configure extra options for liveness probe

    ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes

    @param livenessProbe.enabled Enable livenessProbe

    @param livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe

    @param livenessProbe.periodSeconds Period seconds for livenessProbe

    @param livenessProbe.timeoutSeconds Timeout seconds for livenessProbe

    @param livenessProbe.failureThreshold Failure threshold for livenessProbe

    @param livenessProbe.successThreshold Success threshold for livenessProbe

    livenessProbe: enabled: true initialDelaySeconds: 60 periodSeconds: 30 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5

    Configure extra options for readiness probe

    ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes

    @param readinessProbe.enabled Enable readinessProbe

    @param readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe

    @param readinessProbe.periodSeconds Period seconds for readinessProbe

    @param readinessProbe.timeoutSeconds Timeout seconds for readinessProbe

    @param readinessProbe.failureThreshold Failure threshold for readinessProbe

    @param readinessProbe.successThreshold Success threshold for readinessProbe

    readinessProbe: enabled: true initialDelaySeconds: 60 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 5

    Configure extra options for liveness probe

    ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/#configure-probes

    @param startupProbe.enabled Enable startupProbe

    @param startupProbe.initialDelaySeconds Initial delay seconds for startupProbe

    @param startupProbe.periodSeconds Period seconds for startupProbe

    @param startupProbe.timeoutSeconds Timeout seconds for startupProbe

    @param startupProbe.failureThreshold Failure threshold for startupProbe

    @param startupProbe.successThreshold Success threshold for startupProbe

    startupProbe: enabled: false initialDelaySeconds: 0 periodSeconds: 10 timeoutSeconds: 5 successThreshold: 1 failureThreshold: 60

    @param customLivenessProbe [object] Override default liveness probe

    customLivenessProbe: {}

    @param customReadinessProbe [object] Override default readiness probe

    customReadinessProbe: {}

    @param customStartupProbe [object] Override default startup probe

    customStartupProbe: {}

    @param extraVolumes [array] Optionally specify extra list of additional volumes for etcd pods

    extraVolumes: []

    @param extraVolumeMounts [array] Optionally specify extra list of additional volumeMounts for etcd container(s)

    extraVolumeMounts: []

    @param initContainers [array] Add additional init containers to the etcd pods

    e.g:

    initContainers:

    - name: your-image-name

    image: your-image

    imagePullPolicy: Always

    ports:

    - name: portname

    containerPort: 1234

    initContainers: []

    @param sidecars [array] Add additional sidecar containers to the etcd pods

    e.g:

    sidecars:

    - name: your-image-name

    image: your-image

    imagePullPolicy: Always

    ports:

    - name: portname

    containerPort: 1234

    sidecars: []

    @param podAnnotations [object] Annotations for etcd pods

    ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/

    podAnnotations: {}

    @param podLabels [object] Extra labels for etcd pods

    Ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/

    podLabels: {}

    @param podAffinityPreset Pod affinity preset. Ignored if affinity is set. Allowed values: soft or hard

    ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity

    podAffinityPreset: ""

    @param podAntiAffinityPreset Pod anti-affinity preset. Ignored if affinity is set. Allowed values: soft or hard

    Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity

    podAntiAffinityPreset: soft

    Node affinity preset

    Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity

    @param nodeAffinityPreset.type Node affinity preset type. Ignored if affinity is set. Allowed values: soft or hard

    @param nodeAffinityPreset.key Node label key to match. Ignored if affinity is set.

    @param nodeAffinityPreset.values [array] Node label values to match. Ignored if affinity is set.

    nodeAffinityPreset: type: ""

    e.g:

    key: "kubernetes.io/e2e-az-name"

    key: ""

    e.g:

    values:

    - e2e-az1

    - e2e-az2

    values: []

    @param affinity [object] Affinity for pod assignment

    Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity

    Note: podAffinityPreset, podAntiAffinityPreset, and nodeAffinityPreset will be ignored when it's set

    affinity: {}

    @param nodeSelector [object] Node labels for pod assignment

    Ref: https://kubernetes.io/docs/user-guide/node-selection/

    nodeSelector: {}

    @param tolerations [array] Tolerations for pod assignment

    Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/

    tolerations: []

    @param terminationGracePeriodSeconds Seconds the pod needs to gracefully terminate

    ref: https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/#hook-handler-execution

    terminationGracePeriodSeconds: ""

    @param schedulerName Name of the k8s scheduler (other than default)

    ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/

    schedulerName: ""

    @param priorityClassName Name of the priority class to be used by etcd pods

    Priority class needs to be created beforehand

    Ref: https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/

    priorityClassName: ""

    @param runtimeClassName Name of the runtime class to be used by pod(s)

    ref: https://kubernetes.io/docs/concepts/containers/runtime-class/

    runtimeClassName: ""

    @param topologySpreadConstraints Topology Spread Constraints for pod assignment

    https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/

    The value is evaluated as a template

    topologySpreadConstraints: []

    persistentVolumeClaimRetentionPolicy

    ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention

    @param persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of a StatefulSet

    @param persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced

    @param persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted

    persistentVolumeClaimRetentionPolicy: enabled: false whenScaled: Retain whenDeleted: Retain

    @section Traffic exposure parameters

    service:

    @param service.type Kubernetes Service type

    type: ClusterIP

    @param service.enabled create second service if equal true

    enabled: true

    @param service.clusterIP Kubernetes service Cluster IP

    e.g.:

    clusterIP: None

    clusterIP: ""

    @param service.ports.client etcd client port

    @param service.ports.peer etcd peer port

    ports: client: 2379 peer: 2380

    @param service.nodePorts.client Specify the nodePort client value for the LoadBalancer and NodePort service types.

    @param service.nodePorts.peer Specify the nodePort peer value for the LoadBalancer and NodePort service types.

    ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-nodeport

    nodePorts: client: "" peer: ""

    @param service.clientPortNameOverride etcd client port name override

    clientPortNameOverride: ""

    @param service.peerPortNameOverride etcd peer port name override

    peerPortNameOverride: ""

    @param service.loadBalancerIP loadBalancerIP for the etcd service (optional, cloud specific)

    ref: https://kubernetes.io/docs/user-guide/services/#type-loadbalancer

    loadBalancerIP: ""

    @param service.loadBalancerSourceRanges [array] Load Balancer source ranges

    ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service

    e.g:

    loadBalancerSourceRanges:

    - 10.10.10.0/24

    loadBalancerSourceRanges: []

    @param service.externalIPs [array] External IPs

    ref: https://kubernetes.io/docs/concepts/services-networking/service/#external-ips

    externalIPs: []

    @param service.externalTrafficPolicy %%MAIN_CONTAINER_NAME%% service external traffic policy

    ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip

    externalTrafficPolicy: Cluster

    @param service.extraPorts Extra ports to expose (normally used with the sidecar value)

    extraPorts: []

    @param service.annotations [object] Additional annotations for the etcd service

    annotations: {}

    @param service.sessionAffinity Session Affinity for Kubernetes service, can be "None" or "ClientIP"

    If "ClientIP", consecutive client requests will be directed to the same Pod

    ref: https://kubernetes.io/docs/concepts/services-networking/service/#virtual-ips-and-service-proxies

    sessionAffinity: None

    @param service.sessionAffinityConfig Additional settings for the sessionAffinity

    sessionAffinityConfig:

    clientIP:

    timeoutSeconds: 300

    sessionAffinityConfig: {}

    @section Persistence parameters

    Enable persistence using Persistent Volume Claims

    ref: https://kubernetes.io/docs/user-guide/persistent-volumes/

    persistence:

    @param persistence.enabled If true, use a Persistent Volume Claim. If false, use emptyDir.

    enabled: true

    @param persistence.storageClass Persistent Volume Storage Class

    If defined, storageClassName:

    If set to "-", storageClassName: "", which disables dynamic provisioning

    If undefined (the default) or set to null, no storageClassName spec is

    set, choosing the default provisioner. (gp2 on AWS, standard on

    GKE, AWS & OpenStack)

    storageClass: ""

    @param persistence.annotations [object] Annotations for the PVC

    annotations: {}

    @param persistence.accessModes Persistent Volume Access Modes

    accessModes: - ReadWriteOnce

    @param persistence.size PVC Storage Request for etcd data volume

    size: 8Gi

    @param persistence.selector [object] Selector to match an existing Persistent Volume

    ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/#selector

    selector: {}

    @section Volume Permissions parameters

    Init containers parameters:

    volumePermissions: Change the owner and group of the persistent volume mountpoint to runAsUser:fsGroup values from the securityContext section.

    volumePermissions:

    @param volumePermissions.enabled Enable init container that changes the owner and group of the persistent volume(s) mountpoint to runAsUser:fsGroup

    enabled: false

    @param volumePermissions.image.registry Init container volume-permissions image registry

    @param volumePermissions.image.repository Init container volume-permissions image name

    @param volumePermissions.image.tag Init container volume-permissions image tag

    @param volumePermissions.image.digest Init container volume-permissions image digest in the way sha256:aa.... Please note this parameter, if set, will override the tag

    image: registry: docker.io repository: bitnami/bitnami-shell tag: 11-debian-11-r63 digest: "" ## @param volumePermissions.image.pullPolicy Init container volume-permissions image pull policy ## pullPolicy: IfNotPresent ## @param volumePermissions.image.pullSecrets [array] Specify docker-registry secret names as an array ## Optionally specify an array of imagePullSecrets. ## Secrets must be manually created in the namespace. ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ ## e.g: ## pullSecrets: ## - myRegistryKeySecretName ## pullSecrets: []

    Init container' resource requests and limits

    ref: https://kubernetes.io/docs/user-guide/compute-resources/

    We usually recommend not to specify default resources and to leave this as a conscious

    choice for the user. This also increases chances charts run on environments with little

    resources, such as Minikube. If you do want to specify resources, uncomment the following

    lines, adjust them as necessary, and remove the curly braces after 'resources:'.

    @param volumePermissions.resources.limits [object] Init container volume-permissions resource limits

    @param volumePermissions.resources.requests [object] Init container volume-permissions resource requests

    resources: ## Example: ## limits: ## cpu: 500m ## memory: 1Gi ## limits: {} requests: {}

    @section Network Policy parameters

    ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/

    networkPolicy:

    @param networkPolicy.enabled Enable creation of NetworkPolicy resources

    enabled: false

    @param networkPolicy.allowExternal Don't require client label for connections

    When set to false, only pods with the correct client label will have network access to the ports

    etcd is listening on. When true, etcd will accept connections from any source

    (with the correct destination port).

    allowExternal: true

    @param networkPolicy.extraIngress [array] Add extra ingress rules to the NetworkPolicy

    e.g:

    extraIngress:

    - ports:

    - port: 1234

    from:

    - podSelector:

    - matchLabels:

    - role: frontend

    - podSelector:

    - matchExpressions:

    - key: role

    operator: In

    values:

    - frontend

    extraIngress: []

    @param networkPolicy.extraEgress [array] Add extra ingress rules to the NetworkPolicy

    e.g:

    extraEgress:

    - ports:

    - port: 1234

    to:

    - podSelector:

    - matchLabels:

    - role: frontend

    - podSelector:

    - matchExpressions:

    - key: role

    operator: In

    values:

    - frontend

    extraEgress: []

    @param networkPolicy.ingressNSMatchLabels [object] Labels to match to allow traffic from other namespaces

    @param networkPolicy.ingressNSPodMatchLabels [object] Pod labels to match to allow traffic from other namespaces

    ingressNSMatchLabels: {} ingressNSPodMatchLabels: {}

    @section Metrics parameters

    metrics:

    @param metrics.enabled Expose etcd metrics

    enabled: false

    @param metrics.podAnnotations [object] Annotations for the Prometheus metrics on etcd pods

    podAnnotations: prometheus.io/scrape: "true" prometheus.io/port: "{{ .Values.containerPorts.client }}"

    Prometheus Service Monitor

    ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#endpoint

    podMonitor: ## @param metrics.podMonitor.enabled Create PodMonitor Resource for scraping metrics using PrometheusOperator ## enabled: false ## @param metrics.podMonitor.namespace Namespace in which Prometheus is running ## namespace: monitoring ## @param metrics.podMonitor.interval Specify the interval at which metrics should be scraped ## interval: 30s ## @param metrics.podMonitor.scrapeTimeout Specify the timeout after which the scrape is ended ## scrapeTimeout: 30s ## @param metrics.podMonitor.additionalLabels [object] Additional labels that can be used so PodMonitors will be discovered by Prometheus ## ref: https://github.com/coreos/prometheus-operator/blob/master/Documentation/api.md#prometheusspec ## additionalLabels: {} ## @param metrics.podMonitor.scheme Scheme to use for scraping ## scheme: http ## @param metrics.podMonitor.tlsConfig [object] TLS configuration used for scrape endpoints used by Prometheus ## ref: https://github.com/prometheus-operator/prometheus-operator/blob/master/Documentation/api.md#tlsconfig ## e.g: ## tlsConfig: ## ca: ## secret: ## name: existingSecretName ## tlsConfig: {} ## @param metrics.podMonitor.relabelings [array] Prometheus relabeling rules ## relabelings: []

    Prometheus Operator PrometheusRule configuration

    prometheusRule: ## @param metrics.prometheusRule.enabled Create a Prometheus Operator PrometheusRule (also requires metrics.enabled to be true and metrics.prometheusRule.rules) ## enabled: false ## @param metrics.prometheusRule.namespace Namespace for the PrometheusRule Resource (defaults to the Release Namespace) ## namespace: "" ## @param metrics.prometheusRule.additionalLabels Additional labels that can be used so PrometheusRule will be discovered by Prometheus ## additionalLabels: {} ## @param metrics.prometheusRule.rules Prometheus Rule definitions # - alert: ETCD has no leader # annotations: # summary: "ETCD has no leader" # description: "pod {{{{}} $labels.pod {{}}}} state error, can't connect leader" # for: 1m # expr: etcd_server_has_leader == 0 # labels: # severity: critical # group: PaaS ## rules: []

    @section Snapshotting parameters

    Start a new etcd cluster recovering the data from an existing snapshot before bootstrapping

    startFromSnapshot:

    @param startFromSnapshot.enabled Initialize new cluster recovering an existing snapshot

    enabled: false

    @param startFromSnapshot.existingClaim Existing PVC containing the etcd snapshot

    existingClaim: ""

    @param startFromSnapshot.snapshotFilename Snapshot filename

    snapshotFilename: ""

    Enable auto disaster recovery by periodically snapshotting the keyspace:

    - It creates a cronjob to periodically snapshotting the keyspace

    - It also creates a ReadWriteMany PVC to store the snapshots

    If the cluster permanently loses more than (N-1)/2 members, it tries to

    recover itself from the last available snapshot.

    disasterRecovery:

    @param disasterRecovery.enabled Enable auto disaster recovery by periodically snapshotting the keyspace

    enabled: false cronjob: ## @param disasterRecovery.cronjob.schedule Schedule in Cron format to save snapshots ## See https://en.wikipedia.org/wiki/Cron ## schedule: "*/30 * * * *" ## @param disasterRecovery.cronjob.historyLimit Number of successful finished jobs to retain ## historyLimit: 1 ## @param disasterRecovery.cronjob.snapshotHistoryLimit Number of etcd snapshots to retain, tagged by date ## snapshotHistoryLimit: 1 ## @param disasterRecovery.cronjob.podAnnotations [object] Pod annotations for cronjob pods ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ ## podAnnotations: {} ## Configure resource requests and limits for snapshotter containers ## ref: https://kubernetes.io/docs/user-guide/compute-resources/ ## We usually recommend not to specify default resources and to leave this as a conscious ## choice for the user. This also increases chances charts run on environments with little ## resources, such as Minikube. If you do want to specify resources, uncomment the following ## lines, adjust them as necessary, and remove the curly braces after 'resources:'. ## @param disasterRecovery.cronjob.resources.limits [object] Cronjob container resource limits ## @param disasterRecovery.cronjob.resources.requests [object] Cronjob container resource requests ## resources: ## Example: ## limits: ## cpu: 500m ## memory: 1Gi ## limits: {} requests: {}

    ## @param disasterRecovery.cronjob.nodeSelector Node labels for cronjob pods assignment
    ## Ref: https://kubernetes.io/docs/user-guide/node-selection/
    ##
    nodeSelector: {}
    ## @param disasterRecovery.cronjob.tolerations Tolerations for cronjob pods assignment
    ## Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
    ##
    tolerations: []
    

    pvc: ## @param disasterRecovery.pvc.existingClaim A manually managed Persistent Volume and Claim ## If defined, PVC must be created manually before volume will be bound ## The value is evaluated as a template, so, for example, the name can depend on .Release or .Chart ## existingClaim: "" ## @param disasterRecovery.pvc.size PVC Storage Request ## size: 2Gi ## @param disasterRecovery.pvc.storageClassName Storage Class for snapshots volume ## storageClassName: nfs

    @section Service account parameters

    serviceAccount:

    @param serviceAccount.create Enable/disable service account creation

    create: false

    @param serviceAccount.name Name of the service account to create or use

    name: ""

    @param serviceAccount.automountServiceAccountToken Enable/disable auto mounting of service account token

    ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/#use-the-default-service-account-to-access-the-api-server

    automountServiceAccountToken: true

    @param serviceAccount.annotations [object] Additional annotations to be included on the service account

    annotations: {}

    @param serviceAccount.labels [object] Additional labels to be included on the service account

    labels: {}

    @section Other parameters

    etcd Pod Disruption Budget configuration

    ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/

    pdb:

    @param pdb.create Enable/disable a Pod Disruption Budget creation

    create: true

    @param pdb.minAvailable Minimum number/percentage of pods that should remain scheduled

    minAvailable: 51%

    @param pdb.maxUnavailable Maximum number/percentage of pods that may be made unavailable

    maxUnavailable: ""

    Etcd debug information (please run commands blow, feel free to obfuscate the IP address or FQDN in the output)

    $ etcdctl member list -w table
    +------------------+-----------+----------------+-------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------+------------+
    |        ID        |  STATUS   |      NAME      |                               PEER ADDRS                                |                                                      CLIENT ADDRS                                                       | IS LEARNER |
    +------------------+-----------+----------------+-------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------+------------+
    | 826365ad0defc9be |   started | etcd-release-0 | http://etcd-release-0.etcd-release-headless.etcd.svc.cluster.local:2380 | http://etcd-release-0.etcd-release-headless.etcd.svc.cluster.local:2379,http://etcd-release.etcd.svc.cluster.local:2379 |      false |
    | 8859076857b24171 |   started | etcd-release-2 | http://etcd-release-2.etcd-release-headless.etcd.svc.cluster.local:2380 | http://etcd-release-2.etcd-release-headless.etcd.svc.cluster.local:2379,http://etcd-release.etcd.svc.cluster.local:2379 |      false |
    | ea7159b25a926810 | unstarted |                | http://etcd-release-1.etcd-release-headless.etcd.svc.cluster.local:2380 |                                                                                                                         |      false |
    +------------------+-----------+----------------+-------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------+------------+
    
    $ etcdctl --endpoints=<member list> endpoint status -w table
    I have no name!@etcd-release-0:/opt/bitnami/etcd$ etcdctl --endpoints=http://etcd-release-0.etcd-release-headless.etcd.svc.cluster.local:2380  endpoint status -w table
    +-------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    |                                ENDPOINT                                 |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
    +-------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    | http://etcd-release-0.etcd-release-headless.etcd.svc.cluster.local:2380 | 826365ad0defc9be |   3.5.6 |  536 MB |     false |      false |         5 |    1380069 |            1380069 |        |
    +-------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    
    I have no name!@etcd-release-0:/opt/bitnami/etcd$ etcdctl --endpoints=http://etcd-release-2.etcd-release-headless.etcd.svc.cluster.local:2380  endpoint status -w table
    +-------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    |                                ENDPOINT                                 |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
    +-------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    | http://etcd-release-2.etcd-release-headless.etcd.svc.cluster.local:2380 | 8859076857b24171 |   3.5.6 |  536 MB |      true |      false |         5 |    1380097 |            1380097 |        |
    +-------------------------------------------------------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    
    I have no name!@etcd-release-0:/opt/bitnami/etcd$ etcdctl --endpoints=http://etcd-release-1.etcd-release-headless.etcd.svc.cluster.local:2380  endpoint status -w table
    {"level":"warn","ts":"2023-01-06T10:38:34.777Z","logger":"etcd-client","caller":"[email protected]/retry_interceptor.go:62","msg":"retrying of unary invoker failed","target":"etcd-endpoints://0xc000356a80/etcd-release-1.etcd-release-headless.etcd.svc.cluster.local:2380","attempt":0,"error":"rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \"transport: Error while dialing dial tcp 10.244.1.208:2380: connect: connection refused\""}
    Failed to get the status of endpoint http://etcd-release-1.etcd-release-headless.etcd.svc.cluster.local:2380 (context deadline exceeded)
    +----------+----+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
    +----------+----+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    +----------+----+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
    

    Relevant log output

    No response

    type/bug 
    opened by Martinprobu 2
  • Ensure DNS is looked up on boostrap

    Ensure DNS is looked up on boostrap

    PR #13224 introduced an early exit when the names match. This change restores the previous behaviour by doing an explicit DNS resolution before checking the URLs for equality.

    This is fixing https://github.com/etcd-io/etcd/issues/15062

    Signed-off-by: Thomas Jungblut [email protected]

    opened by tjungblu 0
  • `urlsEqual` might  wrongly skip resolving DNS

    `urlsEqual` might wrongly skip resolving DNS

    What happened?

    See https://github.com/etcd-io/etcd/pull/13224#discussion_r1062216483

    The correct logic should be:

    1. If the URL doesn't contains wildcard, keep current behavior; otherwise follow https://github.com/etcd-io/etcd/pull/13224#discussion_r674022785
    type/bug 
    opened by ahrtr 10
Releases(v3.4.23)
  • v3.4.23(Dec 21, 2022)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.23
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.23
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.23 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.23 \
      gcr.io/etcd-development/etcd:v3.4.23 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.23 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.23 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.23 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.23 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.23 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.23-darwin-amd64.zip(25.81 MB)
    etcd-v3.4.23-linux-amd64.tar.gz(14.82 MB)
    etcd-v3.4.23-linux-arm64.tar.gz(13.72 MB)
    etcd-v3.4.23-linux-ppc64le.tar.gz(13.26 MB)
    etcd-v3.4.23-windows-amd64.zip(15.13 MB)
    SHA256SUMS(489 bytes)
  • v3.5.6(Nov 21, 2022)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.6
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.6
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.6 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.6 \
      gcr.io/etcd-development/etcd:v3.5.6 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.6 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.6 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.6 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.6 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.6 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.6-darwin-amd64.zip(19.49 MB)
    etcd-v3.5.6-darwin-arm64.zip(18.94 MB)
    etcd-v3.5.6-linux-amd64.tar.gz(18.58 MB)
    etcd-v3.5.6-linux-arm64.tar.gz(16.70 MB)
    etcd-v3.5.6-linux-ppc64le.tar.gz(16.11 MB)
    etcd-v3.5.6-linux-s390x.tar.gz(17.87 MB)
    etcd-v3.5.6-windows-amd64.zip(18.81 MB)
    SHA256SUMS(676 bytes)
  • v3.4.22(Nov 2, 2022)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.22
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.22
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.22 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.22 \
      gcr.io/etcd-development/etcd:v3.4.22 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.22 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.22 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.22 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.22 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.22 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.22-darwin-amd64.zip(24.37 MB)
    etcd-v3.4.22-linux-amd64.tar.gz(14.50 MB)
    etcd-v3.4.22-linux-arm64.tar.gz(13.29 MB)
    etcd-v3.4.22-linux-ppc64le.tar.gz(12.93 MB)
    etcd-v3.4.22-windows-amd64.zip(14.84 MB)
    SHA256SUMS(489 bytes)
  • v3.5.5(Sep 15, 2022)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.5
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.5
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.5 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.5 \
      gcr.io/etcd-development/etcd:v3.5.5 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.5 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.5 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.5 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.5 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.5 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.5-darwin-amd64.zip(34.04 MB)
    etcd-v3.5.5-darwin-arm64.zip(33.33 MB)
    etcd-v3.5.5-linux-amd64.tar.gz(18.58 MB)
    etcd-v3.5.5-linux-arm64.tar.gz(16.70 MB)
    etcd-v3.5.5-linux-ppc64le.tar.gz(16.10 MB)
    etcd-v3.5.5-linux-s390x.tar.gz(17.87 MB)
    etcd-v3.5.5-windows-amd64.zip(18.80 MB)
    SHA256SUMS(676 bytes)
  • v3.4.21(Sep 15, 2022)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.21
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.21
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.21 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.21 \
      gcr.io/etcd-development/etcd:v3.4.21 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.21 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.21 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.21 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.21 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.21 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.21-darwin-amd64.zip(24.35 MB)
    etcd-v3.4.21-linux-amd64.tar.gz(14.49 MB)
    etcd-v3.4.21-linux-arm64.tar.gz(13.28 MB)
    etcd-v3.4.21-linux-ppc64le.tar.gz(12.93 MB)
    etcd-v3.4.21-windows-amd64.zip(14.83 MB)
    SHA256SUMS(489 bytes)
  • v3.4.20(Aug 5, 2022)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.20
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.20
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.20 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.20 \
      gcr.io/etcd-development/etcd:v3.4.20 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.20 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.20 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.20 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.20 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.20 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.20-darwin-amd64.zip(24.35 MB)
    etcd-v3.4.20-linux-amd64.tar.gz(14.49 MB)
    etcd-v3.4.20-linux-arm64.tar.gz(13.28 MB)
    etcd-v3.4.20-linux-ppc64le.tar.gz(12.92 MB)
    etcd-v3.4.20-windows-amd64.zip(14.83 MB)
    SHA256SUMS(489 bytes)
  • v3.4.19(Jul 12, 2022)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.19
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.19
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.19 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.19 \
      gcr.io/etcd-development/etcd:v3.4.19 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.19 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.19 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.19 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.19 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.19 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.19-darwin-amd64.zip(24.23 MB)
    etcd-v3.4.19-linux-amd64.tar.gz(14.42 MB)
    etcd-v3.4.19-linux-arm64.tar.gz(13.22 MB)
    etcd-v3.4.19-linux-ppc64le.tar.gz(12.86 MB)
    etcd-v3.4.19-windows-amd64.zip(14.76 MB)
    SHA256SUMS(489 bytes)
  • v3.5.4(Apr 24, 2022)

    Please see Announcing etcd 3.5 blog post.

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.4
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.4
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.4 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.4 \
      gcr.io/etcd-development/etcd:v3.5.4 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.4 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.4 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.4 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.4 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.4 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.4 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.4-darwin-amd64.zip(33.82 MB)
    etcd-v3.5.4-linux-amd64.tar.gz(18.53 MB)
    etcd-v3.5.4-linux-arm64.tar.gz(16.66 MB)
    etcd-v3.5.4-linux-ppc64le.tar.gz(16.06 MB)
    etcd-v3.5.4-linux-s390x.tar.gz(17.82 MB)
    etcd-v3.5.4-windows-amd64.zip(18.75 MB)
    SHA256SUMS(581 bytes)
  • v3.5.3(Apr 13, 2022)

    Highlights:

    • Version 3.5.3 is fixing critical correctness issues (https://github.com/etcd-io/etcd/issues/13766, https://github.com/etcd-io/etcd/issues/13514) introduced in the 3.5 branch that could lead to not applying a committed transaction across all replicas in case of a server crash.
    • It's likely 3.5.4 will be releases soon that reverts SRV change added to 3.5.3. Please see the discussion (https://github.com/etcd-io/etcd/issues/13948)

    Please see Announcing etcd 3.5 blog post.

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.3
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.3
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.3 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.3 \
      gcr.io/etcd-development/etcd:v3.5.3 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.3 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.3-darwin-amd64.zip(33.84 MB)
    etcd-v3.5.3-linux-amd64.tar.gz(18.54 MB)
    etcd-v3.5.3-linux-arm64.tar.gz(16.67 MB)
    etcd-v3.5.3-linux-ppc64le.tar.gz(16.08 MB)
    etcd-v3.5.3-linux-s390x.tar.gz(17.84 MB)
    etcd-v3.5.3-windows-amd64.zip(18.77 MB)
    SHA256SUMS(581 bytes)
  • v3.5.2(Feb 1, 2022)

    This release is no longer recommended for production. Please use v3.4 minor until v3.5.3 is released. Read more in https://github.com/etcd-io/etcd/tree/main/CHANGELOG.

    Please see Announcing etcd 3.5 blog post.

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.2
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.2
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.2 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.2 \
      gcr.io/etcd-development/etcd:v3.5.2 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.2 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.2 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.2 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.2 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.2 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.2 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.2-darwin-amd64.zip(33.80 MB)
    etcd-v3.5.2-linux-amd64.tar.gz(18.50 MB)
    etcd-v3.5.2-linux-arm64.tar.gz(16.63 MB)
    etcd-v3.5.2-linux-ppc64le.tar.gz(16.03 MB)
    etcd-v3.5.2-linux-s390x.tar.gz(17.79 MB)
    etcd-v3.5.2-windows-amd64.zip(18.72 MB)
    SHA256SUMS(581 bytes)
  • v3.5.1(Oct 15, 2021)

    This release is no longer recommended for production. Please use v3.4 minor until v3.5.3 is released. Read more in https://github.com/etcd-io/etcd/tree/main/CHANGELOG.

    Please see Announcing etcd 3.5 blog post.

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.1
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.1
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    

    ####### Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.1 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.1 \
      gcr.io/etcd-development/etcd:v3.5.1 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.1 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.1 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.1 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.1 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.1 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.1 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.1-darwin-amd64.zip(33.79 MB)
    etcd-v3.5.1-linux-amd64.tar.gz(18.50 MB)
    etcd-v3.5.1-linux-arm64.tar.gz(16.62 MB)
    etcd-v3.5.1-linux-ppc64le.tar.gz(16.03 MB)
    etcd-v3.5.1-linux-s390x.tar.gz(17.79 MB)
    etcd-v3.5.1-windows-amd64.zip(18.72 MB)
    SHA256SUMS(581 bytes)
  • v3.4.18(Oct 15, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.18
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.18
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.18 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.18 \
      gcr.io/etcd-development/etcd:v3.4.18 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.18 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.18 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.18 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.18 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.18 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.18-darwin-amd64.zip(26.86 MB)
    etcd-v3.4.18-linux-amd64.tar.gz(16.60 MB)
    etcd-v3.4.18-linux-arm64.tar.gz(15.39 MB)
    etcd-v3.4.18-linux-ppc64le.tar.gz(15.20 MB)
    etcd-v3.4.18-windows-amd64.zip(16.57 MB)
    SHA256SUMS(489 bytes)
  • v3.3.27(Oct 15, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.3.27
    
    # 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
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.3.27
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.3.27 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.3.27 \
      gcr.io/etcd-development/etcd:v3.3.27 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.3.27 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.3.27 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.3.27 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.3.27 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.3.27 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.3.27-darwin-amd64.zip(23.50 MB)
    etcd-v3.3.27-linux-amd64.tar.gz(13.61 MB)
    etcd-v3.3.27-linux-arm64.tar.gz(12.49 MB)
    etcd-v3.3.27-linux-ppc64le.tar.gz(12.29 MB)
    etcd-v3.3.27-windows-amd64.zip(13.55 MB)
    SHA256SUMS(489 bytes)
  • v3.4.17(Oct 4, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.17
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.17
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.17 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.17 \
      gcr.io/etcd-development/etcd:v3.4.17 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.17 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.17 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.17 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.17 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.17 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.17-darwin-amd64.zip(26.86 MB)
    etcd-v3.4.17-linux-amd64.tar.gz(16.60 MB)
    etcd-v3.4.17-linux-arm64.tar.gz(15.39 MB)
    etcd-v3.4.17-linux-ppc64le.tar.gz(15.20 MB)
    etcd-v3.4.17-windows-amd64.zip(16.58 MB)
    SHA256SUMS(489 bytes)
  • v3.3.26(Oct 4, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.3.26
    
    # 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
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.3.26
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.3.26 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.3.26 \
      gcr.io/etcd-development/etcd:v3.3.26 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.3.26 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.3.26 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.3.26 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.3.26 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.3.26 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.3.26-darwin-amd64.zip(23.50 MB)
    etcd-v3.3.26-linux-amd64.tar.gz(13.61 MB)
    etcd-v3.3.26-linux-arm64.tar.gz(12.49 MB)
    etcd-v3.3.26-linux-ppc64le.tar.gz(12.29 MB)
    etcd-v3.3.26-windows-amd64.zip(13.55 MB)
    SHA256SUMS(489 bytes)
  • v3.5.0(Jun 15, 2021)

    This release is no longer recommended for production. Please use v3.4 minor until v3.5.3 is released. Read more in https://github.com/etcd-io/etcd/tree/main/CHANGELOG.

    Please see Announcing etcd 3.5 blog post.

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.0
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.0
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    

    ####### Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.0 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.0 \
      gcr.io/etcd-development/etcd:v3.5.0 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.0 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.0 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.0 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.0 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.0 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.0 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.0-darwin-amd64.zip(33.77 MB)
    etcd-v3.5.0-linux-amd64.tar.gz(18.49 MB)
    etcd-v3.5.0-linux-arm64.tar.gz(16.61 MB)
    etcd-v3.5.0-linux-ppc64le.tar.gz(16.02 MB)
    etcd-v3.5.0-linux-s390x.tar.gz(17.78 MB)
    etcd-v3.5.0-windows-amd64.zip(18.71 MB)
    SHA256SUMS(581 bytes)
  • v3.5.0-rc.1(Jun 9, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.0-rc.1
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.0-rc.1
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.0-rc.1 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.0-rc.1 \
      gcr.io/etcd-development/etcd:v3.5.0-rc.1 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.0-rc.1 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.0-rc.1 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.0-rc.1 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.0-rc.1 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.0-rc.1 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.0-rc.1 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.0-rc.1-darwin-amd64.zip(33.77 MB)
    etcd-v3.5.0-rc.1-linux-amd64.tar.gz(18.49 MB)
    etcd-v3.5.0-rc.1-linux-arm64.tar.gz(16.61 MB)
    etcd-v3.5.0-rc.1-linux-ppc64le.tar.gz(16.02 MB)
    etcd-v3.5.0-rc.1-linux-s390x.tar.gz(17.78 MB)
    etcd-v3.5.0-rc.1-windows-amd64.zip(18.71 MB)
    SHA256SUMS(611 bytes)
  • v3.5.0-rc.0(Jun 4, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.0-rc.0
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.0-rc.0
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.0-rc.0 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.0-rc.0 \
      gcr.io/etcd-development/etcd:v3.5.0-rc.0 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.0-rc.0 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.0-rc.0 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.0-rc.0 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.0-rc.0 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.0-rc.0 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.0-rc.0 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.0-rc.0-darwin-amd64.zip(33.77 MB)
    etcd-v3.5.0-rc.0-linux-amd64.tar.gz(18.48 MB)
    etcd-v3.5.0-rc.0-linux-arm64.tar.gz(16.61 MB)
    etcd-v3.5.0-rc.0-linux-ppc64le.tar.gz(16.02 MB)
    etcd-v3.5.0-rc.0-linux-s390x.tar.gz(17.78 MB)
    etcd-v3.5.0-rc.0-windows-amd64.zip(18.71 MB)
    SHA256SUMS(611 bytes)
  • v3.5.0-beta.4(May 26, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.0-beta.4
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.0-beta.4
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.0-beta.4 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.0-beta.4 \
      gcr.io/etcd-development/etcd:v3.5.0-beta.4 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.0-beta.4 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.0-beta.4 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.0-beta.4 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.0-beta.4 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.0-beta.4 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.0-beta.4 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.0-beta.4-darwin-amd64.zip(33.76 MB)
    etcd-v3.5.0-beta.4-linux-amd64.tar.gz(18.47 MB)
    etcd-v3.5.0-beta.4-linux-arm64.tar.gz(16.60 MB)
    etcd-v3.5.0-beta.4-linux-ppc64le.tar.gz(16.01 MB)
    etcd-v3.5.0-beta.4-linux-s390x.tar.gz(17.78 MB)
    etcd-v3.5.0-beta.4-windows-amd64.zip(18.70 MB)
    SHA256SUMS(623 bytes)
  • v3.5.0-beta.3(May 18, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.0-beta.3
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.0-beta.3
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.0-beta.3 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.0-beta.3 \
      gcr.io/etcd-development/etcd:v3.5.0-beta.3 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.0-beta.3 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.0-beta.3 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.0-beta.3 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.0-beta.3 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.0-beta.3 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.0-beta.3 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.0-beta.3-darwin-amd64.zip(33.74 MB)
    etcd-v3.5.0-beta.3-linux-amd64.tar.gz(18.47 MB)
    etcd-v3.5.0-beta.3-linux-arm64.tar.gz(16.60 MB)
    etcd-v3.5.0-beta.3-linux-ppc64le.tar.gz(16.01 MB)
    etcd-v3.5.0-beta.3-linux-s390x.tar.gz(17.77 MB)
    etcd-v3.5.0-beta.3-windows-amd64.zip(18.69 MB)
    SHA256SUMS(623 bytes)
  • v3.5.0-beta.1(May 18, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.5.0-beta.1
    
    # 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
    /tmp/etcd-download-test/etcdutl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.5.0-beta.1
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    /tmp/etcd-download-test/etcdutl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.5.0-beta.1 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.5.0-beta.1 \
      gcr.io/etcd-development/etcd:v3.5.0-beta.1 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.5.0-beta.1 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.5.0-beta.1 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.5.0-beta.1 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.5.0-beta.1 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.5.0-beta.1 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    docker exec etcd-gcr-v3.5.0-beta.1 /bin/sh -c "/usr/local/bin/etcdutl version"
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.0-beta.1-darwin-amd64.zip(33.75 MB)
    etcd-v3.5.0-beta.1-linux-amd64.tar.gz(18.47 MB)
    etcd-v3.5.0-beta.1-linux-arm64.tar.gz(16.60 MB)
    etcd-v3.5.0-beta.1-linux-ppc64le.tar.gz(16.01 MB)
    etcd-v3.5.0-beta.1-linux-s390x.tar.gz(17.77 MB)
    etcd-v3.5.0-beta.1-windows-amd64.zip(18.69 MB)
    SHA256SUMS(623 bytes)
  • v3.4.16(May 12, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.16
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.16
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.16 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.16 \
      gcr.io/etcd-development/etcd:v3.4.16 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.16 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.16 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.16 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.16 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.16 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.16-darwin-amd64.zip(26.85 MB)
    etcd-v3.4.16-linux-amd64.tar.gz(16.60 MB)
    etcd-v3.4.16-linux-arm64.tar.gz(15.39 MB)
    etcd-v3.4.16-linux-ppc64le.tar.gz(15.19 MB)
    etcd-v3.4.16-windows-amd64.zip(16.57 MB)
    SHA256SUMS(489 bytes)
  • v3.2.32(Mar 28, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.2.32
    
    # choose either URL
    GOOGLE_URL=https://storage.googleapis.com/etcd
    GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
    DOWNLOAD_URL=${GITHUB_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
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.2.32
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.2.32 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.2.32 \
      gcr.io/etcd-development/etcd:v3.2.32 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new
    
    docker exec etcd-gcr-v3.2.32 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.2.32 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.2.32 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.2.32 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.2.32 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.2.32-darwin-amd64.zip(22.63 MB)
    etcd-v3.2.32-linux-amd64.tar.gz(12.92 MB)
    etcd-v3.2.32-linux-arm64.tar.gz(11.84 MB)
    etcd-v3.2.32-linux-ppc64le.tar.gz(11.68 MB)
    etcd-v3.2.32-windows-amd64.zip(12.86 MB)
    SHA256SUMS(489 bytes)
  • v3.4.15(Feb 26, 2021)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Note

    Initially the tarballs were pushed without *.tar.gz artifacts (see https://github.com/etcd-io/etcd/issues/12734#issuecomment-804006322). The new version of gziped artifacts were added on 2021-03-22, but (most-likely) due to different gzip version, the SHA256 checksum changed. The original SHA256SUMS was renamed to SHA256SUMS.old and the new version of SHA256SUMS file was pushed.

    Linux
    ETCD_VER=v3.4.15
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.15
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.15 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.15 \
      gcr.io/etcd-development/etcd:v3.4.15 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.15 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.15 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.15 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.15 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.15 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.15-darwin-amd64.zip(26.84 MB)
    etcd-v3.4.15-linux-amd64.tar(44.74 MB)
    etcd-v3.4.15-linux-amd64.tar.gz(16.59 MB)
    etcd-v3.4.15-linux-arm64.tar(43.03 MB)
    etcd-v3.4.15-linux-arm64.tar.gz(15.38 MB)
    etcd-v3.4.15-linux-ppc64le.tar(43.73 MB)
    etcd-v3.4.15-linux-ppc64le.tar.gz(15.19 MB)
    etcd-v3.4.15-windows-amd64.zip(16.56 MB)
    SHA256SUMS(487 bytes)
    SHA256SUMS.old(489 bytes)
  • v3.5.0-alpha.0(Feb 25, 2021)

    v3.5.0-alpha.0 is an experimental release in order to:

    • test the "modularized" release process
    • enable integration testing with the modularized code of 3.5.x.

    See https://github.com/etcd-io/etcd/issues/12498 for more context.

    Source code(tar.gz)
    Source code(zip)
    etcd-v3.5.0-alpha.0-darwin-amd64.zip(22.97 MB)
    etcd-v3.5.0-alpha.0-linux-amd64.tar.gz(12.57 MB)
    etcd-v3.5.0-alpha.0-linux-arm64.tar.gz(11.33 MB)
    etcd-v3.5.0-alpha.0-linux-ppc64le.tar.gz(10.99 MB)
    etcd-v3.5.0-alpha.0-linux-s390x.tar.gz(12.14 MB)
    etcd-v3.5.0-alpha.0-windows-amd64.zip(12.63 MB)
  • v3.4.14(Nov 25, 2020)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.14 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.14 \
      gcr.io/etcd-development/etcd:v3.4.14 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.14 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.14 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.14 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.14 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.14 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.14-darwin-amd64.zip(26.80 MB)
    etcd-v3.4.14-linux-amd64.tar.gz(16.56 MB)
    etcd-v3.4.14-linux-arm64.tar.gz(15.36 MB)
    etcd-v3.4.14-linux-ppc64le.tar.gz(15.16 MB)
    etcd-v3.4.14-windows-amd64.zip(16.54 MB)
    SHA256SUMS(489 bytes)
  • v3.4.13(Aug 24, 2020)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.13
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.13
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.13 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.13 \
      gcr.io/etcd-development/etcd:v3.4.13 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.13 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.13 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.13 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.13 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.13 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.13-darwin-amd64.zip(26.80 MB)
    etcd-v3.4.13-linux-amd64.tar.gz(16.56 MB)
    etcd-v3.4.13-linux-arm64.tar.gz(15.36 MB)
    etcd-v3.4.13-linux-ppc64le.tar.gz(15.16 MB)
    etcd-v3.4.13-windows-amd64.zip(16.54 MB)
    SHA256SUMS(489 bytes)
  • v3.3.25(Aug 24, 2020)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.3.25
    
    # 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
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.3.25
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.3.25 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.3.25 \
      gcr.io/etcd-development/etcd:v3.3.25 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.3.25 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.3.25 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.3.25 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.3.25 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.3.25 /bin/sh -c "ETCDCTL_API=3 /usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.3.25-darwin-amd64.zip(23.49 MB)
    etcd-v3.3.25-linux-amd64.tar.gz(13.60 MB)
    etcd-v3.3.25-linux-arm64.tar.gz(12.48 MB)
    etcd-v3.3.25-linux-ppc64le.tar.gz(12.29 MB)
    etcd-v3.3.25-windows-amd64.zip(13.55 MB)
    SHA256SUMS(489 bytes)
  • v3.4.12(Aug 19, 2020)

    Please check out CHANGELOG for a full list of changes. And make sure to read upgrade guide before upgrading etcd (there may be breaking changes).

    For installation guides, please check out play.etcd.io and operating etcd. Latest support status for common architectures and operating systems can be found at supported platforms.

    Linux
    ETCD_VER=v3.4.12
    
    # 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
    
    # start a local etcd server
    /tmp/etcd-download-test/etcd
    
    # write,read to etcd
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
    /tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo
    
    macOS (Darwin)
    ETCD_VER=v3.4.12
    
    # 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}-darwin-amd64.zip
    rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test
    
    curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-darwin-amd64.zip -o /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    unzip /tmp/etcd-${ETCD_VER}-darwin-amd64.zip -d /tmp && rm -f /tmp/etcd-${ETCD_VER}-darwin-amd64.zip
    mv /tmp/etcd-${ETCD_VER}-darwin-amd64/* /tmp/etcd-download-test && rm -rf mv /tmp/etcd-${ETCD_VER}-darwin-amd64
    
    /tmp/etcd-download-test/etcd --version
    /tmp/etcd-download-test/etcdctl version
    
    Docker

    etcd uses gcr.io/etcd-development/etcd as a primary container registry, and quay.io/coreos/etcd as secondary.

    rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
      docker rmi gcr.io/etcd-development/etcd:v3.4.12 || true && \
      docker run \
      -p 2379:2379 \
      -p 2380:2380 \
      --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
      --name etcd-gcr-v3.4.12 \
      gcr.io/etcd-development/etcd:v3.4.12 \
      /usr/local/bin/etcd \
      --name s1 \
      --data-dir /etcd-data \
      --listen-client-urls http://0.0.0.0:2379 \
      --advertise-client-urls http://0.0.0.0:2379 \
      --listen-peer-urls http://0.0.0.0:2380 \
      --initial-advertise-peer-urls http://0.0.0.0:2380 \
      --initial-cluster s1=http://0.0.0.0:2380 \
      --initial-cluster-token tkn \
      --initial-cluster-state new \
      --log-level info \
      --logger zap \
      --log-outputs stderr
    
    docker exec etcd-gcr-v3.4.12 /bin/sh -c "/usr/local/bin/etcd --version"
    docker exec etcd-gcr-v3.4.12 /bin/sh -c "/usr/local/bin/etcdctl version"
    docker exec etcd-gcr-v3.4.12 /bin/sh -c "/usr/local/bin/etcdctl endpoint health"
    docker exec etcd-gcr-v3.4.12 /bin/sh -c "/usr/local/bin/etcdctl put foo bar"
    docker exec etcd-gcr-v3.4.12 /bin/sh -c "/usr/local/bin/etcdctl get foo"
    
    Source code(tar.gz)
    Source code(zip)
    etcd-v3.4.12-darwin-amd64.zip(26.80 MB)
    etcd-v3.4.12-linux-amd64.tar.gz(16.56 MB)
    etcd-v3.4.12-linux-arm64.tar.gz(15.36 MB)
    etcd-v3.4.12-linux-ppc64le.tar.gz(15.16 MB)
    etcd-v3.4.12-windows-amd64.zip(16.54 MB)
    SHA256SUMS(489 bytes)
Owner
etcd-io
etcd Development and Communities
etcd-io
A distributed key-value store. On Disk. Able to grow or shrink without service interruption.

Vasto A distributed high-performance key-value store. On Disk. Eventual consistent. HA. Able to grow or shrink without service interruption. Vasto sca

Chris Lu 246 Jan 6, 2023
A distributed key value store in under 1000 lines. Used in production at comma.ai

minikeyvalue Fed up with the complexity of distributed filesystems? minikeyvalue is a ~1000 line distributed key value store, with support for replica

George Hotz 2.5k Jan 9, 2023
A simple, fast, embeddable, persistent key/value store written in pure Go. It supports fully serializable transactions and many data structures such as list, set, sorted set.

NutsDB English | 简体中文 NutsDB is a simple, fast, embeddable and persistent key/value store written in pure Go. It supports fully serializable transacti

徐佳军 2.7k Jan 1, 2023
Membin is an in-memory database that can be stored on disk. Data model smiliar to key-value but values store as JSON byte array.

Membin Docs | Contributing | License What is Membin? The Membin database system is in-memory database smiliar to key-value databases, target to effici

Membin 3 Jun 3, 2021
🔑A high performance Key/Value store written in Go with a predictable read/write performance and high throughput. Uses a Bitcask on-disk layout (LSM+WAL) similar to Riak.

bitcask A high performance Key/Value store written in Go with a predictable read/write performance and high throughput. Uses a Bitcask on-disk layout

James Mills 10 Sep 26, 2022
A disk-backed key-value store.

What is diskv? Diskv (disk-vee) is a simple, persistent key-value store written in the Go language. It starts with an incredibly simple API for storin

Peter Bourgon 1.2k Jan 7, 2023
An in-memory key:value store/cache (similar to Memcached) library for Go, suitable for single-machine applications.

go-cache go-cache is an in-memory key:value store/cache similar to memcached that is suitable for applications running on a single machine. Its major

Patrick Mylund Nielsen 6.8k Dec 29, 2022
Embedded key-value store for read-heavy workloads written in Go

Pogreb Pogreb is an embedded key-value store for read-heavy workloads written in Go. Key characteristics 100% Go. Optimized for fast random lookups an

Artem Krylysov 1k Jan 3, 2023
Fast and simple key/value store written using Go's standard library

Table of Contents Description Usage Cookbook Disadvantages Motivation Benchmarks Test 1 Test 4 Description Package pudge is a fast and simple key/valu

Vadim Kulibaba 331 Nov 17, 2022
Low-level key/value store in pure Go.

Description Package slowpoke is a simple key/value store written using Go's standard library only. Keys are stored in memory (with persistence), value

Vadim Kulibaba 100 Jan 2, 2023
Key-value store for temporary items :memo:

Tempdb TempDB is Redis-backed temporary key-value store for Go. Useful for storing temporary data such as login codes, authentication tokens, and temp

Rafael Jesus 17 Sep 26, 2022
a key-value store with multiple backends including leveldb, badgerdb, postgresql

Overview goukv is an abstraction layer for golang based key-value stores, it is easy to add any backend provider. Available Providers badgerdb: Badger

Mohammed Al Ashaal 52 Jan 5, 2023
A minimalistic in-memory key value store.

A minimalistic in-memory key value store. Overview You can think of Kiwi as thread safe global variables. This kind of library comes in helpful when y

SDSLabs 159 Dec 6, 2021
A simple Git Notes Key Value store

Gino Keva - Git Notes Key Values Gino Keva works as a simple Key Value store built on top of Git Notes, using an event sourcing architecture. Events a

Philips Software 24 Aug 14, 2022
Simple key value database that use json files to store the database

KValDB Simple key value database that use json files to store the database, the key and the respective value. This simple database have two gRPC metho

Francisco Santos 0 Nov 13, 2021
A rest-api that works with golang as an in-memory key value store

Rest API Service in GOLANG A rest-api that works with golang as an in-memory key value store Usage Run command below in terminal in project directory.

sercan aydın 0 Dec 6, 2021
Eagle - Eagle is a fast and strongly encrypted key-value store written in pure Golang.

EagleDB EagleDB is a fast and simple key-value store written in Golang. It has been designed for handling an exaggerated read/write workload, which su

null 9 Dec 10, 2022
A SQLite-based hierarchical key-value store written in Go

camellia ?? A lightweight hierarchical key-value store camellia is a Go library that implements a simple, hierarchical, persistent key-value store, ba

Valerio De Benedetto 32 Nov 9, 2022
Nipo is a powerful, fast, multi-thread, clustered and in-memory key-value database, with ability to configure token and acl on commands and key-regexes written by GO

Welcome to NIPO Nipo is a powerful, fast, multi-thread, clustered and in-memory key-value database, with ability to configure token and acl on command

Morteza Bashsiz 17 Dec 28, 2022