Kubernetes之路 3 - 解决服务依赖

摘要: 在容器服务的客户群中,一个经常被问起的问题就是如何处理服务间依赖。本文介绍了常见的解决方法来实现服务的依赖检查,还进一步用示例展示了如何利用init container, liveness/readiness探针等技术实现服务健康检查,依赖检查等等功能。


本系列文章记录了企业客户在应用Kubernetes时的一些常见问题

  • 第一篇:Java应用资源限制的迷思
  • 第二篇:利用LXCFS提升容器资源可见性
  • 第三篇:解决服务依赖

在容器服务的客户群中,一个经常被问起的问题就是如何处理服务间依赖。

在应用中,一个组件依赖指定的中间件服务和业务服务。在传统的软件部署方式中,应用启动、停止都要依照特定的顺序完成。

当采用 Kubernetes/Docker Swarm等容器编排技术在分布式环境下部署应用时,一方面不同组件之间并行启动无法保证其启动顺序,另一方面在应用运行时,其所依赖的服务实现有可能发生失败和迁移。如何解决容器之间的服务依赖就是一个非常常见的问题。

方法1 - 应用端服务依赖检查

我们可以在应用的启动逻辑中添加服务依赖检查逻辑,如果应用依赖的服务不可访问就重试,当错误超过一定次数后就自动退出。Kubernetes/Docker会根据所容器的重启策略(Restart Policy)在等待一段时间之后自动拉起。

下面就是一个简单的Golang应用示例,来检测所依赖的MySQL服务是否就绪。

  ...// Connect to database.hostPort := net.JoinHostPort(config.Host, config.Port)log.Println("Connecting to database at", hostPort)dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?timeout=30s",config.Username, config.Password, hostPort, config.Database)db, err = sql.Open("mysql", dsn)if err != nil {log.Println(err)}var dbError errormaxAttempts := 20for attempts := 1; attempts <= maxAttempts; attempts++ {dbError = db.Ping()if dbError == nil {break}log.Println(dbError)time.Sleep(time.Duration(attempts) * time.Second)}if dbError != nil {log.Fatal(dbError)}log.Println("Application started successfully.")...

注: 
"Fail Fast" (快速失败),是Design by Contract契约式设计的一种重要的原则,可以很好地保障系统的健壮性和可预测性。比如上文代码中,如果重试失败,就会由log.Fatal(dbError) 退出执行。而K8S/Docker的容器重启的回退机制可以保障不会因频繁拉起失败应用导致系统资源耗尽。

方法2 - 独立的服务依赖检查逻辑

在现实世界里,有些遗留应用或者框架无法进行调整。我们就会希望将依赖检查策略和应用逻辑进行解耦。

一个常见的方法是在容器的Dockerfile的启动脚本里加入相应的服务依赖检查逻辑,可以参见Docker文档获得更多信息。另一种方法是利用Kubernetes Pod自身机制添加依赖检查逻辑。

首先我们需要对Pod的生命周期有一定的理解,下图来自于 https://blog.openshift.com/kubernetes-pods-life/ 一文


首先在Pod中有三类容器

  • infra container: 这就是著名的pause容器
  • init container: 初始化容器 通常用于应用的初始化准备,只有等所有的初始化容器正常执行完毕之后,才会启动应用容器
  • main container: 应用容器

Kubernetes的最佳实践中,通常是利用初始化容器来进行依赖服务的检查。下面我们通过一个Wordpress的实例来展示其使用方法。

