一、概述
kubernetes使用etcd作為數據中心,使用kubeadm部署kubernetes的時候默認會自己部署一個etcd,當然也可以將kubeadm部署的單點的etcd做成集群,但是比較麻煩,所以我們使用的是自建
的etcd集群即external etcd cluster。在使用kubeadm初始化集群的時候指定etcd為external。
具體kubeadm的init config參考我的另外一篇blog:https://www.cnblogs.com/cuishuai/p/10149727.html
etcd集群的搭建參考:https://www.cnblogs.com/cuishuai/p/9897006.html
本片blog不再贅述詳細的搭建過程,主要記錄一下etcd集群的管理。
二、Etcd Cluster 管理
1、准備etcdctl
默認etcd部署采用的是etcd-v2,kubernetes默認使用的是v3,所以直接使用etcdctl在etcd里查不到任何關於kubernetes的信息,v2和v3有很大的差距,可以從v2遷移到v3,但是不能往回遷。
想要使用必須指定etcd api 為v3,作如下操作:
# vim ~/.bashrc
#etcd host1='10.42.13.230:2379' host2='10.42.43.147:2379' host3='10.42.150.212:2379' endpoints=$host1,$host2,$host3 alias etcdctl='etcdctl --endpoints=$endpoints --key /etc/etcd/ssl/etcd-key.pem --cert /etc/etcd/ssl/etcd.pem --cacert /etc/kubernetes/ssl/ca.pem' export ETCDCTL_API=3
#使修改生效
#source ~/.bashrc
現在使用etcdctl查看kubernetes的信息:
查看所有的key:
etcdctl get --prefix "" --keys-only
刪掉所有的key:
etcdctl del --prefix ""
查看以calico開頭的所有的key:
etcdctl get --prefix "/calico" --keys-only
使用etcdctl可以管理很多etcd的內容,具體的可以使用etcdctl --help查看。
2、etcd集群添加節點
添加節點前的准備:
!集群必須是奇數個節點
!重新創建etcd的證書,將所有要添加的ip都加進去,參考https://www.cnblogs.com/cuishuai/p/9897006.html
!為新的etcd服務創建啟動文件,參考https://www.cnblogs.com/cuishuai/p/9897006.html,需要做一些簡單的修改:
#cat /etc/systemd/system/etcd.service
[Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target Documentation=https://github.com/coreos
[Service] Type=notify WorkingDirectory=/var/lib/etcd/ EnvironmentFile=-/etc/etcd/etcd.conf ExecStart=/opt/bin/etcd \ --name=etcd-host3 \ --cert-file=/etc/etcd/ssl/etcd.pem \ --key-file=/etc/etcd/ssl/etcd-key.pem \ --peer-cert-file=/etc/etcd/ssl/etcd.pem \ --peer-key-file=/etc/etcd/ssl/etcd-key.pem \ --trusted-ca-file=/etc/kubernetes/ssl/ca.pem \ --peer-trusted-ca-file=/etc/kubernetes/ssl/ca.pem \ --initial-advertise-peer-urls=https://10.42.10.90:2380 \
--listen-peer-urls=https://10.42.10.90:2380 \
--listen-client-urls=https://10.42.10.90:2379,http://127.0.0.1:2379 \
--advertise-client-urls=https://10.42.10.90:2379 \
--initial-cluster-token=etcd-cluster-1 \ --initial-cluster=etcd-host0=https://10.42.13.230:2380,etcd-host1=https://10.42.43.147:2380,etcd-host2=https://10.42.150.212:2380,etcd-host3=https://10.42.10.90:2380 \
--initial-cluster-state=exsiting \ --data-dir=/var/lib/etcd Restart=on-failure RestartSec=5 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
--initial-cluster-state修改為existing
創建數據目錄:
mkdir /var/lib/etcd
添加節點:
etcdctl member add --endpoints=https://10.42.10.90:2379 etcd-host3 https://10.42.10.90:2380
啟動etcd實例
systemctl start etcd
systemctl enable etcd
查看:
etcdctl endpoint health
etcdctl member list
3、移除節點
找到需要移除節點的memberid:
etcdctl member list
移除:
etcdctl member remove [memberid]
4、etcd集群數據備份與恢復
!數據備份
准備備份路徑
mkdir -p /data/backup/etcd
開始備份:
etcdctl snapshot save /data/backup/etcd/snapshot-$(date +%Y%m%d%H%M).db
查看snapshot文件的狀態:
etcdctl snapshot status /data/backup/etcd/snapshot-201901171717.db
!數據恢復
寫了一個腳本,現在集群假設是3個節點,名稱一次為etcd-host0、etcd-host1、etcd-host2:
#cat etcdrestoe.sh
#!/bin/bash h0=10.42.13.230 h1=10.42.43.147 h2=10.42.150.212
for i in h0 h1 h2 do etcdctl snapshot restore snapshot.db \ --data-dir=/var/lib/etcd \ --name=$i \ --initial-cluster=etcd-host0=https://$h0:2380,etcd-host1=https://$h1:2380,etcd-host2=https://$h2:2380 \
--initial-cluster-token=etcd-cluster-1 \ --initial-advertise-peer-urls=https://$i:2380 && \
mv /var/lib/etcd/ etcd_$i done
把生成的etcd_10.42.13.230、etcd_10.42.43.147、etcd_10.42.150.212分別覆蓋各自節點之前的/var/lib/etcd下面的數據。
