kubernetes容器技术基础入门

引子

早期应用部署的方式

  1. 手动部署
  2. 脚本部署
  3. 通过自动化工具部署
  • ansible
  • puppet
  • saltstack
  • 此类自动化工具本身就是一款应用编排工具,它能够安装、配置、启动,甚至可以用自己定义的状态文件来实现批量部署

docker部署方式

以往手工管理的对象是直接部署在操作系统环境中的应用程序,但是有了docker以后,应用程序被容器化,各种应用程序都被封装在容器中执行。
那么我们在使用saltstack等自动化运维工具编排应用程序时会发现它的对象已经发生变化了。此时我们的自动化运维工具已经不再适用于容器化应用程序的编排工作了,因为容器化所提供的接口与早期传统意义上应用程序的访问、控制和管理接口有所不同,所以,docker时代就呼唤新式的、面向容器化应用程序的编排工具的实现。

容器编排工具

docker编排三剑客(官方)

docker compose(单击编排)

  • 只能管理一台主机上的容器,它不能管理另外一台主机上的容器

docker swarm(多机编排)

  • 面向集群
  • docker swarm能够将多个docker host整合为同一平台之下的管理机制的一个集群工具
  • 能够将多个docker host的计算资源整合成一个资源池,然后用docker compose编排时,只需要面向swarm整合出来的资源池进行编排
  • docker swarm是docker自身的一个应用程序
  • docker里面默认自带,但是没打开

docker machine(docker主机)

  • 每个主机在在一开始的时候怎么去把它安装成为docker host,这个docker host要能够加入到docker swarm的资源池,成为swarm的成员,它首先自己得是个docker host,那么docke怎么安装上去,如何初始化成能够直接加入、成为docker swarm中的成员主机呢?此时我们就需要用到docker machine来实现此功能。
  • docker machine能够将一个主机迅速初始化为能加入swarm集群的一台docker host。

mesos(第三方)

是一个IDC的OS,能够把一个IDC中的所有硬件所提供的计算资源统一调度和分配。但是它所面向的上层接口所提供的不是容器运行的接口,而只是个资源分配工具,非能够直接运行托管运行容器的。所以在此基础之上它必须要提供一个能面向容器编排的框架,这个框架就是marathon

kubernetes

K8s已经牢牢占据了容器编排工具的80%市场

CI&CD

  • CI(持续集成)
  • CD(持续交付Delivery)
  • CD(持续部署Deployment)

背景知识

官方文档描述为:

Kubernetes一个用于容器集群的自动化部署、扩容以及运维的开源平台。通过Kubernetes,你可以快速有效地响应用户需求;快速而有预期地部署你的应用;极速地扩展你的应用;无缝对接新应用功能;节省资源,优化硬件资源的使用。为容器编排管理提供了完整的开源方案。

总的来说,Kubernetes是用于自动部署、扩展和容器化应用程序的开源系统。
因此我们要了解Kubernetes,首先要明白容器的概念,以及常说的Docker是什么。

容器

容器技术的官方定义是:

容器是通过一种虚拟化技术来隔离运行在主机上不同进程,从而达到进程之间、进程和宿主操作系统相互隔离、互不影响的技术。

要理解这个定义,首先要弄清楚容器和虚拟机的区别:
简单来说,虚拟机是一个机器,但容器是一个进程。每一个虚拟机里面都有一套完整的操作系统,而容器层安装在操作系统之上,它直接利用了宿主机的内核,更加轻量化,启动速度极快。通常,我们在会每个容器里面跑单个的应用,而在虚拟机里会跑很多应用。
容器技术具有:简化部署、快速启动、服务组合、易于迁移等优点。
容器技术最早应用在Linux操作系统,称为Linux Container(LXC),早期在互联网公司开始使用部署分布式应用,随后随着容器管理器(Docker、Rocket和CloudFoundary Garden)兴起,定制容器宿主操作系统(CoreOS、Ubuntu Snappy、Red Hat Atomic)盛行,容器被有效构建和管理、并在各行各业普遍使用和认可。

docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker容器十分轻量。
Docker把容器变得标准化了,我们现在常说的容器一般是指Docker容器。
要理解Docker,需要明白三个最主要的概念:容器、镜像、仓库。

  • 容器是运行在虚拟机上的进程(前面已经介绍过了)。
  • 镜像是一种存储形式,可以理解为数据或应用的副本。
  • 仓库是用来存储镜像的。

