来自谷歌云平台(Google Cloud Platform)的开发者布道师 Ray Tsang 和 Bret McGowen 在 SpringOne2GX 大会上分享了谷歌的 Kubernetes 的实践,来看看都有哪些内容吧!

微服务解决的痛点


1. 包的大小和部署的难度成正比
传统 Java 开发将应用打成一个巨无霸的 Ear 或者 War 文件(Fat Jar),包的大小越大,部署的复杂度就越高。

在传统架构中,通常开发人员需要给测试人员一个部署文档,而这个文档通常是一个很长的 Wiki 或者 Doc。开发将部署的每一步都描述在这个文档里,如果漏掉了其中任何一步,测试就可能部署不成功,所以包越大,你花在部署的时间就越长,这种做法对两者都是一种伤害。

微服务架构,每个 jar 包独立部署,且非常小,导致部署简单,依赖清晰。通过声明的方式将环境用代码来描述(Infra as Code),自动化搭建环境,而不是依赖文档。

2. 包越大,启动速度越慢
这个很好理解,包越大,需要加载的内容就越多,有的项目启动时间甚至需要半个小时。

使用微服务架构,服务启动速度快,并且能够实现0宕机滚动升级。

微服务的搭建


对于 Java 开发者,搭建微服务时建议使用 Spring Initializr (start.spring.io) 自动生成标准 Spring Boot 的框架代码,框架代码会声明所需要的依赖,例如 Mysql,Redis,Eureka,Zuul,Cloud messaging 等等,这样能够让开发者快速搭建一个微服务的项目,并且以此项目为规范,复制到其他项目,使得每个微服务的代码组织更规范,可读性更好。

如果不是 Spring 的开发者,也可以使用 Jboss Wildfly等其他微服务框架。

开始容器化

理论上来讲部署一个微服务,只需要执行 Java -jar 即可运行。但实际并没有人这么做,为什么?每个服务需要配置 JDBC 连接池,配置端口,做服务发现,服务隔离,如果人为的去维护每个微服务,那也将会是一场灾难。

容器和容器平台的诞生天生就能够解决这些问题。

1. 用代码描述环境 - DockerFile


DockerFile 解决的是用代码描述环境的问题。对这个 DockerFile 执行 Docker build 命令,可以构建出一个不变的镜像,这个镜像可以跑在任意的 Docker 环境里。这样就解决了基础设施即代码(Infra as Code)的问题。

2. 多容器应用的管理工具 - Compose

应用通常包含多个容器,Docker Compose 解决了应用里的多容器定义,运行的问题。 Compose 使用 YML 文件定义每个服务的依赖服务,自身暴露的端口等等。你只需要为你的微服务写好 YML 文件,然后执行 "docker-compose up", 那么你需要的所有容器都会启动起来,并且按照配置的方式去运行。

谷歌云平台的架构


在谷歌,所有的服务都跑在容器里,每周谷歌启动20亿次容器。


从谷歌开发者的视角来看容器平台,当开发者需要部署一个应用时,他只需要声明这个应用运行的集群,集群中机器的配置,以及服务的拷贝数量。


谷歌云平台 Kubernetes 架构图:

1. 容器镜像存储在私有 Docker 镜像注册中心(目前使用的是 Artifactory)。
2. 写好 Config 文件,让 Kubernetes Master 执行部署任务。
3. Scheduler 定时从 Master 取出任务,并且找到终端(Kubelet,通常是虚拟机)实际执行这个任务。
4. 当找到Kubelet 之后,从 Artifactory 拉取镜像,启动容器。

Kubernetes 的特性

如何实现类似谷歌的微服务架构?光靠 Compose 肯定不够,因为 Compose 仅仅解决了应用的描述,运行的问题,但应用的编排,服务注册,服务发现,服务监控,故障恢复,DNS,负载均衡等等功能如何实现? Docker 的作用是计算资源和环境的描述和调度,Kubernetes 的作用是以应用为中心的生命周期的管理。

Pods

Pods 的定义:Pods 包含一组容器,容器之间共享 namespace,共享存储,共享 IP 地址。

为什么会有 Pods?Pods 设计的目标是为了支持需要紧耦合容器的应用,让一个 Pods 里的多个容器变成对外服务的原子结构。例如 LAMP应用,这个应用依赖于多个不同的容器才能运行。

Pods 主要的目的,是为了解决一些辅助程序,例如内容管理系统,本地缓存管理,日志,备份,代理和更新等等,目的是让这几个集成的容器有统一的生命周期,降低独立维护容器的复杂度,所以 Pods 的初衷并不是运行同一个容器的多个副本。

