使用Kubernetes和Docker进行简单的leader选举

简介: 本文讲的是使用Kubernetes和Docker进行简单的leader选举,【编者的话】Kubernetes简化了运行在集群中的服务部署和运维管理,然而,它也简化了这些管理工作的部署。本篇文章将会展示如何在分布式应用系统中使用Kubernetes来简单地运行leader选举。
本文讲的是使用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选举
相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
793 108
|
2月前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1627 9
|
2月前
|
Kubernetes Devops Docker
Kubernetes 和 Docker Swarm:现代 DevOps 的理想容器编排工具
本指南深入解析 Kubernetes 与 Docker Swarm 两大主流容器编排工具,涵盖安装、架构、网络、监控等核心维度,助您根据团队能力与业务需求精准选型,把握云原生时代的技术主动权。
284 1
|
5月前
|
存储 Kubernetes 监控
Docker与Kubernetes集成挑战及方案
面对这些挑战,并不存在一键解决方案。如同搭建灌溉系统需要考虑多种因素,集成Docker与Kubernetes也需要深思熟虑的规划、相当的技术知识和不断的调试。只有这样,才能建立起一个稳定、健康、高效的Docker-Kubernetes生态,让你的应用像花园中的植物一样繁荣生长。
281 63
|
7月前
|
存储 Kubernetes 调度
Kubernetes、Docker和Containerd的关系解析
总的来说,Docker、Containerd和Kubernetes之间的关系可以用一个形象的比喻来描述:Docker就像是一辆装满货物的卡车,Containerd就像是卡车的引擎,而Kubernetes就像是调度中心,负责指挥卡车何时何地送货。
370 12
|
8月前
|
Kubernetes Docker 容器
Kubernetes与Docker参数对照:理解Pod中的command、args与Dockerfile中的CMD、ENTRYPOINT。
需要明确的是,理解这些都需要对Docker和Kubernetes有一定深度的理解,才能把握二者的区别和联系。虽然它们都是容器技术的二个重要组成部分,但各有其特性和适用场景,理解它们的本质和工作方式,才能更好的使用这些工具,将各自的优点整合到生产环境中,实现软件的快速开发和部署。
319 25
|
10月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
2665 11
|
Kubernetes Devops 持续交付
DevOps实践:使用Docker和Kubernetes实现持续集成和部署网络安全的守护盾:加密技术与安全意识的重要性
【8月更文挑战第27天】本文将引导读者理解并应用DevOps的核心理念,通过Docker和Kubernetes的实战案例,深入探讨如何在现代软件开发中实现自动化的持续集成和部署。文章不仅提供理论知识,还结合真实示例,旨在帮助开发者提升效率,优化工作流程。