Kubernetes 核心组件 Leader 选举机制

Kubernetes 核心组件 Leader 选举机制

Kubernetes 内部很多核心组件是有状态的,都以一主多从多实例的方式运行。这些组件的一主多从中,只有主实例负责处理数据,从实例处在热备状态。当主实例异常时从实例将竞选成为主实例并接替进行任务处理,所以这个选举机制是 Kubernetes 对于这有状态组件高可用的保障。

核心组件如 kube-scheduler 或 kube-controller-manager 等组件,在同一时刻只有一个实例在处理业务逻辑,因此需要在启动的实例中进行选主,决定哪个实例负责处理任务。这些核心组件都是使用的 client-go 中提供的工具类 leaderelection,也就是本文的主角。

leaderelection 依赖于 Kubernetes 中提供的 EndpointsConfigMapLease 三种资源锁,leaderelection 选主的实现方式就是基于这三种资源锁:

  • 多个副本去创建资源,创建成功则获得锁成为 leader;
  • leader 在租约内去刷新锁;
  • 其他副本则通过比对锁的更新时间,判断是否竞争成为 leader。

除了能在核心组件中使用,这个组件也能使用在我们开发的应用中,前提是我们的应用运行在 Kubernetes 环境且有操作资源锁的权限。

阅读更多
Docker 构建多平台镜像

Docker 构建多平台镜像

最近公司在组织各个系统的开发人员在搞信创改造,其中有部分改造内容就是要让系统能兼容 ARM 架构的 CPU。我们的系统都是运行在 Kubernetes 的容器中的,所以需要将应用打包到不同架构的镜像中。

Docker 提供了多平台的支持,可以将不同架构的镜像打包成一个镜像,部署时再根据运行的架构不同拉取不同架构的镜像运行,构建多平台镜像可以使用 BuildX 组件实现。

阅读更多
使用 iKuai Exporter 监控爱快的网络情况

使用 iKuai Exporter 监控爱快的网络情况

爱快软路由有非常完善的监控功能,但因为是爱快自己的体系,很不灵活,只能满足基本的使用,没法在 Prometheus 里使用,想要做些告警的功能就更不行了。

再加上最近跑网心云的虚机挂了几天才发现,搞一套内网的监控告警体系迫在眉睫了。对于家庭内网的监控告警,有几个需求需要满足:

  1. 能统计每天设备的流量
  2. 能对公网在线状态进行监控告警
  3. 能对设备的在线状态进行监控告警
阅读更多

使用 JWT 实现会话认证

基于 JWT 来实现 Token 认证很简单,相对复杂的签名认证算法都已经封装到工具包里,使用起来很容易。

而真正造成 JWT 的应用困难其实是在适应业务上,并不是所有业务都适合原生的 JWT 特性。我们很多时候选型使用 JWT 看重的是其无状态和校验方便的优点,但在实际的业务场景中经常是要 Revoke 功能的。

如果要实现 Token 的 Revoke 那 Token 会变成有状态,这让人使用起来非常纠结。 我都有状态了为啥还要用 JWT?直接生成一个 ID 存 Redis 不更简单?直接用 Redis 缓存有效性来控制 Token 的有效性,失效删除就好了。

最终选择使用 JWT 作为 Token 主要是基于以下考虑:

  1. JWT 实现完善,有丰富的开发工具包;
  2. 不需要自己再设计一套 Token 结构和校验算法;
  3. 可以利用 JWT 进行前置验证(JWT 正确性、是否超时失效),避免每次都查询缓存;
  4. JWT 可以基于 Payload 存储数据,使用很灵活,可以提供保存一些数据在 Token 中避免查询;
  5. JWT 签名方法很丰富,能满足以后演进的需要,能实现一处签发,多处验证。
阅读更多

限流之令牌桶算法实现

令牌桶算法示意

和漏桶算法算法类似,令牌桶算法的核心是固定“进口”速率,可以应对突发流量,是非常非常常用的算法。

  • 桶里装的是令牌
  • 在被处理之前需要拿到一个令牌,请求处理完毕之后将这个令牌丢弃(删除)
  • 拿不到令牌就被「流量干预」
  • 根据限流大小,按照一定的速率往桶里添加令牌

通常在实现中,令牌的增加都是基于时间的延迟计算和预消费的思想。

阅读更多

限流之漏桶算法实现

漏桶算法把发请求的动作比作成注水到桶中,处理请求的过程可以比喻为漏桶漏水。

往桶中以任意速率流入水,以一定速率流出水,当水超过桶流量则丢弃,因为桶容量是不变的,保证了整体的速率。

阅读更多
限流之滑动窗口计数器实现

限流之滑动窗口计数器实现

滑动窗口其实就是对固定窗口做了进一步的细分,将原先的粒度切的更细,相当于固定窗口计数器算法的升级版。

如果固定窗口的「固定周期」已经很小了,那么使用滑动窗口的意义也就没有了。

本文整理了滑动窗口计数器的伪代码、Redis、Go 的实现方法。

阅读更多

MySQL 索引合并

是在 MySQL 5.0 后引入的的索引合并策略,它将每个索引查询的结果进行合并。

合并算法有三种:intersect(交集)、union(并集)、sort_union(不常见)。

阅读更多

限流之固定窗口计数器实现

固定窗口计数器规定单位时间处理的请求数量。该算法无法保证限流速率,因而无法保证突然激增的流量。优点是容易理解,实现简单。

本文整理了固定窗口计数器的伪代码、Redis、Go 和 Java 的实现方法和思路。

阅读更多

HashMap 成环问题

在 JDK 1.7 的实现中,使用头插法来实现元素的插入和数组扩容。

扩容的 Resize 包含扩容和 Rehash 两个步骤,Rehash 在并发的情况下可能会形成链表环。

Sun 认为这不是一个 Bug,因为 HashMap 本来就不支持并发,要并发就用 ConcurrentHashMap

这个问题只存在于 JDK1.7 中,在 JDK1.8 中使用了不同的扩容实现方式,不会出现这种情况。

阅读更多