Kubernetes etcd 高可用实现方式
一. 继承上一章节
1.1 现象和挑战
现象1: 全量数据range问题:etcd多实例(3、5、7)都是包括多版本的全量
数据, 并非是sharding问题,异常写入和list-all(range问题) 对derict etcd压力很大。
现象2: 不合理复用k8s etcd: 集群不能很好的做好“治理”, etcd大量key资源对象。 大量开源的 CRD 和 Resource, 更有甚者,将etcd当SQL使用。
现象3: 稳定性:集群层面问题(特别是网络抖动),大量event数据写入etcd,触发etcd写保护;
现象4: 大规模:大规模集群下,etcd 数据完整性保证(重要数据不放在一个篮子里面),对etcd进行拆解;
二. etcd 在K8s中实现高可用方式
数据拆分是在做什么?
众所周知,etcd 存储了 Kubernetes 集群中的各种资源数据,如 Pod、Services、Configmaps、Deployment
等等。
Kube-apiserver 默认是所有的资源数据都存储在一套 etcd 集群中,随着存储规模的增长,etcd 集群会面临性能瓶颈。以资源维度进行 etcd 的数据拆分来提升 Kube-apiserver 访问 etcd 的性能是业内所共识的经验优化思路,本质是降低单 etcd 集群的数据规模,减少单 etcd 集群的访问 QPS
。
针对本身集群自身的规模和需求: 需拆分为 4 个独立的 etcd 集群,分别存储 Pods、Leases、event 和其他资源数据,下面分别简要说明这前三类(Pods、Lease、event)需要拆分出去的资源数据。
- Pods, Services, Node (第二高)
- Events (最高优先级)
- Leases
- 其他(ConfigMap、serviceAccount、Deployment)
etcd 迁移步骤
步骤一: 准备逐步 events etcd集群
前提: 需要和之前etcd cafile、certfile、keyfile 保持一致。
步骤二: 禁止资源更新
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: deny-pods-write
webhooks:
- admissionReviewVersions:
- v1beta1
clientConfig:
url: https://extensions.xxx/always-deny
failurePolicy: Fail
name: always-deny.extensions.k8s
namespaceSelector: {}
rules:
- apiGroups:
- ""
apiVersions:
- v1
operations:
- "*"
resources:
- pods
- pods/status
- pods/binding
scope: '*'
sideEffects: NoneOnDryRun
步骤三:event资源
K8s event 资源数据并不是 watch 中的 event,一般是表示关联对象发生的事件,比如 Pod 拉取镜像,容器启动等。在业务上一般是 CI/CD 需要流水式展示状态时间轴,需要频繁拉取 event 资源数据。
event 资源数据本身就是有效期的(默认是 2 小时),除了通过 event 观测资源对象生命周期变化外,一般没有重要的业务依赖,所以说 event 数据一般认为是可以丢弃,不需要保障数据前后一致性的。
event 的拆分是最为简单的,只需要修改 APIServer 的启动配置,重启 APIServer 即可,不需要做数据迁移,也不需要做老旧数据的清理
。
步骤四:Pod资源
步骤五:变更kube-apiserver
在 kube-apiserver中添加:
- name: kube-apiserver
command:
- /usr/local/bin/kube-apiserver
- --enable-admission-plugins=Priority,NamespaceLifecycle,LimitRanger,PodSecurityPolicy,ServiceAccount,NodeRestriction,DefaultStorageClass,DefaultTolerationSeconds,ResourceQuota,StorageObjectInUseProtection,MutatingAdmissionWebhook,ValidatingAdmissionWebhook
- --disable-admission-plugins=PersistentVolumeLabel
- --allow-privileged=true
- --anonymous-auth=false
- --authorization-mode=Node,RBAC
- --token-auth-file=/srv/kubernetes/token/static_tokens.csv
- --client-ca-file=/srv/kubernetes/ca/ca.crt
- --enable-aggregator-routing=true
- --enable-bootstrap-token-auth=true
- --etcd-cafile=/srv/kubernetes/etcd/ca/ca.crt
- --etcd-certfile=/srv/kubernetes/etcd/client/tls.crt
- --etcd-keyfile=/srv/kubernetes/etcd/client/tls.key
- --etcd-servers={{ .Values.etcd.main.endpoints }} #其他
- --external-hostname={{ .Values.apiServer.externalHostname }}
{{ if .Values.etcd.events.endpoints }}
- --etcd-servers-overrides=/events#{{ .Values.etcd.events.endpoints }} # events资源
{{ end }}
步骤六:delete MutatingWebhookConfiguration
其他
「如果这篇文章对你有用,请随意打赏」
如果这篇文章对你有用,请随意打赏
使用微信扫描二维码完成支付