apiVersion: v1
kind: Service
metadata:name: mysql
spec:clusterIP: Noneports:- name: mysqlport: 3306selector:app: mysql
---
apiVersion: v1
kind: Service
metadata:name: wordpress
spec:ports:- name: wordpressport: 80targetPort: 80selector:app: wordpresstype: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:selector:matchLabels:app: mysqlserviceName: mysql replicas: 1template:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ALLOW_EMPTY_PASSWORDvalue: "true"livenessProbe:exec:command: ["mysqladmin", "ping"]initialDelaySeconds: 30periodSeconds: 10timeoutSeconds: 5readinessProbe:exec:# Check we can execute queries over TCP (skip-networking is off).command: ["mysql", "-h", "127.0.0.1", "-e", "SELECT 1"]initialDelaySeconds: 5periodSeconds: 2timeoutSeconds: 1
---
apiVersion: apps/v1
kind: Deployment
metadata:name: wordpress
spec:replicas: 1selector:matchLabels:app: wordpresstemplate:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: wordpress:4ports:- containerPort: 80env:- name: WORDPRESS_DB_HOSTvalue: mysql- name: WORDPRESS_DB_PASSWORDvalue: ""initContainers:- name: init-mysqlimage: busyboxcommand: ['sh', '-c', 'until nslookup mysql; do echo waiting for mysql; sleep 2; done;']

我们在Wordpress Deployment的Pod定义中添加了initContainers,它会通过检查 mysql 域名是否可以解析来判断所依赖的mysql服务是否就绪。

同时,在MySQL StatefulSet中我们也引入了readinessProbe 和 livenessProbe探针,它们会判定是否MySQL进程已经业务就绪。在K8S中,只有健康的Pod才可以通过ClusterIP访问或者DNS解析。

$ kubectl create -f wordpress.yaml
service "mysql" created
service "wordpress" created
statefulset "mysql" created
deployment "wordpress" created
$ kubectl get pods
NAME                         READY     STATUS     RESTARTS   AGE
mysql-0                      0/1       Running    0          5s
wordpress-797655cf44-w4p87   0/1       Init:0/1   0          5s
$ kubectl get pods
NAME                         READY     STATUS     RESTARTS   AGE
mysql-0                      1/1       Running    0          11s
wordpress-797655cf44-w4p87   0/1       Init:0/1   0          11s
$ kubectl get pods
NAME                         READY     STATUS            RESTARTS   AGE
mysql-0                      1/1       Running           0          14s
wordpress-797655cf44-w4p87   0/1       PodInitializing   0          14s
$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
mysql-0                      1/1       Running   0          17s
wordpress-797655cf44-w4p87   1/1       Running   0          17s
$ kubectl describe pods wordpress-797655cf44-w4p87
...

注:

  • Liveness探针:主要用于判断Container是否处于运行状态,比如当服务死锁或者响应缓慢等情况。
  • Readiness探针:主要用于判断服务是否已经正常工作。
  • 在init container中不允许使用readiness探针。
  • 如果Pod重启了,其所有init Container都需重新运行。

总结

本文介绍了常见的解决方法来实现服务的依赖检查,还进一步用示例展示了如何利用init container, liveness/readiness探针等技术实现服务健康检查,依赖检查等等功能。

Kubernetes提供了非常灵活的Pod生命周期管理机制,由于篇幅有限我们就不再展开介绍 postStart/preStop等生命周期钩子方法。

阿里云Kubernetes服务 全球首批通过Kubernetes一致性认证,简化了Kubernetes集群生命周期管理,内置了与阿里云产品集成,也将进一步简化Kubernetes的开发者体验,帮助用户关注云端应用价值创新。

原文链接

干货好文,请关注扫描以下二维码:



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/521952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Logtail从入门到精通(一):日志采集杂谈

摘要&#xff1a; 目前logtail已承载阿里云全站、所有云产品服务、全球各Region部署、阿里巴巴集团&#xff08;淘宝、天猫、菜鸟等&#xff09;上重要服务的数据采集。每天采集接近百万服务器上数PB的实时数据&#xff0c;对接数千个应用与消费者。什么是日志提到日志&#xf…

互联网大佬马老师于昨日教师节正式卸任,让位现任CEO张勇;华为发布新一代CloudLink视讯解决方案,普惠4K+AI;联通……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go OPPO Reno2正式发布&#xf…

