94 lines
3.6 KiB
Markdown
94 lines
3.6 KiB
Markdown
|
# Etcd解析
|
|||
|
|
|||
|
Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息。在后面具体的安装环境中,我们安装的etcd的版本是v3.1.5,整个kubernetes系统中一共有两个服务需要用到etcd用来协同和存储配置,分别是:
|
|||
|
|
|||
|
- 网络插件flannel、对于其它网络插件也需要用到etcd存储网络的配置信息
|
|||
|
- kubernetes本身,包括各种对象的状态和元信息配置
|
|||
|
|
|||
|
**注意**:flannel操作etcd使用的是v2的API,而kubernetes操作kubernetes使用的v3的API,所以在下面我们执行`ectdctl`的时候需要设置`ECTDCTL_API`环境变量,该变量默认值为2。
|
|||
|
|
|||
|
## 原理
|
|||
|
|
|||
|
Etcd使用的是raft一致性算法来实现的,是一款分布式的一致性KV存储,只要用于共享配置和服务发现。关于raft一致性算法请参考[该动画演示](http://thesecretlivesofdata.com/raft/)。
|
|||
|
|
|||
|
关于Ectd的原理解析请参考[Etcd 架构与实现解析](http://jolestar.com/etcd-architecture/)。
|
|||
|
|
|||
|
## 使用Etcd存储Flannel网络信息
|
|||
|
|
|||
|
我们在安装Flannel的时候配置了`FLANNEL_ETCD_PREFIX="/kube-centos/network"`参数,这是Flannel查询etcd的目录地址。
|
|||
|
|
|||
|
查看Etcd中存储的flannel网络信息:
|
|||
|
|
|||
|
```ini
|
|||
|
$ etcdctl --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem ls /kube-centos/network -r
|
|||
|
2018-01-19 18:38:22.768145 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
|
|||
|
/kube-centos/network/config
|
|||
|
/kube-centos/network/subnets
|
|||
|
/kube-centos/network/subnets/172.30.31.0-24
|
|||
|
/kube-centos/network/subnets/172.30.20.0-24
|
|||
|
/kube-centos/network/subnets/172.30.23.0-24
|
|||
|
```
|
|||
|
|
|||
|
查看flannel的配置:
|
|||
|
|
|||
|
```bash
|
|||
|
$ etcdctl --ca-file=/etc/kubernetes/ssl/ca.pem --cert-file=/etc/kubernetes/ssl/kubernetes.pem --key-file=/etc/kubernetes/ssl/kubernetes-key.pem get /kube-centos/network/config
|
|||
|
2018-01-19 18:38:22.768145 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated
|
|||
|
{ "Network": "172.30.0.0/16", "SubnetLen": 24, "Backend": { "Type": "host-gw" } }
|
|||
|
```
|
|||
|
|
|||
|
## 使用Etcd存储Kubernetes对象信息
|
|||
|
|
|||
|
Kubernetes使用etcd v3的API操作etcd中的数据。所有的资源对象都保存在`/registry`路径下,如下:
|
|||
|
|
|||
|
```ini
|
|||
|
ThirdPartyResourceData
|
|||
|
apiextensions.k8s.io
|
|||
|
apiregistration.k8s.io
|
|||
|
certificatesigningrequests
|
|||
|
clusterrolebindings
|
|||
|
clusterroles
|
|||
|
configmaps
|
|||
|
controllerrevisions
|
|||
|
controllers
|
|||
|
daemonsets
|
|||
|
deployments
|
|||
|
events
|
|||
|
horizontalpodautoscalers
|
|||
|
ingress
|
|||
|
limitranges
|
|||
|
minions
|
|||
|
monitoring.coreos.com
|
|||
|
namespaces
|
|||
|
persistentvolumeclaims
|
|||
|
persistentvolumes
|
|||
|
poddisruptionbudgets
|
|||
|
pods
|
|||
|
ranges
|
|||
|
replicasets
|
|||
|
resourcequotas
|
|||
|
rolebindings
|
|||
|
roles
|
|||
|
secrets
|
|||
|
serviceaccounts
|
|||
|
services
|
|||
|
statefulsets
|
|||
|
storageclasses
|
|||
|
thirdpartyresources
|
|||
|
```
|
|||
|
|
|||
|
如果你还创建了CRD(自定义资源定义),则在此会出现CRD的API。
|
|||
|
|
|||
|
## Etcd V2与V3版本API的区别
|
|||
|
|
|||
|
Etcd V2和V3之间的数据结构完全不同,互不兼容,也就是说使用V2版本的API创建的数据只能使用V2的API访问,V3的版本的API创建的数据只能使用V3的API访问。这就造成我们访问etcd中保存的flannel的数据需要使用`etcdctl`的V2版本的客户端,而访问kubernetes的数据需要设置`ETCDCTL_API=3`环境变量来指定V3版本的API。
|
|||
|
|
|||
|
## Etcd数据备份
|
|||
|
|
|||
|
我们安装的时候指定的Etcd数据的存储路径是`/var/lib/etcd`,一定要对该目录做好备份。
|
|||
|
|
|||
|
## 参考
|
|||
|
|
|||
|
- [etcd官方文档](https://coreos.com/etcd/docs/latest)
|
|||
|
- [etcd v3命令和API](http://blog.csdn.net/u010278923/article/details/71727682)
|
|||
|
- [Etcd 架构与实现解析](http://jolestar.com/etcd-architecture/)
|