Replication Controller

Replication Controller 会将集群保持在一个期望的状态。

传统的部署,需要一步一步部署好所有需要的东西,在 Kubernetes 里,你只需要描述你要部署生什么样,例如我要将某个服务部署6个实例。


此时的环境里有6个实例,突然,Node2节点发生了故障,导致集群里有2个节点挂掉。在传统项目里,我需要监控这个事件,并且手动去重启节点。


Replication Controller 会自动监控到这个事故,并且在可以的节点里寻找可用资源,部署这两个实例,直到最终集群里有6个实例。


Service

Service 是一组 Pods 的逻辑集合。在 Service 内部,Kubernetes 会创建负载均衡来将流量代理到可用的 Pods 上。Service 有一个固定的虚拟 IP( VIP)对外提供服务。

Service 的应用场景在于:假设后端有3个容器实例在运行,并且这3个实例是随时有可能坏掉的(Design for failure),前端的实例无需关注这三个实例各自的状态,而只需要声明它依赖的是后端某一个 Service 即可,让 Replication Controller 自动保证这个后端 Service 的可用性。

Labels

和名字和 UID 不同,Labels 不提供唯一性,通常,我们期望多个对象使用相同的 Label(s)。通过 Label 的设置和消费,可以轻松的过滤出需要找到的对象,例如:


这个命令能够从集群中所有的 Pods 里找出环境属于"Production",tier 等于"frontend"的 Pods。在前端服务的依赖声明里,和执行 Deploy 命令时,都可以用到 Labels 这个特性,实现服务或 Pods 的过滤。

金丝雀(Canary)部署


金丝雀最早是矿工进煤矿时,会带一只金丝雀进去,如果金丝雀发生异常反应,则说明存在瓦斯泄露,如果金丝雀反应正常,则说明安全。

上图说明的是通过 Replication Controller,Labels 和 Service 实现金丝雀部署,通过 Label(Role=FE)找到 FE 服务的两个版本,V1和 V2,用 Service 来屏蔽版本的差异,并且将流量分发给 V1 和 V2 的 Pods。

谷歌内部的金丝雀发布的策略是将新的版本部署集群1%的机器,并且监控用户行为,如果用户对于新功能有更多的点击次数,则说明改功能可以部署更多实例,达到5-10%的比例,再根据监控结果决定是否部署到100%的机器。

服务发现

Kubernetes 里服务发现有多种方式:

1. 通过环境变量注入发现服务。
当 Pods 在集群的 Node 中运行时,Kubernetes 会为它增加一些列的环境变量。以 Redis 的服务发现为例:


上图的"redis-master"暴露了6379端口,以及在集群里的 IP 地址,如果你的容器声明了对"redis-master"服务的依赖,在你的 Pods 里就能够访问到这些环境变量。

2. 通过 Kubernetes DNS 服务器。
Kubernetes DNS 服务器会订阅 Kubernetes API创建 Service 的事件,并且为每个 Service 记录一个 DNS 的记录。这样做的好处是:只要 DNS 服务在集群里有访问权限,那么所有的 Pods 都能访问新注册的 Service。

举例:如果你有一个 Service 在 Kubernetes Namespace "my-ns"下 ,名字叫做叫 "my-service",那么一条叫做"my-service.my-ns"的记录就会被创建。所有在"my-ns" Namespace 里的 Pods 都能通过 DNS 查找到"my-service"。

总结


Pod: 一组紧耦合的容器。

Replication Controller:持续的将当前的状态变成期望的状态。

Service:一组 Pod 的逻辑组合。

Labels:将 Pods 打上标签,进行多纬度的分组。

通过 Kubernetes 的这些特性,您可以轻松实现服务的服务注册,服务发现,高可用性,故障自动回滚,金丝雀发布等需求,实现微服务的落地。

本文转载自公众号【JFrog杰蛙DevOps】

推荐阅读

我最常用的Intellij IDEA快捷键

最好用的 IntelliJ 插件 Top 10

Jenkins Pipeline插件十大最佳实践!

Spring Cloud Hystrix的请求合并

白话:服务降级与熔断的区别

点击 “阅读原文” 搜搜本号内容