Docker能够普遍使用起来,很大程度上个得益于Docker的仓库里汇集了很多已经标准化的镜像,大大提升了部署效率。

Kubernetes介绍

舵手、飞行员
由Google的工程师于2014年创立
Kubernetes代码存放位置

小知识: 因kubernetes名字过长,一般简称为k8s,因为k与s之间有8个字母,故而称之。

kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发。K8S是Google内部一个叫Borg的容器集群管理系统衍生出来的,Borg已经在Google大规模生产运行十年之久。K8S主要用于自动化部署、扩展和管理容器应用,提供了资源调度、部署管理、服务发现、扩容缩容、监控等一整套功能。2015年7月,Kubernetes v1.0正式发布,截止到2017年9月29日最新稳定版本是v1.8。Kubernetes目标是让部署容器化应用简单高效。

Kubernetes是一个开源的 Linux容器自动化运维(操作)平台,这些操作包括部署,调度和节点集群间扩展。
可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。换一句话说kubernetes负责管理服务中所有的Docker容器,创建、运行、重启与删除容器。

使用Kubernetes可以:

  • 自动化容器的部署和复制
  • 随时扩展或收缩容器规模
  • 将容器组织成组,并且提供容器间的负载均衡
  • 很容易地升级应用程序容器的新版本
  • 提供容器弹性,如果容器失效就替换它,等等…

上文提到,Kubernetes是用于自动部署、扩展和容器化应用程序的开源系统。
当我们使用的容器服务多了,面临的访问量增大以后,我们就需要一种工具把这些容器统一的管理起来,需要实现对这些容器的自动部署、扩展和管理。也就是俗称的容器编排。

Kubernetes就是这样一种容器编排系统

K8s 特性

  1. 自动装箱
    基于资源依赖及其约束能够自动完成容器的部署且不影响其可用性

  2. 自我修复
    一旦容器崩了,可以自动启动一个新的容器替代从而实现自我修复

  3. 自动实现水平扩展
    一个容器不够,再启一个,可以不断的进行扩展,只要物理平台的资源足够支撑

  4. 自动进行服务发现和负载均衡

  5. 自动发布和回滚
    一旦代码发生更新,它就自动发布;如果发现容器启动有问题,它就自动回滚

  6. 密钥和配置管理
    容器化应用程序的最大问题在于我们配置容器内的应用程序比较困难。基于镜像启动一个容器后,如果期望容器中的应用程序换一个配置该怎么办呢?如果我们定义一个entrypoint的脚本,而这个脚本可以接受用户传入的变量参数,把变量的值转换为容器内的应用程序可读取的配置,从而能完成容器化应用程序的配
    之所以这么麻烦是因为早期的应用程序不是面向云原生而开发的,所以那些应用程序要通过读取配置文件来获取配置,而云原生开发的应用程序可以基于环境变量来获取配置。
    这种配置方式使得一个镜像能满足用户在不同环境下运行同一个镜像为不同配置的容器的需求。
    但是在编排工具当中,这种配置方式会存在一些问题,比如配置信息保存到哪里?如果我们用编排平台让容器启动自动化了,但每次启动容器时我们还要手工去传递环境变量的值,这是一个很麻烦的事,所以我们需要一个外部的组件保存这些配置信息于外部,当镜像启动为容器时,只需要让镜像去加载外部的配置中心中的配置信息,就能完成应用程序的配置。

  7. 存储编排
    把存储卷实现动态供给,当容器需要存储卷时,根据容器自身的需求创建能够满足其需要的存储卷

  8. 任务批处理运行

k8s 架构

  • k8s就是一个组合多台主机的资源整合成一个大的资源池,并统一对外进行计算、存储等能力的集群
  • master
    • API Server 负责接收并处理请求
    • Scheduler 调度容器创建的请求
    • Controller 确保已创建的容器处于健康状态
    • Controller Manager 确保后端节点上的控制器处于健康状态
  • nodes Kubelet 与master通信的集群代理 容器引擎
    • docker
      在这里插入图片描述

