技术

如何使用RedisTemplate访问Redis数据结构 MySQL重要知识点 OAuth2认证授授权流程 分布式锁 服务调用 MQ的介绍 SpringCloud 使用链 Eureka 的点对点通信 介绍Eureka RabbitMQ与其它MQ的对比 Springboot 启动过程分析 Springboot 入门 Linux内存管理 自定义CNI IPAM 扩展Kubernetes 副本一致性 spring redis 源码分析 kafka实践 spring kafka 源码分析 Linux进程调度 让kafka支持优先级队列 Codis源码分析 Redis源码分析 C语言学习 《趣谈Linux操作系统》笔记 Kubernetes安全机制 jvm crash分析 Prometheus 学习 Kubernetes监控 Kubernetes 控制器模型 容器日志采集 容器狂占cpu怎么办? 容器狂打日志怎么办? Kubernetes资源调度-scheduler 时序性数据库介绍及对比 influxdb入门 maven的基本概念 《Apache Kafka源码分析》——server Kubernetes objects之编排对象 源码分析体会 自动化mock AIOps说的啥 从DevOps中挖掘docker的价值 《数据结构与算法之美》——算法新解 Kubernetes源码分析——controller mananger Kubernetes源码分析——apiserver Kubernetes源码分析——kubelet Kubernetes整体结构 ansible学习 Kubernetes源码分析——从kubectl开始 jib源码分析之Step实现 kubernetes实践 线程排队 jib源码分析之细节 从一个签名框架看待机制和策略 跨主机容器通信 jib源码分析及应用 docker环境下的持续构建 docker环境下的持续发布 一个容器多个进程 kubernetes yaml配置 marathon-client 源码分析 《持续交付36讲》笔记 程序猿应该知道的 mybatis学习 无锁数据结构和算法 《Container-Networking-Docker-Kubernetes》笔记 活用linux 命令 为什么很多业务程序猿觉得数据结构和算法没用? 串一串一致性协议 当我在说PaaS时,我在说什么 《数据结构与算法之美》——数据结构笔记 swagger PouchContainer技术分享体会 harbor学习 用groovy 来动态化你的代码 《深入剖析kubernetes》笔记 精简代码的利器——lombok 学习 java 语言的动态性 rxjava3——背压 rxjava2——线程切换 spring cloud 初识 JVM4——《深入拆解java 虚拟机》笔记 《how tomcat works》笔记 commons-pipeline 源码分析 hystrix 学习 rxjava1——概念 Redis 学习 TIDB 学习 分布式计算系统的那些套路 Storm 学习 AQS3——论文学习 Unsafe Spark Stream 学习 linux 文件系统 mysql 批量操作优化 《自己动手写docker》笔记 java8 实践 中本聪比特币白皮书 细读 区块链泛谈 比特币 大杂烩 总纲——如何学习分布式系统 forkjoin 泛谈 hbase 泛谈 看不见摸不着的cdn是啥 《jdk8 in action》笔记 程序猿视角看网络 calico 问题排查 bgp初识 mesos 的一些tips mesos 集成 calico calico AQS2——粗略的代码分析 我们能用反射做什么 web 跨域问题 《clean code》笔记 compensable-transaction 源码分析 硬件对软件设计的影响 elasticsearch 初步认识 mockito简介及源码分析 线上用docker要解决的问题 《Apache Kafka源码分析》——Producer与Consumer 停止容器 dns隐藏的一个坑 《mysql技术内幕》笔记2 《mysql技术内幕》笔记1 log4j学习 为什么netty比较难懂? 回溯法 apollo client源码分析及看待面向对象设计 java系并发模型的发展 从一个marathon的问题开始的 docker 环境(主要运行java项目)常见问题 Scala的一些梗 OpenTSDB 入门 spring事务小结 事务一致性 javascript应用在哪里 netty中的future和promise 《netty in action》读书笔记 netty对http2协议的解析 ssl证书是什么东西 一些tricky的code http那些事 苹果APNs推送框架pushy apple 推送那些事儿 编写java框架的几大利器 JVM3——java内存模型 java concurrent 工具类 java exception java io涉及到的一些linux知识 network channel network byte buffer 测试环境docker化实践 通用transport层框架pigeon netty(七)netty在框架中的使用套路 Nginx简单使用 《Linux内核设计的艺术》小结 从Go并发编程模型想到的 mesos深入 Macvlan Linux网络源代码学习2 《docker源码分析》小结 对web系统的一些理解 docker中涉及到的一些linux知识 hystrix学习 Linux网络源代码学习 Docker网络五,docker网络的回顾 zookeeper三重奏 数据库的一些知识 Spark 泛谈 commons-chain netty(六)netty回顾 Thrift基本原理与实践(三) Thrift基本原理与实践(二) Thrift基本原理与实践(一) Future 回调 Docker0.1.0源码分析 基于spring boot和Docker搭建微服务 通过Docker Plugin来扩展Docker Engine java gc Docker网络四,基于Centos搭建Docker跨主机网络 google guava的一些理解 Jedis源码分析 Redis概述 Docker回顾 深度学习是个什么鬼 Docker网络三,基于OVS实现Docker跨主机网络 Linux网络命令操作 JTA与TCC 换个角度看待设计模式 Scala初识 netty(四)netty对http协议的实现(废弃) netty(三)netty框架泛谈 向Hadoop学习NIO的使用 以新的角度看数据结构 AQS1——并发相关的硬件与内核支持 使用Ubuntu要做的一些环境准备 Docker网络二,libnetwork systemd 简介 那些有用的sql语句 异构数据库表在线同步 spring aop 实现原理简述——背景知识 quartz 源码分析 基于docker搭建测试环境(二) spring aop 实现原理简述 我们编程的那些潜意识 自己动手写spring(八) 支持AOP 自己动手写spring(七) 类结构设计调整 分析log日志 一次代码调试的过程 自己动手写spring(六) 支持FactoryBean 自己动手写spring(九) 总结 自己动手写spring(五) bean的生命周期管理 自己动手写spring(四) 整合xml与注解方式 自己动手写spring(三) 支持注解方式 自己动手写spring(二) 创建一个bean工厂 自己动手写spring(一) 使用digester varnish 简单使用 docker volume 关于docker image的那点事儿 基于docker搭建测试环境 分布式配置系统 JVM2——JVM和传统OS对比 git spring rmi和thrift maven/ant/gradle使用 再看tcp mesos简介 缓存系统——具体组件 缓存系统 java nio的多线程扩展 多线程设计模式/《Concurrency Models》笔记 回头看Spring IOC IntelliJ IDEA使用 Java泛型 vagrant 使用 Go 常用的一些库 Netty(一)初步了解 java mina Golang开发环境搭建(Windows下) java nio入门 ibatis自动生成类和文件 Python初学 Goroutine 调度模型猜想 一些编程相关的名词 虚拟网络 《程序员的自我修养》小结 VPN(Virtual Private Network) Hadoop安装与调试 Kubernetes持久化存储 Kubernetes 其它特性 访问Kubernetes上的服务 Kubernetes副本管理 Kubernetes pod 组件 使用etcd + confd + nginx做动态负载均衡 nginx安装与简单使用 在CoreOS集群上搭建Kubernetes 如何通过fleet unit files 来构建灵活的服务 CoreOS 安装 定制自己的boot2docker.iso CoreOS 使用 Go初学 JVM1——jvm小结 硬币和扑克牌问题 LRU实现 virtualbox 使用 os->c->java 多线程 容器类概述 zabbix 使用 zabbix 安装 Linux中的一些点 关于集群监控 ThreadLocal小结 我对Hadoop的认识 haproxy安装 docker快速入门

