ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

3.2.1etcd数据库

2021-07-25 15:33:00  阅读:250  来源: 互联网

标签:1etcd service ## 数据库 sudo -- 3.2 etcd etcdctl


一直有这个冲动,

想知道kubernetes往etcd里放了哪些数据,是如何组织的。

能看到,才有把握知道它的实现和细节。

找了很多文档,终于找到靠谱的。

我是使用kubeadm工具安装的集群,要解除集群的资源占用要先把一些容器停掉,把kube-apiserver的编排文件从/etc/kubernetes/manifests/目录下先移出来,kubelet检查到会停止相应的pods,没有了kube-apiserver集群不会再创建新的pods,这时kubectl不可用了,使用docker命令把spinnaker项目的容器都删掉系统资源就能空闲出来。这时etcd还是正常的,用docker工具直接进入etcd。
操作etcd有命令行工具etcdctl,有两个api版本互不兼容的,系统默认的v2版本,kubernetes集群使用的是v3版本,v2版本下是看不到v3版本的数据的,我也是找了些资料才了解这个情况。
使用环境变量定义api版本

#设置etcdctl为v3版本
export ETCDCTL_API=3

#设置etcd的端点信息,即etcd集群的ip:port,以逗号分隔
export ETCDCTL_ENDPOINTS=https://192.168.31.71:2379,https://192.168.31.72:2379,https://192.168.31.73:2379

#设置证书的环境变量
export ETCDCTL_CACERT=/opt/etcd/ssl/ca.pem
export ETCDCTL_CERT=/opt/etcd/ssl/server.pem 
export ETCDCTL_KEY=/opt/etcd/ssl/server-key.pem 

etcd有目录结构类似linux文件系统,获取所有key看一看:

etcdctl get / --prefix --keys-only

*一看就可以大概理解kubenetes的数据结构了,查询命名空间下所有部署的数据:

etcdctl get /registry/deployments/default --prefix --keys-only

把想删除的删掉,列如:
etcdctl del /registry/deployments/default/elevated-dragonfly-spinn-front50
删除deployments,pods这可以了,稍微减少一些资源,让kube-apiserver可以正常工作即可,其它资源还可以使用kubectl工具删除
删掉些资源后退出etcd把kube-apiserver的编排文件放回/etc/kubernetes/manifests目录,服务会再次启动,然后再清理重新部署。

查看etcd版本

etcdctl version

是一个开源的分布式键值对数据库,他的每一个节点都有一份数据的copy,当有节点故障时保证了高可用性。etcd使用Raft算法来保证一致性。

  第一次接触etcd是在学习k8s时。k8s用etcd做的服务发现。后来在开发一个分布式系统时需要用到服务发现,就想试一下用etcd做服务发现。效果还是很不错的。

  这篇讲一下etcd集群的搭建和使用。

集群的节点个数和容错

  官方推荐的集群个数为奇数个,如图当节点为3个和为4个时的容错都是1, 节点5个和6个时,容错为2...

img

  集群的节点越多,容错性会越强,但是数据的同步份数也会越多,写性能会变差一些。合理的集群大小,就是平衡容错性和可写性。

安装集群

  准备三台服务器  

192.168.31.71 etcd0
192.168.31.72 etcd1
192.168.31.73 etcd2

  分别在三台服务器上下载etcd。这里下载的是版本3.3.8

ETCD_VER=v3.3.8

GITHUB_URL=https://github.com/coreos/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

img

img

 然后将两个文件都放到系统可执行目录 /usr/local/bin/ 或 /usr/bin/

cd /tmp/etcd-download-test
sudo cp etcd* /usr/local/bin/

 创建一个文件夹用来保存etcd的数据

sudo mkdir -p /data/etcd
sudo chown -R root:$(whoami) /data/etcd
sudo chmod -R a+rw /data/etcd

  在这里我使用static方式去搭建服务。

  编写systemd服务文件,分别在每台机器上编写服务文件:

cat > /tmp/etcd0.service <<EOF
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
Conflicts=etcd.service
Conflicts=etcd2.service

