etcd集群

etcd

存储那些 Kubernetes 数据

  1. 集群配置信息:
    • Kubernetes 集群的配置信息,包括 API 服务器的配置、网络插件配置、安全策略等。
  2. 节点信息:
    • 每个集群节点的信息,包括节点的 IP 地址、节点的健康状态、角色(Master 或 Worker)等。
  3. Pod 信息:
    • 每个运行中的 Pod 的配置和状态信息,包括容器的镜像、环境变量、挂载的卷以及当前运行的状态等。
  4. Service 信息:
    • Kubernetes Service 对象的信息,包括服务的 IP 地址、端口映射、服务类型等。
  5. Namespace 信息:
    • 每个命名空间的配置和状态信息,包括命名空间内的资源对象如 Pod、Service、Deployment 等的信息。
  6. 配置映射(ConfigMap):
    • 存储 ConfigMap 对象的配置信息,这些信息可以被 Pod 中的容器引用。
  7. Secret 信息:
    • 存储 Secret 对象的敏感信息,如 API 密钥、证书等。
  8. 持久卷(Persistent Volume)和持久卷声明(Persistent Volume Claim):
    • 存储持久卷和持久卷声明的配置信息。
  9. 控制器信息:
    • 存储控制器对象的信息,如 Deployment、StatefulSet、DaemonSet 等的配置和状态信息。

存储的数据形式关键点:

  1. Key(键):
    • Key 是一个字符串,用于唯一标识存储的数据。在 etcd 中,Key 的结构通常包含了多个部分,以层次结构的方式组织数据。例如,Kubernetes 中可能使用 /registry/pods/default/my-pod 这样的键来表示一个 Pod 对象。
  2. Value(值):
    • Value 是与 Key 相关联的数据。它可以是任意格式的字节流,etcd 本身不关心 Value 的具体内容,这是由应用程序决定的。
  3. 目录(Directory):
    • etcd 支持将 Key 组织成目录结构,通过在 Key 中使用斜杠(/)来模拟目录。例如,/registry/pods/ 可能是一个包含所有 Pod 对象的目录。
  4. 事务(Transaction):
    • etcd 支持事务操作,允许多个键值对的原子性操作。这样可以确保一组相关的数据项要么全部成功写入,要么全部失败。
  5. Watch(监听):
    • etcd 支持 Watch 操作,使客户端能够监听特定 Key 或目录的变更,从而实现实时的事件通知。
  6. 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
2
$ etcdctl put /atomic.io/network/config '{"Network":"121.21.0.0/16","Backend":{"Type":"vxlan"}}'
$ etcdctl del /atomic.io/network/config

API VERSION:3.2

Did you mean this?
get
put
del
user

etcd environment文档

https://doczhcn.gitbook.io/etcd/index/index-1/configuration

1
2
3
4
5
6
7
8
9
10
cs@debian:~/oss/0s/k8s$ sudo modprobe -v ip_vs
insmod /lib/modules/4.9.0-8-amd64/kernel/net/netfilter/ipvs/ip_vs.ko
cs@debian:~/oss/0s/k8s$ sudo modprobe -v ip_vs_rr
insmod /lib/modules/4.9.0-8-amd64/kernel/net/netfilter/ipvs/ip_vs_rr.ko
cs@debian:~/oss/0s/k8s$ sudo modprobe -v ip_vs_wrr
insmod /lib/modules/4.9.0-8-amd64/kernel/net/netfilter/ipvs/ip_vs_wrr.ko
cs@debian:~/oss/0s/k8s$ sudo modprobe -v ip_vs_sh
insmod /lib/modules/4.9.0-8-amd64/kernel/net/netfilter/ipvs/ip_vs_sh.ko
cs@debian:~/oss/0s/k8s$ sudo modprobe -v ip_vs_nq
insmod /lib/modules/4.9.0-8-amd64/kernel/net/netfilter/ipvs/ip_vs_nq.ko
1
2
3
4
5
cs@debian:~/oss/0s/k8s$ sudo ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

1
2
3
#两种临时方法
# echo 1 > /proc/sys/net/ipv4/vs/conntrack
# sysctl -w net.ipv4.vs.conntrack=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
2
[vagrant@k8s master]$ kubectl create clusterrolebinding kubelet-bootstrap --clusterrole=system:node-bootstrapper --user=kubelet-bootstrap
clusterrolebinding.rbac.authorization.k8s.io/kubelet-bootstrap created

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
2
3
4
5
6
7
8
9
 sduo  cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- ip_vs_nq
modprobe -- nf_conntrack_ipv4
EOF
1
2
3
4
5
6
7
8
9
containers:
- name: kube-flannel
image: k8s.org/k8s/flannel:v0.11.0-amd64
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=eth1

