【CKA考试笔记】四、etcd介绍
etcd简介、搭建etcd独立环境、etcd连接k8s环境
文章目录
一、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]
更多推荐
所有评论(0)