标签


当我在说PaaS时,我在说什么

2018年09月26日

简介

Pets vs Cattle 以及数据中心时代

本小节内容来自 《Container-Networking-Docker-Kubernetes》笔记

DevOps Concepts: Pets vs Cattle

想让服务可靠,有两种方式:把机器搞可靠;部署多个实例。

  特点 详情 Examples
Pets scale up you trait the machines as individuals,you gave each (virtual)machine a name. when a machine gets ill you nurse it back to health and manually redeploy the app. mainframes, solitary servers, load balancers and firewalls, database systems, and so on.
Cattle scale out your machines are anonymous;they are all identical,they have numbers rather than names, and apps are automatically deployed onto any and each of the machines. when one of the machines gets ill, you don’t worry about it immediately web server arrays, no-sql clusters, queuing cluster, search cluster, caching reverse proxy cluster, multi-master datastores like Cassandra, big-data cluster solutions, and so on.

PS:the Cloud Age, virtualized servers that are programmable through a web interface。

with the cattle approach to managing infrastructure,you don’t manually allocate certain machines for running an application.Instead,you leave it up to an orchestrator to manage the life cycle of your containers. 一个服务部署多个(几十个/上百个)实例带来许多挑战:如何部署?如何发现?挂了怎么办(总不能还靠人工)?通常依靠一个资源管理和调度平台辅助管理,如何选用和部署这个调度平台?从 “Evolution of Cattle” 的视角来看待 运维技术的演进。

  描述 technologies 部署cattle service需要什么 备注