Logtail从入门到精通(二):开启日志采集之旅

摘要&#xff1a; 为了更好的了解日志采集&#xff0c;这里我们首先对日志采集中遇到的基本概念进行简要的介绍。Logtail相关概念为了更好的了解日志采集&#xff0c;这里我们首先对日志采集中遇到的基本概念进行简要的介绍。概念介绍项目&#xff1a; 项目&#xff08;Project…

关于SDN的未来,Linux基金会专访阿里云网络大神

摘要&#xff1a; 近日&#xff0c;大家熟知的国际开源组织Linux基金会与阿里云进行了一次访谈。专访了阿里云网络团队掌门人江鹤。江鹤执掌阿里云网络产品线&#xff0c;并负责阿里集团网络虚拟化产品的研发管理工作。在软件定义网络&#xff08;SDN&#xff09;和网络功能虚拟…

5G 共建共享,究竟会带来什么影响?

戳蓝字“CSDN云计算”关注我们哦&#xff01;共建共享真的来了。根据9月9日中国联通发布的公告&#xff0c;中国联通和中国电信正式签署了《5G网络共建共享框架合作协议书》&#xff0c;将在全国范围内合作共建一张5G接入网络。图片来源网络小枣君认为&#xff0c;这一事件对于…

object转float_人工智能-Object Detection API 模型转tflite并验证

最近在用TensorFlow Object Detection API训练目标检测模型&#xff0c;训练好的pb模型大小17.6M&#xff0c;用pb预测效果不错&#xff0c;于是想着如何在手机端运行&#xff0c;查看官网关于tflite的转换&#xff0c;网址&#xff1a;https://github.com/tensorflow/models/b…

Multi Task Learning在工业界如何更胜一筹

摘要&#xff1a; 本文主要介绍多任务学习和单任务学习的对比优势以及在工业界的一些使用。如何从单任务学习转变为多任务学习&#xff1f;怎样使AUC和预估的准确率达到最佳&#xff1f;如何对实时性要求较高的在线应用更加友好&#xff1f;本文将以淘宝实例为大家进行分享多任…

rsync一行代码实现远程文件同步之修改默认22端口

由于需求需要把应用服务器上的日志文件同步到文件服务器上&#xff0c;但是又不能用22端口 文章目录一、应用服务器脚本修改如下二、文件服务器操作三、执行脚本测试四、应用服务器生成ssh key五、文件服务器添加key5.1. 打开.ssh文件夹目录&#xff1a;5.2. 创建authorized_ke…

上云难?TA霸气回应:不要你觉得,一键上云 so easy!

戳蓝字“CSDN云计算”关注我们哦&#xff01;图片来源网络2019年阿里提出的“All in Cloud”战略以及《全球云计算 IT 基础设施市场预测报告》的数据结果&#xff0c;都在表明企业上云已成不可逆之势&#xff1b;但上云事故接二连三发生似乎又在宣示企业上云之路道阻且长&#…

基于阿里云HiTSDB搭建工业物联网平台实践

摘要&#xff1a; 基于阿里云全面的物联网、云计算与大数据技术搭建云端的企业能源管理物联网平台实现能耗数据采集、统计分析、平衡调度、节能优化等全面的能源管控协同平台。是企业生产运行保障的利器&#xff0c;也是大量企业实现云上管理的实践案例。背景工业企业的能耗占了…

阿里巴巴开源的通用缓存访问框架JetCache介绍

摘要&#xff1a; JetCache是由阿里巴巴开源的通用缓存访问框架&#xff0c;如果你对Spring Cache很熟悉的话&#xff0c;请一定花一点时间了解一下JetCache&#xff0c;它更好用。JetCache可以做类似Spring Cache的注解式缓存&#xff0c;支持TTL、多级缓存、分布式自动刷新&a…

阿里深度学习的“金刚钻”——千亿特征XNN算法及其落地实践

