etcd
存储那些 Kubernetes 数据
- 集群配置信息:
- Kubernetes 集群的配置信息,包括 API 服务器的配置、网络插件配置、安全策略等。
- 节点信息:
- 每个集群节点的信息,包括节点的 IP 地址、节点的健康状态、角色(Master 或 Worker)等。
- Pod 信息:
- 每个运行中的 Pod 的配置和状态信息,包括容器的镜像、环境变量、挂载的卷以及当前运行的状态等。
- Service 信息:
- Kubernetes Service 对象的信息,包括服务的 IP 地址、端口映射、服务类型等。
- Namespace 信息:
- 每个命名空间的配置和状态信息,包括命名空间内的资源对象如 Pod、Service、Deployment 等的信息。
- 配置映射(ConfigMap):
- 存储 ConfigMap 对象的配置信息,这些信息可以被 Pod 中的容器引用。
- Secret 信息:
- 存储 Secret 对象的敏感信息,如 API 密钥、证书等。
- 持久卷(Persistent Volume)和持久卷声明(Persistent Volume Claim):
- 存储持久卷和持久卷声明的配置信息。
- 控制器信息:
- 存储控制器对象的信息,如 Deployment、StatefulSet、DaemonSet 等的配置和状态信息。
存储的数据形式关键点:
- Key(键):
- Key 是一个字符串,用于唯一标识存储的数据。在 etcd 中,Key 的结构通常包含了多个部分,以层次结构的方式组织数据。例如,Kubernetes 中可能使用
/registry/pods/default/my-pod
这样的键来表示一个 Pod 对象。
- Key 是一个字符串,用于唯一标识存储的数据。在 etcd 中,Key 的结构通常包含了多个部分,以层次结构的方式组织数据。例如,Kubernetes 中可能使用
- Value(值):
- Value 是与 Key 相关联的数据。它可以是任意格式的字节流,etcd 本身不关心 Value 的具体内容,这是由应用程序决定的。
- 目录(Directory):
- etcd 支持将 Key 组织成目录结构,通过在 Key 中使用斜杠(
/
)来模拟目录。例如,/registry/pods/
可能是一个包含所有 Pod 对象的目录。
- etcd 支持将 Key 组织成目录结构,通过在 Key 中使用斜杠(
- 事务(Transaction):
- etcd 支持事务操作,允许多个键值对的原子性操作。这样可以确保一组相关的数据项要么全部成功写入,要么全部失败。
- Watch(监听):
- etcd 支持 Watch 操作,使客户端能够监听特定 Key 或目录的变更,从而实现实时的事件通知。
- Lease(租约):
- etcd 中引入了租约概念,可以将一个键值对与一个租约关联。当租约到期时,相关的键值对可能被自动删除。
示例键值对:
- Key:
/registry/pods/default/my-pod
- Value: JSON 格式的 Pod 对象序列化数据
MVCC
Revision、CreateRevision 和 ModRevision
Revision 类型 | 描述 |
---|---|
Revision | - 表示 etcd 存储中的全局、单调递增版本号。 - 每次写操作(put、delete)都会使 Revision 递增。 - 是只读的,不会因数据变更而减小。 |
CreateRevision | - 表示键值对创建版本号。 - 在数据创建时,CreateRevision 的值等于当前 Revision。 - 在后续的修改中,CreateRevision 的值不会改变,仍然保持初始创建时的 Revision。 |
ModRevision | - 表示键值对修改版本号。 - 在数据创建时,ModRevision 的值等于当前 Revision。 - 在数据修改时,ModRevision 的值会递增,反映了修改操作的版本。 |
Version | 这个key刚创建时Version为1,之后每次更新都会自增,即这个key从创建以来更新的总次数。 |
关联关系 | - 对于一个键值对,CreateRevision 和 ModRevision 在创建时相等,都等于创建时的 Revision。 - 随着键值对的修改,ModRevision 会递增,而 CreateRevision 保持不变。 |
应用场景 | - Revision 主要用于实现乐观并发控制,客户端可以使用 Revision 来判断数据是否发生变更。 - CreateRevision 和 ModRevision 可以用于跟踪特定键值对的创建和修改历史。 |
网络
https://github.com/bitnami/bitnami-docker-etcd
1 | $ etcdctl set /atomic.io/network/config '{"Network":"121.21.0.0/16","Backend":{"Type":"vxlan"}}' |
{“Network”:”121.21.0.0/16”,”Backend”:{“Type”:”vxlan”}}
Couldn’t fetch network config: client: response is invalid json. The endpoint is probably not valid etcd cluster endpoint. timed out
查阅 flanneld 官网文档,上面标准了 flannel 这个版本不能给 etcd 3 进行通信
1 | $ etcdctl put /atomic.io/network/config '{"Network":"121.21.0.0/16","Backend":{"Type":"vxlan"}}' |
API VERSION:3.2
Did you mean this?
get
put
del
user
etcd environment文档
https://doczhcn.gitbook.io/etcd/index/index-1/configuration
1 | cs@debian:~/oss/0s/k8s$ sudo modprobe -v ip_vs |
1 | cs@debian:~/oss/0s/k8s$ sudo ipvsadm -ln |
1 | 两种临时方法 |
想永久保留配置,可以修改/etc/sysctl.conf文件
1 | kubectl create clusterrolebinding test:anonymous --clusterrole=cluster-admin --user=system:anonymous |
configmaps is forbidden: User “system:anonymous” cannot list resource “configmaps” in API group “” in the namespace “default”
certificatesigningrequests
1 | [vagrant@k8s master]$ kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap |
error: failed to run Kubelet: cannot create certificate signing request: certificatesigningrequests.certificates.k8s.io is forbidden: User “kubelet-bootstrap” cannot create certificatesigningrequests.certificates.k8s.io at the cluster
proxy
unable to create proxier: can’t set sysctl net/ipv4/conf/all/route_localnet to 1: open /proc/sys/net/ipv4/conf/all/route_localnet: read-only file system
1 | sduo cat > /etc/sysconfig/modules/ipvs.modules <<EOF |
1 | containers: |
–iface=eth1
1 | cs@debian:~$ ansible k8s-108 -m copy -a "src=/home/cs/oss/0s/k8s/kube-apiserver/docker-compose.yml dest=/opt/kubernetes/master/docker-compose.yml" -b --become-method sudo --become-user root |
1 | [root@k8s kubernetes]# cat > /etc/sysctl.d/k8s.conf << EOF |
kubelet.service
1 | cat>/usr/lib/systemd/system/kubelet.service<<EOF |
kubelet.env
1 | cat>/opt/kubernetes/kubelet.env<<EOF |
apiserver
参数调整
--max-mutating-requests-inflight
:在给定时间内的最大 mutating 请求数,调整 apiserver 的流控 qos,可以调整至 3000,默认为 200--max-requests-inflight
:在给定时间内的最大 non-mutating 请求数,默认 400,可以调整至 1000--watch-cache-sizes
:调大 resources 的 watch size,默认为 100,当集群中 node 以及 pod 数量非常多时可以稍微调大,比如:--watch-cache-sizes=node#1000,pod#5000
分摊
etcd集群的io压力 etcd-servers-overrides
Pod、Services、Configmaps、Deployment …
1 | --etcd-servers-overrides=/events#https://xxx:3379;https://xxx:3379;https://xxx:3379;https://xxxx:3379;https://xxx:3379 |
事件
event维度拆分
默认存储2小时,事件变化拉取,创建,没有业务依赖
心跳Lease资源
Pod 资源
负载
v1.14 版本才被完全修复( kubelet: fix fail to close kubelet->API connections on heartbeat failure #78016)
ui
https://github.com/evildecay/etcdkeeper/releases
./etcdkeeper -p=65530 -usetls -cacert=/etc/kubernetes/pki/etcd/ca.crt -key=/etc/kubernetes/pki/etcd/server.key -cert=/etc/kubernetes/pki/etcd/server.crt
add
一个learner成员,不参与投票
1 | [root@testl etcd-v3.5.11]# ./etcdctl member add etcd04 --peer-urls="http://127.0.0.16:2350" --learner=true |
用member promote
命令提升 ,learner成员提升为follower(投票权)成员
1 | [root@test etcd-v3.5.11]# ./etcdctl member promote c64a0c36c4a5869f |