–iface=eth1

1
2
3
4
5
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


ansible k8s-108 -m copy -a "src=/opt/kubernetes/client/k8s-1.21-11/bin/config.yaml dest=/opt/kubernetes mode=0644" \
-b --become-method sudo --become-user root
1
2
3
4
5
[root@k8s kubernetes]# cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

kubelet.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	cat>/usr/lib/systemd/system/kubelet.service<<EOF
[Unit]
Description=Kubernetes Kubelet Server
Documentation=https://github.com/GoogleCloudPlatform/kubernetes
After=docker.service
Requires=docker.service

[Service]
WorkingDirectory=/var/lib/kubelet
EnvironmentFile=/opt/kubernetes/kubelet.env
ExecStart=/opt/kubernetes/bin/kubelet \$KUBELET_OPTIONS
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
kubelet.env
1
2
3
4
5
6
7
8
9
10
11
 cat>/opt/kubernetes/kubelet.env<<EOF
KUBELET_OPTIONS=" --hostname-override=192.168.56.108 \
--pod-infra-container-image=k8s.org/k8s/pause:3.4.1 \
--bootstrap-kubeconfig=/opt/kubernetes/config/bootstrap.kubeconfig \
--kubeconfig=/opt/kubernetes/config/kubelet.kubeconfig \
--config=/opt/kubernetes/config/kubelet-conf.yaml \
--register-node=true \
--cni-bin-dir=/opt/kubernetes/cni/bin --cni-conf-dir=/opt/kubernetes/cni/net.d --network-plugin=cni \
--runtime-cgroups=/systemd/system.slice \
--logtostderr=true "
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@testl etcd-v3.5.11]# ./etcdctl  member add  etcd04 --peer-urls="http://127.0.0.16:2350" --learner=true
Member 690b31e00158f43a added to cluster 99ae9d962d824d7b

ETCD_NAME="etcd4"
ETCD_INITIAL_CLUSTER="etcd4=http://127.0.0.1:2350,etcd3=http://127.0.0.1:2360,etcd1=http://127.0.0.1:2380,etcd2=http://127.0.0.1:2370"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://127.0.0.1:2350"
ETCD_INITIAL_CLUSTER_STATE="existing"
#可以看到该成员尚未启动
[root@test etcd-v3.5.11]# ./etcdctl member list -w table
+------------------+-----------+--------+----------------------------+-----------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+-----------+--------+----------------------------+-----------------------+------------+
| 690b31e00158f43a | unstarted | | http://127.0.0.1:2350 | | true |
| 6ea1523f71bf92f0 | started | etcd3 | http://127.0.0.1:2360 | http://127.0.0.1:2359 | false |
| 7637173a60d743e5 | started | etcd1 | http://127.0.0.1:2380 | http://127.0.0.1:2379 | false |
| ce6b0efed2935560 | started | etcd2 | http://127.0.0.1:2370 | http://127.0.0.1:2369 | false |
+------------------+-----------+--------+----------------------------+-----------------------+------------+

member promote命令提升 ,learner成员提升为follower(投票权)成员

1
2
3
4
5
6
7
8
9
10
11
12
[root@test etcd-v3.5.11]# ./etcdctl  member  promote c64a0c36c4a5869f
Member c64a0c36c4a5869f promoted in cluster 99ae9d962d824d7b
[root@test etcd-v3.5.11]# ./etcdctl member list -w table
+------------------+---------+--------+-----------------------+-----------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+--------+-----------------------+-----------------------+------------+
| 6ea1523f71bf92f0 | started | etcd3 | http://127.0.0.1:2360 | http://127.0.0.1:2359 | false |
| 7637173a60d743e5 | started | etcd1 | http://127.0.0.1:2380 | http://127.0.0.1:2379 | false |
| c64a0c36c4a5869f | started | etcd4 | http://127.0.0.1:2350 | http://127.0.0.1:2349 | false | #可以看到已经不是learner了
| ce6b0efed2935560 | started | etcd2 | http://127.0.0.1:2370 | http://127.0.0.1:2369 | false |
+------------------+---------+--------+-----------------------+-----------------------+------------+

点击打赏
文章目录
  1. 1. etcd
    1. 1.1. 存储那些 Kubernetes 数据
    2. 1.2. MVCC
  2. 2. 网络
    1. 2.1. kubelet.service
      1. 2.1.1. kubelet.env
  3. 3. apiserver
    1. 3.1. 参数调整
    2. 3.2. 分摊
      1. 3.2.1. 事件
      2. 3.2.2. 心跳Lease资源
      3. 3.2.3. Pod 资源
    3. 3.3. 负载
  4. 4. ui
  5. 5. add
载入天数...载入时分秒... ,