摘要&#xff1a;随着十二点的钟声响起&#xff0c;无数人盯着购物车开启了一年一度的“剁手”之旅。可你有没有想过这购物狂欢的背后是什么支撑起了数据规模如此庞大的计算任务&#xff1f;其实不只是“双十一”&#xff0c;每一个用户的点击和浏览&#xff0c;每一件宝贝的排…

全球唯一:MySQL社区2018年度公司贡献奖颁给阿里云

摘要&#xff1a;在刚刚的Percona Live开源数据库大会上&#xff0c;MySQL社区委员会宣布将2018年度的MySQL社区公司贡献奖&#xff08;Corporate Contributor Award&#xff09;唯一颁给阿里云。图中右一为阿里云数据库RDS团队 彭立勋MySQL社区颁发次奖项是为了感谢阿里云多年…

模拟灰度传感器循迹的程序_灰度传感器的工作原理

灰度传感器是模拟传感器&#xff0c;有一只发光二极管和一只光敏电阻&#xff0c;安装在同一面上。灰度传感器利用不同颜色的检测面对光的反射程度不同&#xff0c;光敏电阻对不同检测面返回的光其阻值也不同的原理进行颜色深浅检测。在有效的检测距离内&#xff0c;发光二极管…

Docker Nexus3 maven 私服(搭建篇)

文章目录一、环境准备1. 安装docker2. 启动docker3. 拉取镜像4. 目录权限5. 创建容器6. 监控日志二、登录配置2.1. 效果验证2.2. 登录2.3. 初始化一、环境准备 1. 安装docker 使用yum命令在线安装 yum install docker2. 启动docker systemctl start docker3. 拉取镜像 doc…

这个充电宝太黑科技了,又小又不用自己带线,长见识了~

戳蓝字“CSDN云计算”关注我们哦&#xff01;现如今我们出门时&#xff0c;手机几乎都是随身携带支付用手机&#xff0c;移动办公用手机&#xff0c;刷剧玩游戏用手机手机可以说与我们工作&#xff0c;生活密不可分。只不过手机频率使用如此之高&#xff0c;也使得用电量大增当…

QuickBI助你成为分析师——群空间自主开通嵌入第三方报表权限

摘要&#xff1a; 用户使用过程中经常需要将创建的仪表板嵌入至自己应用中&#xff0c;方便查看。目前目前高级版群空间下支持用户自助化开通报表权限&#xff0c;通过获取拼接Token方式后台验证更加严格&#xff0c;并且支持实时更新/关闭Token以保证数据安全。用户使用过程中…

如何查看一个组件的 classid是多少_万一免五(万1免5)是骗人的吗?如何查看自己的交易费率是多少?万一免五最新问题汇总!...

前言每天都会遇到很多问题&#xff0c;大多数问题是重复的&#xff0c;所以整理到公众号里&#xff0c;希望你们看一下&#xff0c;别再一遍遍问了....万一免五开户是真的吗&#xff1f;随着监管越来越严&#xff0c;可以给万一免五的券商也越来越少&#xff0c;只要赶在万一免…

阿里云直播转点播最佳实践

摘要&#xff1a; 在前不久刚刚落幕的深圳云栖大会现场&#xff0c;有一个直播间体验项目引起了现场参会嘉宾的关注。云栖直播间是以视频云技术为基础&#xff0c;为云计算从业者量身打造了一个科技直播间&#xff0c;让每位嘉宾都可以过一把当“网红主播”的瘾。前言在前不久刚…

假如从餐饮店的角度来看架构…

戳蓝字“CSDN云计算”关注我们哦&#xff01;麦当劳作为世界快餐业的巨头之一&#xff0c;可以说是风靡全球圈粉无数。小编个人也是麦当劳的忠实粉丝之一。今天的文章主要就是从餐饮店的角度来讲讲的互联网技术架构发展故事。为了方便故事的讲解&#xff0c;我们假定创始人名称…