Iron Age 物理机   Robust change configuration tools like Puppet (2005), CFEngine 3 (2008), and Chef  
The First Cloud Age IaaS that virtualized the entire infrastructure (networks, storage, memory, cpu) into programmable resources. Amazon Web Services (2006), Microsoft Azure (2010), Google Cloud Platform push-based orchestration tools like Salt Stack (2011), Ansible (2012), and Terraform (2014).  
The Second Cloud Age virtualize aspects of the infrastructure,This allows applications to be segregated into their own isolated environment without the need to virtualize hardware, which in turn duplicates the operating system per application. OpenVZ (2005), Linux Containers or LXC (2008), and Docker (2015). A new set of technologies evolved to allocate resources for containers and schedule these containers across a cluster of servers:Apache Mesos (2009), Kubernetes (2014), Nomad (2015), Swarm Immutable Production(应用的每一次更改都是重新部署,所以本身是Immutable),disposable containers are configured at deployment. 容器在部署的时候被配置

PaaS

阮志敏谈平台即服务PaaS

《左耳听风》笔记

《深入剖析kubernetes》笔记

基本可以总结出如下几点:

  1. PaaS 由IPaaS 和 APaaS 组成

    • IPaaS提供服务编排、调度、监控、发现、弹性伸缩等,使得服务本身可以可靠 和 高性能运行。
    • APaaS提供消息队列、分布式计算、存储、缓存等中间件,一个是为服务提供存储等基本资源;一个是为服务之间 提供交互手段,毕竟不像单机进程或线程通信那么方便了。
    • APaaS 需要 IPaaS 提供支持,因为消息队列、分布式计算等本身也是一种服务
  2. 多租户弹性是PaaS区别于传统应用平台的本质特性

    • 多租户,一个软件系统可以同时被多个实体所使用,每个实体之间是逻辑隔离、互不影响的。
    • 弹性(Elasticity)是指一个软件系统可以根据自身需求动态的增加、释放其所使用的计算资源。

多租户有如下几种实现方式:

  1. Shared-Nothing
  2. Shared-Hardware,共享物理机,即以拟机是弹性资源调度和隔离的最小单位
  3. Shared-OS,共享操作系统,进程是弹性资源调度和隔离的最小单位
  4. Shared-Everything,基于元数据模型以共享一切资源

不准确的说,可以认为PaaS 是一个基于集群的操作系统,在这个操作系统中:

  1. “程序”文件如何表示。因为在分布式环境下,还涉及到”程序”文件分发的问题。
  2. “进程”如何体现
  3. “磁盘”如何体现,“进程”如何访问“磁盘”
  4. “进程”之间如何通信

结合上文、docker + k8s,会对这几个问题有一些体会。

自己的理解

与IaaS对比起来,可以看作是服务化层次 不同的问题。

办一个酒席有哪些事情

  1. 原材料,菜、烟、酒
  2. 桌椅板凳等
  3. 知客
  4. 传菜员、厨师、刷碗等