[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0

ExecStart=/usr/local/bin/etcd --name etcd0 \
--data-dir /data/etcd \
--initial-advertise-peer-urls http://172.31.43.166:2380 \
--listen-peer-urls http://172.31.43.166:2380 \
--listen-client-urls http://172.31.43.166:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://172.31.43.166:2379 \
--initial-cluster-token etcd-cluster-pro \
--initial-cluster etcd0=http://172.31.43.166:2380,etcd1=http://172.31.43.114:2380,etcd2=http://172.31.34.237:2380 \
--initial-cluster-state new
[Install]
WantedBy=multi-user.target
EOF
sudo mv /tmp/etcd0.service /etc/systemd/system/etcd0.service
cat > /tmp/etcd1.service <<EOF
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
Conflicts=etcd.service
Conflicts=etcd2.service

[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0

ExecStart=/usr/local/bin/etcd --name etcd1 \
--data-dir /data/etcd \
--initial-advertise-peer-urls http://172.31.43.114:2380 \
--listen-peer-urls http://172.31.43.114:2380 \
--listen-client-urls http://172.31.43.114:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://172.31.43.114:2379 \
--initial-cluster-token etcd-cluster-pro \
--initial-cluster etcd0=http://172.31.43.166:2380,etcd1=http://172.31.43.114:2380,etcd2=http://172.31.34.237:2380 \
--initial-cluster-state new

[Install]
WantedBy=multi-user.target
EOF
sudo mv /tmp/etcd1.service /etc/systemd/system/etcd1.service
cat > /tmp/etcd2.service <<EOF
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
Conflicts=etcd.service

[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0

ExecStart=/usr/local/bin/etcd -name etcd2 \
  --data-dir /data/etcd \
  --initial-advertise-peer-urls http://172.31.34.237:2380 \
  --listen-peer-urls http://172.31.34.237:2380 \
  --listen-client-urls http://172.31.34.237:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://172.31.34.237:2379 \
  --initial-cluster-token etcd-cluster-pro \
  --initial-cluster etcd0=http://172.31.43.166:2380,etcd1=http://172.31.43.114:2380,etcd2=http://172.31.34.237:2380 \
  --initial-cluster-state new

[Install]
WantedBy=multi-user.target
EOF
sudo mv /tmp/etcd2.service /etc/systemd/system/etcd2.service

  

下面是一些常用配置选项的说明:

--name:方便理解的节点名称,默认为 default,在集群中应该保持唯一
--data-dir:服务运行数据保存的路径,默认为 ${name}.etcd
--snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
--heartbeat-interval:leader 多久发送一次心跳到 followers。默认值是 100ms
--eletion-timeout:重新投票的超时时间,如果follower在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
--listen-peer-urls:和同伴通信的地址,比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost
--advertise-client-urls:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
--listen-client-urls:对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和etcd交互
--initial-advertise-peer-urls:该节点同伴监听地址,这个值会告诉集群中其他节点
--initial-cluster:集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。需要注意的是,这里的 node1 是节点的--name指定的名字;后面的ip1:2380 是--initial-advertise-peer-urls 指定的值
--initial-cluster-state:新建集群的时候,这个值为 new;假如已经存在的集群,这个值为existing
--initial-cluster-token:创建集群的token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误

  所有以--init开头的配置都是在第一次启动etcd集群的时候才会用到,后续节点的重启会被忽略,如--initial-cluseter参数。所以当成功初始化了一个etcd集群以后,就不再需要这个参数或环境变量了。

  如果服务已经运行过就要把修改 --initial-cluster-state 为existing

  启用服务

sudo systemctl daemon-reload
sudo systemctl enable etcd0.service
sudo systemctl start etcd0.service


sudo systemctl daemon-reload
sudo systemctl enable etcd1.service
sudo systemctl start etcd1.service

sudo systemctl daemon-reload
sudo systemctl enable etcd2.service
sudo systemctl start etcd2.service

查看 log:

sudo systemctl status etcd0.service -l --no-pager
sudo journalctl -u etcd0.service -l --no-pager|less
sudo journalctl -f -u etcd0.service


sudo systemctl status etcd1.service -l --no-pager
sudo journalctl -u etcd1.service -l --no-pager|less
sudo journalctl -f -u etcd1service


sudo systemctl status etcd2.service -l --no-pager
sudo journalctl -u etcd2.service -l --no-pager|less
sudo journalctl -f -u etcd2.service

暂停

sudo systemctl stop etcd0.service
sudo systemctl disable etcd0.service

sudo systemctl stop etcd1.service
sudo systemctl disable etcd1.service

sudo systemctl stop etcd2.service
sudo systemctl disable etcd2.service

使用etcd

我使用的etcd的api为v3版本。在使用命令时需要在前面加上ETCDCTL_API=3

 如:查看集群成员

ETCDCTL_API=3 etcdctl member list

img

可以看到有3个节点在线

集群状态

etcdctl  endpoint status  --write-out="table"

img

操作数据

使用put和get命令可以保存和得到数据.del删除数据

img

根据前缀查询

 ETCDCTL_API=3 etcdctl put test1 a
 ETCDCTL_API=3 etcdctl put test2 b
 ETCDCTL_API=3 etcdctl put test3 c
 ETCDCTL_API=3 etcdctl get --prefix test

img

查询所有数据

ETCDCTL_API=3 etcdctl get --from-key ""

img

watch 监听

watch 会监听key的变动 有变动时会在输出。这也正是服务发现需要使用的。

我们监听 test键,然后对test执行修改和删除操作

ETCDCTL_API=3 etcdctl watch test

img

ETCDCTL_API=3 etcdctl put test abcde
ETCDCTL_API=3 etcdctl put test aaaa
 ETCDCTL_API=3 etcdctl del test

lead 租约

etcd可以为key设置超时时间,但与redis不同,etcd需要先创建lease,然后使用put命令加上参数–lease=

img

ETCDCTL_API=3 lease grant ttl 创建lease,返回lease ID ttl秒
ETCDCTL_API=3 lease revoke leaseId 删除lease,并删除所有关联的key
ETCDCTL_API=3 lease timetolive leaseId 取得lease的总时间和剩余时间
ETCDCTL_API=3 lease keep-alive leaseId keep-alive会不间断的刷新lease时间,从而保证lease不会过期。

分布式锁

使用lock命令后加锁名称 做分布式锁,如果没有显示释放锁,其他地方只能等待。

etcdctl --endpoints=$ENDPOINTS lock mutex1

# 在另一个终端输入
etcdctl --endpoints=$ENDPOINTS lock mutex1

img

/ # etcd --version
etcd Version: 3.3.8
Git SHA: 33245c6b5
Go Version: go1.9.7
Go OS/Arch: linux/amd64
/ # etcdctl --help
NAME:
        etcdctl - A simple command line client for etcd3.

USAGE:
        etcdctl

VERSION:
        3.2.10

API VERSION:
        3.2


COMMANDS:
        get                     Gets the key or a range of keys
                                #获取键或键的范围

        put                     Puts the given key into the store
                                ##将给定的键放入存储

        del                     Removes the specified key or range of keys [key, range_end)
                                ##删除指定的键或键范围[key, range_end)

        txn                     Txn processes all the requests in one transaction
                                ## txn在一个事务中处理所有请求

        compaction              Compacts the event history in etcd
                                ## 将etcd中的事件历史记录压缩

        alarm disarm            Disarms all alarms
                                ##解除所有警报

        alarm list              Lists all alarms
                                ##告警列表列出所有告警信息

        defrag                  Defragments the storage of the etcd members with given endpoints
                                ##整理碎片整理具有给定端点的etcd成员的存储碎片

        endpoint health         Checks the healthiness of endpoints specified in `--endpoints` flag
                                ##端点运行状况检查“--endpoints”标志中指定的端点的运行状况

        endpoint status         Prints out the status of endpoints specified in `--endpoints` flag
                                ##端点状态打印'——endpoints '标志中指定的端点状态

        watch                   Watches events stream on keys or prefixes
                                ##监视键或前缀上的事件流

        version                 Prints the version of etcdctl
                                ##version打印etcdctl的版本

        lease grant             Creates leases
                                ## 批地租约创建租约

        lease revoke            Revokes leases
                                ##lease revoke撤消租赁

        lease timetolive        Get lease information
                                ## lease timetolive获取租赁信息

        lease keep-alive        Keeps leases alive (renew)
                                ##lease keep-alive使租约保持有效(更新)

        member add              Adds a member into the cluster
                                ##成员添加向集群中添加一个成员

        member remove           Removes a member from the cluster
                                ##成员移除从集群中移除一个成员

        member update           Updates a member in the cluster
                                ##成员更新更新集群中的成员

        member list             Lists all members in the cluster
                                ##列出集群中的所有成员

        snapshot save           Stores an etcd node backend snapshot to a given file
                                ##将etcd节点后端快照存储到给定文件

        snapshot restore        Restores an etcd member snapshot to an etcd directory
                                ##将etcd成员快照恢复到etcd目录

        snapshot status         Gets backend snapshot status of a given file
                                ##获取给定文件的后端快照状态

        make-mirror             Makes a mirror at the destination etcd cluster
                                ##在目标etcd集群上做一个镜像

        migrate                 Migrates keys in a v2 store to a mvcc store
                                ##将v2存储中的键迁移到mvcc存储中

        lock                    Acquires a named lock
                                ##获取一个命名的锁

        elect                   Observes and participates in leader election
                                ##观察并参与领导人选举

        auth enable             Enables authentication
                                ##启用认证功能

        auth disable            Disables authentication
                                ##禁用认证

        user add                Adds a new user
                                ##添加一个新用户

        user delete             Deletes a user
                                ##删除用户

        user get                Gets detailed information of a user
                                ##获取用户的详细信息

        user list               Lists all users
                                ##列出所有用户

        user passwd             Changes password of user
                                ##修改用户密码

        user grant-role         Grants a role to a user
                                ##授予用户角色

        user revoke-role        Revokes a role from a user
                                ##取消用户的角色

        role add                Adds a new role
                                ##添加新角色

        role delete             Deletes a role
                                ##删除角色

        role get                Gets detailed information of a role
                                ##t获取角色的详细信息

        role list               Lists all roles
                                ##列出所有角色

        role grant-permission   Grants a key to a role
                                ##向角色授予密钥

        role revoke-permission  Revokes a key from a role
                                ##从角色中取消密钥

        check perf              Check the performance of the etcd cluster
                                ##检查etcd集群的性能

        help                    Help about any command
                                ##帮助关于任何命令的帮助

OPTIONS:
      --cacert=""                               verify certificates of TLS-enabled secure servers using this CA bundle
                                                ##使用这个CA bundle验证启用tls的安全服务器的证书

      --cert=""                                 identify secure client using this TLS certificate file
                                                ##使用此TLS证书文件识别安全客户端

      --command-timeout=5s                      timeout for short running command (excluding dial timeout)
                                                ##短运行命令超时时间(不包括拨号超时时间)

      --debug[=false]                           enable client-side debug logging
                                                ##启用客户端调试日志记录

      --dial-timeout=2s                         dial timeout for client connections
                                                ##客户端连接拨号超时时间

      --endpoints=[127.0.0.1:2379]              gRPC endpoints
                                                ##gRPC端点

      --hex[=false]                             print byte strings as hex encoded strings
                                                ##将字节字符串打印为十六进制编码的字符串

      --insecure-skip-tls-verify[=false]        skip server certificate erification
                                                ##跳过服务器证书验证

      --insecure-transport[=true]               disable transport security for client connections
                                                ##禁用客户端连接的传输安全性

      --key=""                                  identify secure client using this TLS key file
                                                ##使用此TLS密钥文件识别安全客户端

      --user=""                                 username[:password] for authentication (prompt if password is not supplied)
                                                ##用户名[:密码]用于认证(提示如果不提供密码)

      -w, --write-out="simple"                  set the output format (fields, json, protobuf, simple, table)
                                                ##设置输出格式(fields, json, protobuf, simple, table)

标签:1etcd,service,##,数据库,sudo,--,3.2,etcd,etcdctl
来源: https://www.cnblogs.com/syuee/p/15057907.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有