k8s 专业术语

  1. pod (是我们调度的最小单元)
  • K8s的最小调度逻辑单元
  • pod可以理解为是容器的外壳,它为容器做了一层抽象的封装
  • pod内部主要是用来放容器的
  • pod的特点是可以将多个容器加入到同一个网络名称空间中
  • 一个pod中可以包含多个容器
  • 同一个pod中的不同容器可以共享存储卷
  • 一个pod上无论是有一个容器还是有多个容器,一旦将此pod调度到某node上运行时,这一个pod内的所有容器只能运行在同一个node上
  1. node (用来跑pod的位置)
  • node是k8s集群中的工作节点,负责运行由master指派的各种任务。而最核心的任务就是以pod形式运行容器
  • node可以是任何形式的计算设备,只要此设备上能够有传统意义上的CPU、内存、存储空间,并且能装上k8s的集群代理程序,它都可以作为整个k8s集群一个成员
  1. 标签选择器(用来控制pod的)
  • 当大量的pod运行在一个集群当中时,如何实现分类管理?比如想删除某一类pod,比如想让控制器去管理一部分pod,它怎么进行管理?如何挑选、检测出来这些pod呢?值得肯定的是,这么多的pod,我们不能通过pod的名称来识别容器,因为pod随时都会被创建和删除,当一个pod发生故障被删除后,重新生成的pod的名称与被删除的pod名称肯定是不一样的,只不过其内部运行的程序是一样的,所以我们不能靠pod的名称来识别。同时我们有可能要将一类pod归组,比如创建4个nginx的pod,期望使用一个控制器对其进行统一管理,删除一个控制器就把这4个pod都删了,控制器还要保证这4个pod都处于运行状态,缺一个要补一个,多一个要多杀—个,精确符合我们期望的4个pod才行。
  • 为了能够实现pod识别,需要在pod之上附加一些元数据,类似dockerfle中的label标签的方式,比如在创建pod时为其附加一个名为app的key,然后将其值设为nginx,那么当我们在批量进行pod调度管理时,可以检查pod中是否有app这个key,且其值是否为nginx,通过此种方法来识别pod是否是我们想要控制的pod
  • 标签是在k8s上管理大规模pod资源并且能够分类识别和管理的一个非常重要的途径
  • 那么怎么从众多的pod中筛选出我们想要的pod呢?通过标签选择器组件我们可以实现这个功能
  • 标签选择器就是一种根据标签来过滤符合条件的资源对象的机制

Kubernetes主要功能

Kubernetes是开源容器集群管理系统,是基于Docker构建一个容器的调度服务,提供资源调度、均衡容灾、服务注册、动态扩缩容等功能套件。Kubernetes提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用,其主要功能如下:

  • 数据卷: Pod中容器之间共享数据,可以使用数据卷。
  • 应用程序健康检查: 容器内服务可能进程堵塞无法处理请求,可以设置监控检查策略保证应用健壮性。
  • 复制应用程序实例: 控制器维护着Pod副本数量,保证一个Pod或一组同类的Pod数量始终可用。
  • 弹性伸缩: 根据设定的指标(CPU利用率)自动缩放Pod副本数。
  • 服务发现: 使用环境变量或DNS服务插件保证容器中程序发现Pod入口访问地址。
  • 负载均衡: 一组Pod副本分配一个私有的集群IP地址,负载均衡转发请求到后端容器。在集群内部其他Pod可通过这个ClusterIP访问应用。
  • 滚动更新: 更新服务不中断,一次更新一个Pod,而不是同时删除整个服务。
  • 服务编排: 通过文件描述部署服务,使得应用程序部署变得更高效。
  • 资源监控: Node节点组件集成cAdvisor资源收集工具,可通过Heapster汇总整个集群节点资源数据,然后存储到InfluxDB时序数据库,再由Grafana展示。
  • 提供认证和授权: 支持属性访问控制(ABAC)、角色访问控制(RBAC)认证授权策略。
    除此之外, Kubernetes主要功能还体现在:
    • 使用Docker对应用程序包装(package)、实例化(instantiate)、运行(run)。
    • 将多台Docker主机抽象为一个资源,以集群的方式运行、管理跨机器的容器,包括任务调度、资源管理、弹性伸缩、滚动升级等功能。
    • 使用编排系统(YAML File)快速构建容器集群,提供负载均衡,解决容器直接关联及通信问题
    • 解决Docker跨机器容器之间的通讯问题。
    • 自动管理和修复容器,简单说,比如创建一个集群,里面有十个容器,如果某个容器异常关闭,那么,会尝试重启或重新分配容器,始终保证会有十个容器在运行,反而杀死多余的。Kubernetes的自我修复机制使得容器集群总是运行在用户期望的状态. 当前Kubernetes支持GCE、vShpere、CoreOS、OpenShift。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值