一、etcd介绍

我们在集群中的所有操作,包括创建一个pod、删除一个pod等信息都会保存在etcd数据库中

使用etcd,一般情况下也是搭建一个etcd的集群,多个节点来工作
例如有三个节点的etcd(etcd1、etcd2、etcd3),所有节点之间都需要同步数据,他们之间通信使用Raft协议(端口默认为2380)
多个etcd节点将会选举出一个节点作为leader,其余的作为follower,当这个leader出现了问题,其余节点的状态会变为candidate(候选人),重新选举出一个leader
leader一般负责写数据,follower一般负责读数据(监听客户端的端口默认为2379)

某客户端程序访问etcd,需知道所有etcd节点的访问地址,程序会自动选择作为leader的etcd来进行通信
在这里插入图片描述

二、etcd配置文件介绍

etcd的配置文件为 /etc/etcd/etcd.conf
相关参数介绍:

ETCD_NAME:节点名称,默认为default
ETCD_DATA_DIR:服务运行数据保存的路径
ETCD_LISTEN_PEER_URLS:监听的同伴通信的地址,比如http://ip:2380,如果有多个,使用逗号分隔,需要所有节点都能够访问,所以不要使用localhost
ETCD_LISTEN_CLIENT_URLS:监听的客户端服务地址
ETCD_ADVERTISE_CLIENT_URLS:对外公告的该节点客户端监听地址,这个值会告诉集群中的其他节点
ETCD_INITIAL_ADVERTISE_PEER_URLS:对外公告的该节点同伴监听地址,这个值会告诉集群中其他节点
ETCD_INITIAL_CLUSTER:集群中所有节点的信息
ETCD_INITIAL_CLUSTER_STATE:新建集群的时候,这个值为new,假如后面有节点想加入一个已经存在的集群,这个值为existing
ETCD_INITIAL_CLUSTER_TOKEN:集群的ID,多个集群的时候,每个集群的ID必须保持唯一,集群内每个etcd节点的token必须保持一致

三、搭建单节点的etcd环境,及基本操作(独立于k8s环境,作为一个客户端)

(1)搭建环境

实验环境:一台CentOS7虚拟机(192.168.26.91)
安装etcd

yum install etcd -y

修改etcd配置文件 /etc/etcd/etcd.conf
将相应参数值修改为如下:

#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.26.91:2380,http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.26.91:2379,http://localhost:2379"
ETCD_NAME="default"
#[Clustering]
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.26.91:2379,http://localhost:2379"

启动etcd

systemctl start etcd

显示所有etcd节点

etcdctl member list

若没有指定连接到哪个etcd服务器(节点)上----则默认是连接到本机(127.0.0.1)
若要连接到远端的etcd服务器,则输入:

etcdctl --endponits http://192.168.26.91:2379 ls /

往etcd里需要写数据的时候,2个版本:v2,v3
使用etcdctl这个客户端的时候默认使用v2版,可以通过定义变量的方式改为使用v3版:export ETCDCTL_API=3
若使用v3版本的话,所有的数据都是以键值对的格式存储
v3版本中读写数据

#写数据
etcdctl put [name] [value]
#读数据
etcdctl get [name]
#删除数据
etcdctl del [name]

(2)数据备份和恢复

备份:有时候突然断电,电脑关机了,会导致etcd的数据不同步,就会造成kube-apiserver等组件无法正常运行,因此若提前备份好了数据,就可以尝试恢复

创建快照

etcdctl snapshot save [xxx.data]

恢复快照
步骤一:停止etcd服务

systemctl stop etcd

步骤二:删除etcd数据所在目录(即配置文件中指定ETCD_DATA_DIR)

rm -rf /var/lib/etcd/default.etcd

步骤三:恢复etcd数据到指定目录(步骤二中删除的目录)

etcdctl snapshot restore [xxx.data] --name="dafault" --data-dir="var/lib/etcd"

步骤四:修改恢复出来的目录的所有者、所属组

chown -R etcd.etcd /var/lib/etcd

步骤五:启动etcd

systemctl start etcd

四、etcd集群(多节点etcd)(独立于k8s环境,作为一个客户端)

对于单节点etcd,若这个etcd出现了故障,那么整个环境中etcd就不能使用了,没有了etcd,对于集群内master来说是处于崩溃的状态

(1)搭建环境

实验环境:三台CentOS7虚拟机(192.168.26.91、192.168.26.92、192.168.26.93)
原先192.168.26.91配置了一个单节点的etcd,那么这里需要先停止etcd,并删除原来的数据,否则会报错

