本文讲的是使用Kubernetes和Docker进行简单的leader选举,【编者的话】Kubernetes简化了运行在集群中的服务部署和运维管理,然而,它也简化了这些管理工作的部署。本篇文章将会展示如何在分布式应用系统中使用Kubernetes来简单地运行leader选举。

概述

为了可靠性和伸缩性,分布式系统通常会复制多个服务任务,但往往有必要指定一个副本作为leader负责协调所有的副本。

通常在leader选举中,一组有机会成为leader的候选者都是可以确认的。这些候选者都竞相宣布自己是leader,其中会有一个候选者脱颖而出成为leader。一旦赢了选举之后,leader将会继续以leader身份发送“心跳”来更新他们的位置。而其它的候选者将会周期性地作出尝试来成为leader,这套机制确保了如果当前的leader由于某些原因失效了,可以快速指定新的leader。

leader选举的实现通常需要任一一套分布式协调系统比如ZooKeeper、etcd或者Consul,使用它们来取得共识,或者交替实现自己的共识算法。接下来我们将会看到Kubernetes如何使得在应用中进行leader选举明显更容易。

Kubernetes中leader选举的实现

leader选举的第一个要求是对于有意成为leader的一组候选者的规范,Kubernetes已经使用了Endpoints来表示一组包含服务的Pods副本,所以我们将重用这个相同的对象(旁白:你可能会认为我们将使用ReplicationControllers,但它们被绑定到一个特定的二进制软件包,即使在执行滚动更新的过程中也通常需要一个leader)。

执行leader选举将使用Kubernetes API中的两个属性:

  • ResourceVersions——每个API都有一个唯一的ResourceVersions,用户可以使用这些版本在Kubernetes对象上执行Compare-and-Swap操作。
  • Annotations——每个API都可以被用于客户端的任意键/值对注解。

鉴于这些原语,使用选主的代码相对简单,可以在这儿找到相关代码,运行如下:

$ kubectl run leader-elector --image=gcr.io/google_containers/leader-elector:0.4 --replicas=3 -- --election=example

这将会创建一个有三个副本的leader选举组:

$ kubectl get pods
NAME                   READY     STATUS    RESTARTS   AGE
leader-elector-inmr1   1/1       Running   0          13s
leader-elector-qkq00   1/1       Running   0          13s
leader-elector-sgwcq   1/1       Running   0          13s

为了查看哪一个Pod被选为了leader,用户可以访问Pods的日志,在下面的位置替换为你自己的Pod的名字:

${pod_name}, (e.g. leader-elector-inmr1 from the above)$ kubectl logs -f ${name}
leader is (leader-pod-name)

或者,用户可以直接检查Endpoints对象:

# ‘example’ is the name of the candidate set from the above kubectl run … command
$ kubectl get endpoints example -o yams

现在需要验证leader选举是否生效,在另外一个终端中执行:

$ kubectl delete pods (leader-pod-name)