农村酒席的演变

  1. 自己去菜市场买菜、去批发市场买酒、去请厨子、联系帮忙的、去租座椅板凳,资源都在,被动的等你去取用。
  2. 出现承包队,自带桌椅板凳、厨师、传菜员等,但仍需要你根据购物清单来购买原料
  3. 在酒店办酒席,你只需告知菜单即可,八大菜系、酒席档次、大厅装修(有没有投影等)均可以指定。

IAAS,一个物理机或者一堆物理机/虚拟机,能给你提供什么?运行服务所需的基本资源。IaaS只关注解决基础资源云化问题,解决的主要是IT问题。类似的只是解决了你村里有没有(有多大)一个菜市场、批发市场的问题,但买菜的事儿还是要你自己干。

PaaS 则类似于 在酒店办酒席

  1. 资源可以共用,包括物理资源,比如厨师、服务员、大厅等;软性资源,上菜次序、接待经验等,酒店可以同时接待多家客户的酒席。
  2. 一些要素参数化(学名叫服务化的能力供应),比如你指定川菜即可,不用亲自购买相关的原料。
  3. 动态调配,比如你临时加一桌,则酒店在全局范围内为你调配资源,无需你再去菜市场、批发市场跑一圈
  4. 要素监控,比如由酒店确保食物卫生,大厅的投影没有故障,足够的传菜员等。

这其中,承包队的作用便是:用户教育。先找一个点切入,再扩展至全局。 因为没有任何一家公司上来就按照完整的paas 来搭建运维体系。

运维的同学都知道,一般公司内的服务器会分为 应用集群、数据集群等,分别用来跑业务应用 和 大数据组件(比如hadoop、spark)等。为何呢?一个是物理机配置不一样;一个是依赖服务不一样,比如应用集群每台主机都会配一个日志采集监控agent,数据集群每台主机也有类似的agent,但因为业务属性不一样,监控的侧重点不一样,所以agent 逻辑不一样。进而,应用集群的服务 不可以随便部署在 数据集群的机器上。容器云之后,服务可以随意编排和移动, 那么物理机就单纯是提供计算了, 服务是否部署在某个机器上 只跟这个机器是否空闲有关,跟机器的划分(应用集群还是大数据集群)无关了。这个技术在阿里已经落地了数据中心日均 CPU 利用率 45% 的运行之道–阿里巴巴规模化混部技术演进

《Paas实现与运维管理》 笔记

对计算、网络和存储三大资源的管理就是运维,将运维需求进行整理,将这部分工作标准化、自动化,才能对上提供服务自API接口,集合配置管理和服务管理构建一个完备的PaaS平台。PaaS是技术实现与管理规约的双层结合。

paas,对于运维人员来说,就是将管理的内容从一系列的硬件物理机(装系统,zabbix监控等)转换为维护一个pass平台正常运行。对于开发来说,部署,从一个通知运维的过程(比较大的项目,或许还要写一个文档,盯着运维一起干),变成了自己到pass平台上提交等。

运维需求

  1. 软件配置

    “进程”这个概念是人们抽象出来的,并没有一个客观的实体与之对应(比如block对应一个存储区域)。观察linux的进程结构体,可以看到,它包含了运算所需要一系列资源的指针(比如文件描述符)。同理,一个软件配置,包括程序、文档,运行环境等

  2. 服务部署,决定将一个服务部署在哪台机器上。

    这个机器是否符合服务的要求(cpu,内存),有依赖的服务是否要部署在一起等

  3. 服务发现
  4. 监控恢复

资源的提供方式要提供一定的标准

  资源分配的表现形式  
计算 将原始任务拆分,子任务并行化  
存储 将分散的存储空间聚合成一个逻辑上的、可不断扩展的大存储  
网络 服务的互联与隔离、防火墙策略等  

docker

我们从paas这个大概念下来理解docker的小概念。

docker有以下特性特别适合干这个事

  1. 代码和环境相结合,以image的形式存在。代码通过docker registry + docker pull的形式,在各个host中流动

  2. 以容器的方式运行。其实你细看下公司tomcat的配置,大多数时候每个项目一个tomcat,tomcat配置最大jvm内存等,也是以容器的方式存在并运行。而容器的管理与监控,要比直接管理(增删改查)和监控一个tomcat进程方便。