systemctl stop etcd
rm -rf /var/lib/etcd/*

所有节点中都安装etcd

yum install etcd -y

编辑每个etcd节点的配置文件,先在节点91修改,然后直接复制到92、93做相应修改

vim /etc/etcd/etcd.conf

内容如下:

#节点192.168.26.91
ETCD_DATA_DIR="/var/lib/etcd/cluster.etcd"
ETCD_LISTEN_PEER_URLS="http://192.168.26.91:2380,http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.26.91:2379,http://localhost:2379"
ETCD_NAME="etcd-91"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.26.91:2380"
ETCD_ADVERISE_CLIENT_URLS="http://localhost:2379,http://192.168.26.91:2379"
ETCD_INITIAL_CLUSTER="etcd-91=http://192.168.26.91:2380,etcd-92=http://192.168.26.92:2380,etcd-93=http://192.168.26.93:2380" #初始化集群信息,所有的etcd节点名及地址
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #集群内所有etcd节点的token这里都要保持一致,后面新增的节点的token也与这里一致
ETCD_INITIAL_CLUSTER_STATE="new"
#复制节点91的配置文件到节点92、93
scp /var/lib/etcd/cluster.etcd vms92:/var/lib/etcd
scp /var/lib/etcd/cluster.etcd vms93:/var/lib/etcd
#节点92、93中分别编辑配置文件,修改1-6行对应IP,分别将1-6行的91替换为92、93
#92:
vim /var/lib/etcd/cluster.etcd
:1,6s/91/92/g
#93
vim /var/lib/etcd/cluster.etcd
:1,6s/91/93/g

etcd集群搭建完毕,三个节点的集群,至少启动两个节点(一个leader、一个follower),etcd集群才能运作起来
各节点中启动etcd

systemctl start etcd
#设置开机自启动
systemctl enable etcd

列出所有etcd节点,可以看到isLeader=true表示这个节点作为leader,其余isLeader=false为follower

etcdctl member list

注意:etcdctl的API版本v2和v3不相互兼容,因此要么全部使用v2,要么全部使用v3
所有节点定义变量ETCDCTL_API,使用v3版本

export ETCDCTL_API=3

集群内所有etcd节点都会同步数据,在其中任何一个节点写入数据,其他节点也会同步

#节点91中写入数据a=1
etcdctl put a 1
#节点92、93也保存了a的值
etcdctl get a
#输出:
1

#节点92中删除a数据
etcdctl del a
#节点91、93中也被删除
etcdctl get a

扩展:可以使用etcdkeeper等可视化工具管理etcd

(2)数据备份和恢复

实验:在任一节点中写入任意数据,数据会同步到所有节点,创建快照,然后删除数据,使用快照恢复数据
写入任意数据etcdctl put [name] [value]
节点91中创建快照

etcdctl snapshot save xxx.data

删除数据etcdctl del [name] [value]
恢复数据:
步骤一:把快照文件同步到所有节点

scp xxx.data 192.168.26.92:~
scp xxx.data 192.168.26.93:~

步骤二:所有节点上停止etcd服务

systemctl stop etcd

步骤三:所有节点上删除etcd数据所在目录

#若不知道数据存在哪个目录,可以在配置文件中查询
cat /etc/etcd/etcd.conf
#也可以查看etcd的启动脚本(Loaded),然后在启动脚本中查询,--data-dir信息
systemctl status etcd
vim /usr/lib/systemd/system/etcd.service

rm -rf /var/lib/etcd/cluster.etcd

步骤四:恢复etcd数据到指定目录、指定初始化集群等信息,所有节点上都要操作

#节点91
etcdctl snapshot restore xxx.data --initial-cluster="etcd-91=http://192.168.26.91:2380,etcd-92=http://192.168.26.92:2380,http://192.168.26.93:2380" --data-dir="/var/lib/etcd/cluster.etcd" --name="etcd-91" --initial-advertise-peer-urls http://192.168.26.91:2380
#节点92,复制,将--name改为etcd-92,其他内容都一样
#节点93,复制,将--name改为etcd-93,其他内容都一样

步骤五:所有节点上,修改恢复出来的目录的所有者和所属组

chown -R etcd.etcd /var/lib/etcd

步骤六:所有节点上启动etcd

chown -R etcd.etcd /var/lib/etcd

恢复完成,严重数据是否恢复etcdctl get [name]
以上操作实际中可以写一个脚本,让其自动化操作

五、k8s环境中的etcd

之前的练习都是独立于k8s环境的,那么实际在k8s环境中,已经集成了etcd,作为必要的组件,以一个pod(容器)的方式运行的,这些pod在运行的时候,会使用宿主机的网络空间

切换到一个完成初始化集群的k8s环境中(这里以vms21为例)

#查看kube-system空间下的pod
kubectl get pods -n kube-system
#可以看到etcd-vms21.rhce.cc这个pod
NAME                                       READY   STATUS    RESTARTS      AGE
calico-kube-controllers-56cdb7c587-ndvcp   1/1     Running   2 (73s ago)   3d4h
calico-node-6d2rv                          1/1     Running   2 (74s ago)   3d4h
calico-node-tkj9x                          1/1     Running   2 (73s ago)   3d4h
calico-node-v69sp                          1/1     Running   2 (72s ago)   3d4h
coredns-74586cf9b6-cldcq                   1/1     Running   2 (73s ago)   3d4h
coredns-74586cf9b6-hvbc2                   1/1     Running   2 (73s ago)   3d4h
etcd-vms21.rhce.cc                         1/1     Running   5 (74s ago)   3d4h
kube-apiserver-vms21.rhce.cc               1/1     Running   5 (74s ago)   3d4h
kube-controller-manager-vms21.rhce.cc      1/1     Running   5 (74s ago)   3d4h
kube-proxy-lgsfd                           1/1     Running   2 (72s ago)   3d4h
kube-proxy-pmb7t                           1/1     Running   2 (74s ago)   3d4h
kube-proxy-st2zx                           1/1     Running   2 (73s ago)   3d4h
kube-scheduler-vms21.rhce.cc               1/1     Running   5 (74s ago)   3d4h
metrics-server-58556b7dd4-qx7hv            1/1     Running   2 (72s ago)   3d4h

这里我们并没有去安装etcd,但其实k8s环境中是有集成etcd的
查看etcd进程

ps aux | grep -v grep

可以查看2379、2380端口,可以看到也都会在监听

netstat -ntulp | egrep '2379|2380'

k8s中etcd的配置文件 etcd.yaml

k8s中etcd的配置文件为:/etc/kubernetes/manifests/etcd.yaml
查看etcd.yaml文件vim /etc/kubernetes/manifests/etcd.yaml,可以看到有各种各样的配置选项

......
spec:
  containers:
  - command:
    - etcd
    - --advertise-client-urls=https://192.168.26.21:2379
    - --cert-file=/etc/kubernetes/pki/etcd/server.crt
    - --client-cert-auth=true
    - --data-dir=/var/lib/etcd
    - --experimental-initial-corrupt-check=true
    - --initial-advertise-peer-urls=https://192.168.26.21:2380
    - --initial-cluster=vms21.rhce.cc=https://192.168.26.21:2380
    - --key-file=/etc/kubernetes/pki/etcd/server.key
    - --listen-client-urls=https://127.0.0.1:2379,https://192.168.26.21:2379
    - --listen-metrics-urls=http://127.0.0.1:2381
    - --listen-peer-urls=https://192.168.26.21:2380
    - --name=vms21.rhce.cc
    - --peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt
    - --peer-client-cert-auth=true
    - --peer-key-file=/etc/kubernetes/pki/etcd/peer.key
    - --peer-trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    - --snapshot-count=10000
    - --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt
    image: registry.aliyuncs.com/google_containers/etcd:3.5.3-0
......

若修改了etcd.yaml配置文件,需要重启kubelet,让其生效

systemctl restart kubelet

六、etcd客户端远程连接到k8s中etcd服务端

回到节点91,是否能把安装了etcd的节点91远程连接到k8s中来呢?——可以连接,但是必需要证书(就如同https的安全证书)
需要哪些证书?——k8s环境中的etcd.yaml中找到这三个证书

这里以完成初始化集群的vms21(192.168.26.21)作为etcd服务端

#服务端证书
- --cert-file=/etc/kubernetes/pki/etcd/server.crt
#私钥
- --key-file=/etc/kubernetes/pki/etcd/server.key
#ca证书
- --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt

将这三个证书文件拷贝到节点91家目录下

scp /etc/kubernetes/pki/etcd/server.crt /etc/kubernetes/pki/etcd/server.key /etc/kubernetes/pki/etcd/ca.crt 192.168.26.91

然后使用etcdctl客户端的API,远程连接到k8s环境,指定私钥key、证书cert、ca证书cacert、连接的服务器地址endpoints(以htttps来连接,端口为监听客户端的端口2379)、执行的操作(member list、put [name] [value]、del [name]等)

etcdctl --key="./server.key" --cert="./server.crt" --cacert="./ca.crt" --endpoints=https://192.168.26.21:2379 [执行的操作如:put a 1]
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