谷歌大神为你解释Kubernetes, 微服务和容器化相关推荐

  1. 微软出品:.net 微服务:容器化.net架构指南

    下载地址: https://aka.ms/microservicesebook 中文下载地址:https://dotnet.microsoft.com/download/thank-you/micro ...

  2. Spring cloud 微服务docker容器化最佳实践

    Spring cloud 是当下最炙手可热的微服务套件,我们将介绍如何整合Docker容器达到高效快捷的构建发布 采用了dockerfile-maven-plugin插件发布镜像到远程docker主机 ...

  3. 微服务应用容器化场景中常见问题总结

    简介:云原生技术栈是下一代应用转型的必然选择,它包含了微服务架构,DevOps和容器技术.对于微服务架构来说,应用是"第一公民",他逐渐蚕食原来底层软件或者硬件的功能,例如服务注册 ...

  4. 阿里大神分享API网关在微服务架构中的应用!

    来自:未知的瞬间公众号 案例背景介绍:解决思路/成功要点:成果: 长按订阅更多精彩▼ 如有收获,点个在看,诚挚感谢

  5. spring eureka集群+spring boot 微服务,容器化部署示例

    一.docker安装 这里先采用在线安装,利用docker hup下载基础镜像 1.环境版本要求 内核版本3.10及其以上 操作系统位数为64位 CPU架构为x86_64或amd64(目前也有别的支持 ...

  6. ​谷歌大神 Jeff Dean 领衔,万字展望5大 AI 趋势

    ‍‍ 作者 | 学术头条 来源 | 学术头条 对于关心人工智能技术进展的读者来说,每年年底来自整个谷歌 research 团队撰写的年终总结,可谓是必读读物. 今天,由谷歌大神 Jeff Dean 领 ...

  7. ​谷歌大神Jeff Dean领衔,万字展望5大AI趋势

    本文共14400字,建议阅读15分钟 本文为你重点介绍 ML 中可能产生重大影响的五个领域. 对于关心人工智能技术进展的读者来说,每年年底来自整个谷歌 research 团队撰写的年终总结,可谓是必读 ...

  8. 谷歌大神Jeff Dean领衔,万字展望5大AI趋势

    对于关心人工智能技术进展的读者来说,每年年底来自整个谷歌 research 团队撰写的年终总结,可谓是必读读物. 今天,由谷歌大神 Jeff Dean 领衔,这份总结虽迟但到.出于知识传播目的,&qu ...

  9. 【2017年第3期】交通大数据:一种基于微服务的敏捷处理架构设计

    杜圣东, 杨燕, 滕飞 西南交通大学信息科学与技术学院,四川 成都 610031 摘要:面对智慧交通广泛的大数据应用场景和技术需求,一般大数据系统难以适应多种处理情况并做出快速响应.针对这一问题,首次 ...

最新文章

  1. tomcat 7/8 启动非常慢的解决方法
  2. VS2010 不能将参数 2 从“char [20]”转换为“LPCWSTR”的错误解决
  3. LD(Levenshtein distance)莱文斯坦距离----编辑距离
  4. pandas显示全部数据内容_1行Python代码就能挖掘数据!这个库太神奇啦!
  5. 步进电机无细分和20细分_细分网站导航会话
  6. Take Your Seat Gym - 102222D
  7. 2017-2018-1 20179215《Linux内核原理与分析》第二周作业
  8. python 找到两个排序数组的中位数_Python查找两个有序列表中位数的方法【基于归并算法】...
  9. React之组件小析
  10. Your Bitbucket account has been locked. To unlock it and log in again you must solve a CAPTCHA.
  11. c++ ftp服务端_重磅干货||五万字长文总结:C/C++ 知识(下篇)
  12. 现代的 “Hello, World”,可不仅仅是几行代码而已
  13. 企业如何进行数据挖掘
  14. php报错 Function name must be a string in xxxx
  15. RHEL5 telnet服务 安装配置
  16. VS2011可以下载了,VC++部分强大了很多
  17. Vue引入Froala-Editor富文本编辑器
  18. 一篇SCI论文最快多久能完成?
  19. PS如何为图片添加四面投影
  20. 期权、期货及其他衍生产品 第二章 课程笔记整理

热门文章

  1. Linux shell条件判断if中的-a到-z的意思
  2. C语言中extern关键字的使用
  3. websocket创建失败_SpringBoot2.2 实践WebSocket被不靠谱的百度搜索结果坑了多少人
  4. 内核网络中的GRO、RFS、RPS技术介绍和调优
  5. linux中html的图片显示不出来,如何在HTML中显示原始的rgb图像
  6. mysql 8.0.21 安装配置方法图文教程
  7. python输入球的半径_基于用户输入半径的Myro移动机器人
  8. html插入不规则表格,如何构建HTML表格中的不规则形状?
  9. java hashset应用_三.java集合的应用
  10. 用文件fw读写链表_用FORTRAN95写的sgy文件读写程序