这个命令将会删除已有的leader,因为Replication Controller管理Pods组,一个新的Pod将会替换掉已经删除的,从而确保副本数目仍然为3。通过leader选举,这三个Pod中将会有一个被选为leader,并且leader角色还会失效转移到不同的Pod上。因为Kubernetes框架中Pod在终止前会有一个宽限期,通常是持续30~40秒。
leader选举容器提供了一个简单的Web服务器,可以运行在任何地址上(比如http://localhost:4040),我们可以通过删除一个已有的leader选举组并创建一个新的来测试这个容器,此处可以另外传入一个形如-http=(host):(port) 规格的配置到镜像中,这样就会导致每一个组成员通过Webhook来获得有关leader的服务信息。

# delete the old leader elector group
$ kubectl delete rc leader-elector# create the new group, note the --http=localhost:4040 flag
$ kubectl run leader-elector --image=gcr.io/google_containers/leader-elector:0.4 --replicas=3 -- --election=example --http=0.0.0.0:4040# create a proxy to your Kubernetes api server
$ kubectl proxy

接着可以访问:

http://localhost:8001/api/v1/proxy/namespaces/default/pods/(leader-pod-name):4040/

然后就会看到:

{"name":"(name-of-leader-here)"}

leader选举与sidecars

太好了,现在可以通过HTTP来进行leader选举和找出leader,但怎么能在您自己的应用程序中使用它们呢?这就需要引入Sidecars的概念。在Kubernetes中,Pods由一个或者多个容器组成,通常,这意味着添加sidecars容器到主应用程序中组成一个Pod(对于这个主题的更详细的处理,请看我以前的博客文章)。

leader选举容器可以作为一个Sidecars来从自己的应用中使用,Pod中的任何容器对谁是当前的选主感兴趣的都可以简单地通过http://localhost:4040 来访问,然后返回一个简单的JSON对象,其中包含了当前选主的名字。既然Pod中的所有容器共享了相同的网络命名空间,就不再需要服务发现了!

举个例子,有一个简单的Node.js应用程序连接到leader选举Sidecar,然后打印出这个是否是当前的选主,领导人选举Sidecar将其标识符设置为默认的主机名。

var http = require('http');
// This will hold info about the current master
var master = {};// The web handler for our nodejs application
var handleRequest = function(request, response) {
response.writeHead(200);
response.end("Master is " + master.name);
};// A callback that is used for our outgoing client requests to the sidecar
var cb = function(response) {
var data = '';
response.on('data', function(piece) { data = data + piece; });
response.on('end', function() { master = JSON.parse(data); });
};// Make an async request to the sidecar at http://localhost:4040
var updateMaster = function() {
var req = http.get({host: 'localhost', path: '/', port: 4040}, cb);
req.on('error', function(e) { console.log('problem with request: ' + e.message); });
req.end();
};// Set up regular updates
updateMaster();
setInterval(updateMaster, 5000);// set up the web server
var www = http.createServer(handleRequest);
www.listen(8080);

当然,可以使用任何语言,选择支持HTTP和JSON来使用这个Sidecar。

总结

希望我已经向你展示了是多么容易为分布式应用程序使用Kubernetes来构建leader选举。在以后的部分我们将向您展示Kubernetes是如何使得构建分布式系统更容易。与此同时,还前往Google容器引擎或kubernetes.io来开始使用Kubernetes。

原文链接:Simple leader election with Kubernetes and Docker(翻译:胡震)

原文发布时间为:2016-01-19
本文作者:国会山上的猫TuxHu 
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:使用Kubernetes和Docker进行简单的leader选举

使用Kubernetes和Docker进行简单的leader选举相关推荐

  1. Kubernetes与docker集群管理常见问题解析

    很荣幸受邀参加开源中国社区的高手问答,我是时速云团队的后端工程师,负责主机管理功能开发.在互动过程中,发现大家在使用/调研kubernetes(简称k8s)过程中遇到了很多问题,这里我总结为几点: l ...

  2. kind:Kubernetes in Docker,单机运行 Kubernetes 群集的最佳方案?

    作者:gc(at)sysin.org,主页:www.sysin.org 请访问原文发布链接:https://sysin.org/article/kind/,查看最新版. 是否没有足够的机器运行 Kub ...

  3. 一文读懂Kubernetes 与 Docker

    新钛云服已为您服务1487天 两个最具影响力的云计算开源项目之间的异同. Kubernetes vs. Docker 是一个在云计算行业被多次提及的话题.无论你来自非技术背景,需要快速介绍,还是需要做 ...

  4. k8s 和 Docker 关系简单说明

    来源:https://www.jb51.net/article/206783.htm 这篇文章主要介绍了k8s和Docker关系简单说明,本文利用图文讲解的很透彻,有需要的同学可以研究下 最近项目用到 ...

  5. 基于Kubernetes、Docker的机器学习微服务系统设计——完整版

     内容提要 1 概述 2 系统介绍 2.1 功能全览 2.2 核心功能 3 系统架构 3.1 云化架构图 3.2 架构说明 4 云化部署 4.1 部署图 4.2 部署说明 4.3 部署实例 5 设计实 ...

  6. docker logstash_用于监视Kubernetes和Docker的六大开源工具

    Kubernetes和Docker是在DevOps圈中最常听到的两个词.Docker是一个工具,它使你能够以容器化的方式运行应用程序,Kubernetes是一个用于编排.管理容器的平台--如果你想使用 ...

  7. scala akka_如何对Scala和Akka HTTP应用程序进行Docker化-简单的方法

    scala akka by Miguel Lopez 由Miguel Lopez 如何对Scala和Akka HTTP应用程序进行Docker化-简单的方法 (How to Dockerise a S ...

  8. centOS上docker 的简单使用

    今天我们来聊一聊docker 的简单实用,我这里用的centOS. 首先安装docker, 用yum install docker -y 进行安装docker, 安装完成后用docker -v 来查看 ...

  9. 基于Kubernetes构建Docker集群管理详解

    from: 基于Kubernetes构建Docker集群管理详解 Kubernetes是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动 ...

最新文章

  1. CentOS 6.9下配置安装KVM
  2. Intellij IDEA 重置所有工具栏 Intellij IDEA 中的 Debug 控制台输出窗口不见了的解决办法
  3. 工业级光纤收发器一般能正常使用多长时间?
  4. 论文浅尝 - 计算机工程 | 知识图谱可视化查询技术综述
  5. Ppt2010中HTML是什么,2010dw1html简介.ppt
  6. 各种封装——封装getClass
  7. 追求神乎其技的程式设计之道
  8. keil5 字体颜色设置 背景黑色
  9. web网页设计实例作业 ——二手书店-大学生书店(13页) 学生个人网站作业模板 简单个人网页制作
  10. android 斜线 绘制_Android绘图:绘制直线的 drawLine方法
  11. 天气预报 API 各城市编码
  12. 计算机硬件 - 主板
  13. 2021 iOS面试题大全---全方面剖析面试(一)
  14. 应用COMSOL Multiphysics分析水平井压裂裂缝应力干扰现象
  15. 华为路由器配置OSPF实现不同网段通信
  16. CFSSL: 证书管理工具:2:创建CA私钥与CA证书
  17. 李白:下终南山过斛斯山人宿置酒
  18. Python深度学习-NLP实战:FastText实现中文文本分类(代码已跑通!)
  19. 采样频率Hz 采样率KSPS或MSPS,两种单位的换算关系
  20. Adobe Premiere导出文件过大

热门文章

  1. UA OPTI570 量子力学 原子结构基础 公式与结论总结
  2. UA MATH566 统计理论 Cramer-Rao不等式与Delta方法的联系
  3. PE文件数据结构汇总
  4. 用RadASM 开发窗口程序
  5. DES算法详解和代码 - IP置换
  6. windows内存管理概述
  7. 腾讯下一个重点:硬件;硬件自身的未来也正进入多元化发展
  8. Eclipse 常用最新插件.标记
  9. Ubuntu 安装LAMP ...
  10. 用时间分类能量再用能量分类时间