安装 etcdctl

ETCD_VERSION="v3.5.5"
ETCD_URL="https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz"
curl -sL ${ETCD_URL} | sudo tar -zxv --strip-components=1 -C /usr/local/bin

etcdctl 命令

k3s 里面的 etcd 需要一些配置,我会将这个下面的内容放到一个文件里,然后使用这个文件操作 etcd

ETCDCTL_API=3 etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt \
  --cert=/var/lib/rancher/k3s/server/tls/etcd/server-client.crt \
  --key=/var/lib/rancher/k3s/server/tls/etcd/server-client.key \
  $@

在 server 节点上添加上面的 shell,然后就可以使用 etcdctl 命令了。比如查看 etcd 节点 bash ./etcd.sh member list

member list

查看注册上来的节点,但是并一定表示注册的就可用

endpoint status

查看 leader

日志

在 k3s 里可以这么查看 etcd 的日志

journalctl -u k3s | grep etcd

报错

Mar 13 15:54:43 HKG-A-MY9G0EJ13HOVZXPH k3s[224040]: {"level":"warn","ts":"2025-03-13T15:54:43.444648+0800","caller":"etcdserver/util.go:170","msg":"apply request took too long","took":"1.999898891s","expected-duration":"100ms","prefix":"read-only range ","request":"key:\"/registry/health\" ","response":"","error":"context deadline exceeded"}

这里是 etcd 处理请求超时了。

  • apply request took too long:etcd 处理请求的时间过长。
  • took:"1.999898891s":实际处理时间为 1.999 秒。
  • expected-duration:"100ms":预期处理时间为 100 毫秒。
  • prefix:"read-only range ":这是一个只读请求。
  • request:"key:\"/registry/health\" ":请求的键是 /registry/health
  • error:"context deadline exceeded":请求超时,因为处理时间超过了上下文设置的截止时间。

修改 /etc/rancher/k3s/config.yaml

etcd-arg:
  - "--log-level=debug"
  - "--election-timeout=5000"
  - "--heartbeat-interval=500"
  - "--request-timeout=10s"

etcd 新节点被拒绝

Mar 17 01:09:23 HKG-A-MY9G0EJ13HOVZXPH k3s[290994]: {"level":"warn","ts":"2025-03-17T01:09:23.6942go:247] "Successfully synced" key="vvps1"48+0800","caller":"embed/config_logging.go:170","msg":"rejected connection on peer endpoint","remogo:247] "Successfully synced" key="v"te-addr":"146.56.142.1:45440","server-name":"v","error":"local error: tls: bad rec48+0800","caller":"embed/config_logging.go:170","msg":"rejected connection on peer endpoint","remoteord MAC"}   


这是什么意思

查看集群状态

etcdctl endpoint status --cluster -w table