ETCD 是一个高可用的分布式键值数据库,可用于服务发现。ETCD 采用 raft 一致性算法,基于 Go 语言实现。
本次安装etcd集群是为了方便下次安装Kubernetes v1.16
做准备的,由于资源有限以接下来的实验都将会在这三台机器上实现。
系统规划
192.168.18.71 c7-node1 master节点
192.168.18.72 c7-node2 node节点
192.168.18.73 c7-node3 node节点
机器配置
IP地址 | CPU | 内存 |
---|---|---|
192.168.18.71 | 8核 | 28G |
192.168.18.72 | 12核 | 32G |
192.168.18.73 | 12核 | 64G |
硬件资源有限将就一下就好了。
系统版本
[root@c7-node1 yum.repos.d]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[root@c7-node1 yum.repos.d]# uname -r
3.10.0-1062.el7.x86_64
安装依赖包
yum install -y net-tools conntrack-tools wget vim ntpdate libseccomp libtool-ltdl lrzsz yum-utils ntp
关闭 Selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
开放防火墙端口
firewall-cmd --add-port={2379,2380}/tcp --permanent
firewall-cmd --reload
配置hosts文件解析
#此处作为Master节点
cat >>/etc/hosts<<EOF
192.168.18.71 c7-node1
192.168.18.72 c7-node2
192.168.18.73 c7-node3
EOF
配置系统的文件描述符打开数量
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
echo "* soft nproc 65536" >> /etc/security/limits.conf
echo "* hard nproc 65536" >> /etc/security/limits.conf
echo "* soft memlock unlimited" >> /etc/security/limits.conf
echo "* hard memlock unlimited" >> /etc/security/limits.conf
配置时间同步
启动自动同步时间:
timedatectl set-ntp yes #此处可用yes,no,1或0
配置时区:
timedatectl set-timezone Asia/Shanghai
系统免密认证
ssh-copy-id c7-node1
ssh-copy-id c7-node2
ssh-copy-id c7-node3
安装Etcd集群环境
由于只有三台机器所以每台机器上都安装etcd, 本次通过二进制包安装,以下操作在每个需要etcd
服务的机器上都要执行。
本文记录时etcd最新的版本为:v3.4.1
下载最新版本的二进制包
curl -s https://api.github.com/repos/etcd-io/etcd/releases/latest \ | grep browser_download_url \ | grep linux-amd64 \ | cut -d '"' -f 4 \ | wget -qi -
如果要下载指定的版本可以这样操作
curl -s https://api.github.com/repos/etcd-io/etcd/releases \ | grep v3.4.1 \ | grep browser_download_url \ | grep linux-amd64 \ | cut -d '"' -f 4 \ | wget -qi -
解压安装
tar xf etcd-v3.4.1-linux-amd64.tar.gz cd etcd-v3.4.1-linux-amd64 cp etcd etcdctl /usr/bin/
添加户用和组
groupadd --system etcd useradd -s /sbin/nologin --system -g etcd etcd
添加目录并授权
mkdir -p /var/lib/etcd/ chown -R etcd:etcd /var/lib/etcd/
添加几个环境变量
INT_NAME="ens192" #注意这里,每个机器的网卡号不同 ETCD_HOST_IP=$(ip addr show $INT_NAME | grep "inet\b" | awk '{print $2}' | cut -d/ -f1) ETCD_NAME=$(hostname -s)
添加启动服务etcd.service
cat <<EOF | sudo tee /etc/systemd/system/etcd.service [Unit] Description=etcd service Documentation=https://github.com/etcd-io/etcd [Service] Type=notify User=etcd ExecStart=/usr/bin/etcd \\ --name ${ETCD_NAME} \\ --data-dir=/var/lib/etcd \\ --initial-advertise-peer-urls http://${ETCD_HOST_IP}:2380 \\ --listen-peer-urls http://${ETCD_HOST_IP}:2380 \\ --listen-client-urls http://${ETCD_HOST_IP}:2379,http://127.0.0.1:2379 \\ --advertise-client-urls http://${ETCD_HOST_IP}:2379 \\ --initial-cluster-token etcd-cluster-0 \\ --initial-cluster c7-node1=http://c7-node1:2380,c7-node2=http://c7-node2:2380,c7-node3=http://c7-node3:2380 \\ --initial-cluster-state new \ [Install] WantedBy=multi-user.target EOF
启动服务
systemctl enable etcd systemctl start etcd
几个常用的命令
检查集群中的成员列表。
etcdctl member list
通过API方式查看版本信息
curl -L "-w \n" http://127.0.0.1:2379/version
通过快照方式备份etcd
etcdctl snapshot save snapshot.db
还原集群[需要每个成员都执行相同操作]
etcdctl snapshot restore snapshot.db
查看备份文件中的信息
etcdctl --write-out=table snapshot status snapshot.db
碎片整理[服务运行时]
服务运行中操作
etcdctl defrag --cluster
服务未运行时操作[数据目录]
etcdctl defrag --data-dir <path-to-etcd-data-dir>
查看节点信息
etcdctl endpoint
查看单个节点的信息
健康信息
etcdctl endpoint health
状态信息
etcdctl endpoint status
Hash历史记录
etcdctl endpoint hashkv
查看集群的信息
etcdctl endpoint --cluster=true status etcdctl endpoint --cluster=true health etcdctl endpoint --cluster=true hashkv
以表格形式输出[直观]
etcdctl --write-out=table --cluster=true endpoint status
写操作[put]
etcdctl put foo python
读操作[get]
直接获取,会返回Key,和Value
etcdctl get foo #指定输出格式[fields,json,table,simple,protobuf],默认simple etcdctl -w fields get foo
输出指定前缀
etcdctl get foo --prefix
限制返回数量[limit]返回2条记录
etcdctl get --prefix --limit=2 foo
查询当前集群中所有的数据
etcdctl get --from-key ""
删除[del]
etcdctl del foo
删除以[foo]前缀的Key
etcdctl del foo --prefix
监听指定前缀的key变化[watch]
etcdctl watch foo --prefix
租约[lease]
创建一个租约300秒[过期后会自动删除]
[root@c7-node1 ~]# etcdctl lease grant 300 lease 44c26d7b2af0b125 granted with TTL(300s)
查看集群中的租约列表[list]
etcdctl lease list
查看指定租约的过期时间[timetolive]
[root@c7-node1 ~]# etcdctl lease timetolive 44c26d7b2af0b125 lease 44c26d7b2af0b125 granted with TTL(300s), remaining(194s)
删除指定的租约[revoke]
etcdctl lease revoke [租约的ID]
续约[keep-alive]
etcdctl lease keep-alive [租约的ID]
绑定一个Key在租约上,租约到期Key就会自动删除
etcdctl put foo val2 --lease=694d5765fc71500b
用户权限操作
角色操作
查看角色列表
etcdctl role list
添加角色[角色没有密码;它仅定义了一组新的访问权限]
etcdctl role add test
给角色添加权[只有readwrite时才同时有读写操作]
write :写操作
etcdctl role grant-permission test write /foo
read :读操作
etcdctl role grant-permission test read /foo
readwrite读写操作
etcdctl role grant-permission test readwrite /foo
对指定前缀的Key授权
etcdctl role grant-permission test --prefix=true read /foo/
删除角色
etcdctl delete [角色名称]
移除角色中的授权
etcdctl role revoke-permission test /foo
用户操作
查看用户列表[list]
etcdctl user list
添加用户[会要求输入密码]
etcdctl user add swper
查看用户的权限
etcdctl user get swper
授权用户角色权限[swper为用户名,test为角色名]
etcdctl user grant-role swper test
移除用户权限
etcdctl user revoke-role swper test
修改密码
etcdctl user passwd swper [ 新密码]
启用身份验证
创建root管理员用户
etcdctl user add root
当创建完上面的管理员帐号后再启动认证,不然没有权限
etcdctl auth enable #当执行上面命令时就会自动创建一个role组为root的角色权限
启动验证后需要带上认证才可以获取信息
etcdctl --user root --password abcd123 get foo #也可以这样写: etcdctl get foo --user root:abcd123
禁用验证
关闭验证需要管理员帐号
etcdctl --user root:abcd123 auth disable
备注
本次实验中Etcd服务将不使用身份验证。