Skip to content

Instantly share code, notes, and snippets.

@chenchun
Last active June 21, 2022 09:35
Show Gist options
  • Save chenchun/e7b517ec54c110b4bb18ea7925ba33da to your computer and use it in GitHub Desktop.
Save chenchun/e7b517ec54c110b4bb18ea7925ba33da to your computer and use it in GitHub Desktop.
#etcd

v2 http api https://coreos.com/etcd/docs/latest/v2/api.html

etcd compaction https://github.com/coreos/etcd/blob/master/Documentation/op-guide/maintenance.md#space-quota

The followings are v3 apis

put/get

export ETCDCTL_API=3

$ etcdctl put foo bar         # revision = 2
$ etcdctl put foo1 bar1       # revision = 3
$ etcdctl put foo bar_new     # revision = 4
$ etcdctl put foo1 bar1_new   # revision = 5

$ etcdctl get foo foo9 # 访问 key 的最新版本
foo
bar_new
foo1
bar1_new

$ etcdctl get --rev=4 foo foo9 # 访问 key 的修订版本4
foo
bar_new
foo1
bar1

$ etcdctl get --rev=3 foo foo9 # 访问 key 的修订版本3
foo
bar
foo1
bar1

$ etcdctl get --rev=2 foo foo9 # 访问 key 的修订版本2
foo
bar

$ etcdctl get --rev=1 foo foo9 # 访问 key 的修订版本1

watch

etcdctl put foo bar         # revision = 2
etcdctl put foo1 bar1       # revision = 3
etcdctl put foo bar_new     # revision = 4
etcdctl put foo1 bar1_new   # revision = 5

# 从修订版本 2 开始观察key `foo` 的改动
$ etcdctl watch --rev=2 foo
PUT
foo
bar
PUT
foo
bar_new

# 从修订版本 3 开始观察key `foo` 的改动
$ etcdctl watch --rev=3 foo
PUT
foo
bar_new

compact

$ etcdctl compact 5
compacted revision 5

# 在压缩修订版本之前的任何修订版本都不可访问
$ etcdctl get --rev=4 foo
Error:  rpc error: code = 11 desc = etcdserver: mvcc: required revision has been compacted

lease

应用可以为 etcd 集群里面的 key 授予租约。当 key 被附加到租约时,它的生存时间被绑定到租约的生存时间,而租约的生存时间相应的被 time-to-live (TTL)管理。 租约的实际 TTL 值是不低于最小 TTL,由 etcd 集群选择。一旦租约的 TTL 到期,租约就过期并且所有附带的 key 都将被删除。 lease是etcd v3为了解决多个key使用相同的TTL而定义的新对象

# 授予租约,TTL为10秒
$ etcdctl lease grant 10
lease 32695410dcc0ca06 granted with TTL(10s)

# 附加key foo到租约32695410dcc0ca06
$ etcdctl put --lease=32695410dcc0ca06 foo bar
OK

这是撤销同一个租约的命令:
$ etcdctl lease revoke 32695410dcc0ca06
lease 32695410dcc0ca06 revoked

$ etcdctl get foo
# 空应答,因为租约撤销导致foo被删除

这是维持同一个租约的命令:
$ etcdctl lease keep-alive 32695410dcc0ca0
lease 32695410dcc0ca0 keepalived with TTL(100)
lease 32695410dcc0ca0 keepalived with TTL(100)
lease 32695410dcc0ca0 keepalived with TTL(100)
...
注: 上面的这个命令中,etcdctl 不是单次续约,而是 etcdctl 会一直不断的发送请求来维持这个租约。

etcdctl --endpoints=http://10.151.139.99:4001 get /sh_idc_windyliucluster/pods/windyliu1/ianlang-nat-99

https

ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/certs/kube-apiserver-etcd-ca.crt --cert=/etc/kubernetes/certs/kube-apiserver-etcd-client.crt --key=/etc/kubernetes/certs/kube-apiserver-etcd-client.key --endpoints=https://10.0.0.1:2379,https://10.0.0.2:2379,https://10.0.0.3:2379  --write-out=table endpoint status

del

delete recursively

./etcdctl --endpoints=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 del /cls-aw0czlx9  --prefix
# kube-apiserver --help | grep -i prefix
--etcd-prefix string                                      The prefix to prepend to all resource paths in etcd. (default "/registry")
      
etcdctl --endpoints=10.0.0.2:4001 get --prefix --keys-only /registry

/registry/apiextensions.k8s.io/customresourcedefinitions/tapps.gs.io
/registry/apiregistration.k8s.io/apiservices/v1.networking.k8s.io
/registry/configmaps/default/ipinfo
/registry/deployments/default/dep1
/registry/events/default/node1.15461f386afb2147
/registry/minions/node1
/registry/namespaces/kube-system
/registry/pods/default/dep1-575bb7f79d-4wndv
/registry/priorityclasses/system-cluster-critical
/registry/ranges/servicenodeports
/registry/replicasets/default/dep1-575bb7f79d
/registry/resourcequotas/default/object-counts
/registry/services/specs/default/hello
/registry/services/endpoints/default/hello
/registry/serviceaccounts/kube-system/default

etcdctl elect:

https://coreos.com/etcd/docs/latest/demo.html

https://github.com/coreos/etcd/blob/master/etcdctl/README.md

zookeeper leader elect && distribute lock

https://zookeeper.apache.org/doc/trunk/recipes.html#sc_leaderElection

Algorithm

The leader election algorithm here is based on top of the atomic in-order insertion strategy documented by ZooKeeper.

How do we do this specifically in etcd?

  1. POST to /leader/key to perform atomic insertion of this node's membership.
  2. GET /leader/key?sorted=true to read back out the current membership info.
  3. If our membership is lowest sorted entry, this node is elected master.
  4. Otherwise, use etcd to watch the entry sorted immediately before this node, waiting for it to drop off. If it does, start from step 2.
  5. Perdiodically (TTL divided by 2) refresh our membership key to ensure it stays active.
ETCDCTL_API=3 etcdctl --endpoints http://tbds-10-238-8-48:4001,http://tbds-10-238-4-172:4001,http://tbds-10-240-123-33:4001 --write-out=table endpoint status
# etcd can be set to automatically compact the keyspace with the --auto-compaction option with a period of hours:
# keep one hour of history
--auto-compaction-retention=1

 If the keyspace's backend database for any member exceeds the space quota, etcd raises a cluster-wide alarm that puts the cluster into a maintenance mode which only accepts key reads and deletes. Only after freeing enough space in the keyspace and defragmenting the backend database, along with clearing the space quota alarm can the cluster resume normal operation.
--quota-backend-bytes=$((100*1024*1024*1024))

# high disk io, do defrag
ETCDCTL_API=3 etcdctl --endpoints=http://172.18.0.4:4001,http://172.18.0.5:4001,http://172.18.0.6:4001 defrag
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment