Kubernates基础

Table of Contents

Kubernetes 是一个用于容器集群的自动化部署、扩容以及运维的开源平台

使用Kubernetes,可以快速高效地响应客户需求:

可以帮助大家减轻在公有云及私有云上运行应用的负担

特点

Kubernetes项目是Google在2014年启动的。Kubernetes构建在Google公司十几年的大规模高负载运维经验之上,同时结合了社区中各项最佳设计和实践:

  • 可移植的:公有,私有,混合,多重云
  • 可扩展的:模块化, 插件化, 可挂载, 可组合
  • 可自愈的:自动布置, 自动重启, 自动复制, 自动扩容

虚拟机VS容器

Sorry, your browser does not support SVG.

以前是在主机上,通过包管理器安装应用程序来部署。缺点是:必将涉及到系统的应用程序,配置,库,以及生命周期等问题。 为了构建一个能够更新和回滚的虚拟机镜像,虚拟机会变得非常笨重

容器化是基于操作系统级虚拟化,而不是硬件虚拟化的容器来部署。这些容器彼此隔离:它们有自己的文件系统,也不能访问对方的程序,他们的运算和资源都是隔离的。 它们比虚拟机更容易建立,并且因为它们与底层系统没有耦合关系,所以可以很方便的在所有云服务器上分发

由于容器是小而快,每个应用程序可以装在一个容器镜像里。是1对1的应用程序到容器镜像的关系。基于容器技术,镜像可以在编译或者发行时创建,而不是部署的时候才去创建。 因为每个应用程序不依赖于其他的程序,及系统基础环境。 在构建/发行容器的时候就保证了,开发环境和生产环境的一致性。同样,容器是远远比虚拟机更加透明化,这更加方便监控和管理。 当容器里程序的生命周期是由底层系统管理的,而不是容器内部黑盒管理。最后,管理每个单个应用程序的容器,和管理应用程序是一样的

归纳以下关键点:

  • 灵活的创建和部署应用:相对使用虚拟机镜像,容器镜像的创建更加轻巧高效
  • 持续开发,持续集成以及持续部署:提供频繁可靠地构建和部署容器镜像的能力,同时可以快速简单地回滚(因为镜像是固化的)
  • 开发和运维的关注点分离:提供构建和部署的分离,也就将应用从基础设施中解耦
  • 开发,测试,生产环境保持高度一致:无论是在笔记本电脑还是服务器上,都采用相同方式运行
  • 兼容不同的云平台或操作系统上:可运行于Ubuntu,RHEL,CoreOS,on-prem或者Google Container Engine,或者任何其他环境
  • 以应用程序为中心的管理:将抽象级别从在虚拟硬件上运行操作系统上升到了在使用特定逻辑资源的操作系统上运行应用程序
  • 松耦合,分布式,弹性,自由的微服务:应用被分割为若干独立的小型程序,可以被动态地部署和管理 ,而不是一个运行在单机上的超级臃肿的大程序
  • 资源分离:带来可预测的程序性能
  • 资源利用:高性能,大容量

动机

Kubernetes不仅仅只能调度编排物理机或者虚拟机上的容器, 然而Kubernetes 还可允许开发者剪断与物理机或者虚拟机的脐带,从以主机为中心的基础设施转移到一个以容器为中心的基础设施上,继承容器的所有优势和好处。 Kubernetes 提供了一个能够建立真正以容器为中心的 开发环境的基础设施。Kubernetes 可以满足一般生产环境的需求, 例如:

  • 协同定位辅助, 复合应用,和单独应用容器模型
  • 装在储存视同
  • 安全分发
  • 健康检查
  • replicating application
  • 横向扩容
  • 命名和查找
  • 负载均衡
  • 滚动更新
  • 资源监控
  • 进出站日志
  • 自检和调试
  • 权限

提供了具有灵活的 IaaS 服务的 PaaS 平台,让你的应用提高了可移植性,不再依赖基础设施

设计

尽管 Kubernetes 提供了很多种解决方案,但总会有一些意想不到的应用场景。 往往一开始需要更强大的自动化特定编排,可以让应用程序开发流程简单化,加速开发速度。这也是为什么 Kubernetes 设计成为用于组件构建和工具组成的生态系统,使之便于部署,扩展和管理应用程序的一个平台

Labels 可以让用户随心所欲的来组织他们的资源。 Annotations 能够让用户自自定义布置资源信息,以方便他们的工作流程,并提供管理工具,让检查变得更简单

Kubernetes 控制面板 可以让开发人员用相同的 APIs 来构建。 用户可以编写自己的控制器,调度等。 如果选择使用他们自己的 APIs,可以通过命令行工具去实现

这样的设计使其他系统可以打造在 Kubernetes 之上

Kubernates VS 传统PaaS系统

Kubernetes 不是传统的 PaaS(平台及服务)系统:

  • 并不限制任何应用程序。 也不指定应用框架(例如Wildfly),限制语言类型(例如Java, Python, Ruby),也不仅仅迎合 12-factor应用程序模式。只要一个程序能够在容器中运行,它就可以在Kubernetes中运行
  • 不提供中间件(例如消息总线),数据处理框架(例如Spark),数据库(例如mysql),也不群集存储系统(例如Ceph)
  • 没有一键部署服务(例如持续集成CI)
  • 没有内置的日志,监控,报警等服务
  • 不提供或者强制要求基于某种语言或者框架的配置文件(例如json,yml)
  • Kubernetes does not provide nor adopt any comprehensive machine configuration, maintenance, management, or self-healing systems.

另一方面, 确实有不少PaaS系统运行在Kubernetes之上,比如Openshift, Deis和Gondor。同样你也可以将定制的PaaS系统,结合一个持续集成系统再Kubernetes上进行实施,只需生成容器镜像并通过Kubernetes部署

由于Kubernetes运行在应用层而不是硬件层,所以它提供了一些一般PaaS提供的功能,比如部署,扩容,负载均衡,日志,监控,等等。无论如何,Kubernetes不是一个单一应用,所以这些解决方案都是可选可插拔的

Kubernetes 并不是单单的”编排系统”;它排除了对编排的需要: “编排”的技术定义为按照指定流程执行一系列动作:执行A,然后B,然后C。相反,Kubernetes有一系列控制进程组成,持续地控制从当前状态到指定状态的流转。无需关注你是如何从A到C:只需结果如此。这样将使得系统更加易用,强大,健壮和弹性

概念

  • Cluster: 一组 物理的 或者 虚拟的 机器 ,也包含其他运行Kubernetes所需的基础设施资源
  • Node: 一个 物理的 或者 虚拟的 运行Kubernetes的 机器
    • Pod就是在Node上面进行调度的
  • Pod: 放置 在一起的 一组 容器和卷
  • Label: 一个可以 附加在资源 上的 键值对
    • 可以附加在 Pod 上来传达一个 用户定义具有辨识性属性
    • 可以用来 组织资源 ,或者 选取资源特定子集
  • Selector: 一个 匹配Label表达式 ,目的是用来 辨识 相关的资源
    • 一个 负载均衡 的服务的 目标Pod 是哪些
  • Replication Controller: 用来 确保同一时间指定数量的Pod副本 正在运行
    • 伸缩变得简单
    • 机器重启 或者因为其他原因出 故障 的时候对一个 Pod进行重建
  • Service: 定义了 一组Pod 和一个 访问这组Pod方式
    • 一个稳定的 IP地址 和相应的 DNS名称
  • Volume: 一个 目录 ,里面很可能 包含数据 ,可以被容器作为自己 文件系统的一部分 进行 访问
    • 基于 Docker Volumes 构建而来
    • 添加了 volume directory 和/或 device 的设置
  • Secret: 里面保存 敏感的数据 ,例如
    • 用于 认证的令牌 ,可以在请求的时候为容器所用
  • Name: 一个用户或者客户端提供的 资源名称
  • Namespace: 命名空间就像一个 资源名称前缀
    • 防止 不相关的项目组 发生 命名冲突 的措施
      • 帮助不同的 项目项目组 ,或者 客户共享集群
  • Annotation: 可以用来保存 更大 (相比较于label)的 键值对 ,并且可能包含 可读性低的数据
    • 目的是用来保存非辨认性目的的数据
      • 特别是那些由工具和系统扩展操作的数据
    • annotation的值无法用来进行有效地过滤