kubernetes

kubernetes

kuberenetes简介

Kubernetes(通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写)是一个以容器为中心的基础架构,可以实现在物理集群或虚拟机集群上调度和运行容器,提供容器自动部署、扩展和管理的开源平台。满足了应用程序在生产环境中的一些通用需求:应用实例副本、水平自动扩展、命名与发现、负载均衡、滚动升级、资源监控等。

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化工作负载和服务,有助于声明式配置和自动化。它拥有庞大且快速发展的生态系统。

Kubernetes发展史

Kubernetes由Joe Beda,Brendan Burns和Craig McLuckie创立,并由其他谷歌工程师进行加盟创作,谷歌在2014年首次对外宣布。在谷歌内部,Kubernetes的原始代号曾经是Seven,即星际迷航中友好的Borg(博格人)角色。Kubernetes标识中舵轮有七个轮辐就是对该项目代号的致意。

Kubernetes v1.0于2015年7月21日发布。随着v1.0版本发布,谷歌与Linux 基金会合作组建了Cloud Native Computing Foundation (CNCF)并把Kubernetes作为种子技术来提供。CNCF又名云原生技术基金会。

为什么要使用kubernetes

总所周知kubernetes是一个容器编排工具,可以高效、批量的去管理容器;那么有人就要问了,docker有自带的docker-compose(单机编排)和docker-Swarm(多机编排),为什么还要用k8s,Docker-Compose的运用可以充分地把单物理服务器的性能充分利用起来,并且可以快速地进行持续交付,那如何高效地进行监控各个容器的健康运行情况以及崩溃后如何迁移服务呢?也就是常见的集群管理问题,此时的docker Swarm技术解决了这个问题,但是如何更加高效、智能的管理容器集群呢?这时谷歌公司内部使用很久k8s横空出世,抢占了近80%的市场份额,成为行业领头羊,为什么k8s能击败docker Swarm呢?那是因为kubernetes的这些:

  1. 快速部署功能:定义对应的charts,可以方便把大型的应用部署上去。
  2. 智能的缩扩容机制:部署时候会自动去考虑容器应该部署在哪个服务器上,以及副本的数量可以自定义。
  3. 自愈功能:某个节点的服务崩溃了,可以自动迁移到另外一个服务器节点来恢复来实现高可用。
  4. 智能的负载均衡:利用Ingress,可以实现流量通过域名访问进来时候,进行流量的分流到不同服务器上。
  5. 智能的滚动升降级:升级或者降级时候,会逐个替换,当自定义数量的服务升级OK后,才会进行其他的升级以及真正销毁旧的服务。

技术对比

技术 应用场景 资源占用比
docker 单机部署简单应用
Docker-Compose 单机/少数机器部署应用
Docker-Compose 集群部署高可用应用

Kubernetes 特点

  1. 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
  2. 可扩展: 模块化, 插件化, 可挂载, 可组合
  3. 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
  4. 快速部署应用,快速扩展应用
  5. 无缝对接新的应用功能
  6. 节省资源,优化硬件资源的使用

kubernetes特性

  • 自动装箱:基于资源依赖及其约束能够自动完成容器的部署且不影响其可用性
  • 自我修复:一旦容器崩了,可以自动启动一个新的容器代替从而实现自我修复
  • 自动实现水平扩展:水平扩展(横向扩展),一个容器不够,再启动一个,可以不断的进行扩展,只要物理平台的资源足够支撑。
  • 密钥和配置管理:当镜像启动为容器的时候,可以让容器自动去加载外部的配置中心的配置信息,便能完成程序的配置。
  • 储存编排:把储存卷实现动态供给,当容器需要储存卷时,根据容器自身的需求创建能够满足其需要的储存卷
  • 自动进行服务发现和负载均衡
  • 自动发布和回滚
  • 任务批处理运行

kubernetes专业术语

Pod和Service是Kubernetes中较为核心的两个概念。
pod是什么?
pod可以理解为容器的外壳,它为容器做了一层抽象的封装,pod里面运行容器,pod的特点是可以将多个容器加入到同一个网络名称空间中。同一个pod可以共享储存卷。
一个pod上无论是有一个容器还是有多个容器,一旦将此pod调度到某个node上运行时,这一个pod内的所有容器只能运行在同一个node上。

node是什么?
node是kubernetes集群中的工作节点,就是负责工作的。
node可以是任何形式的计算设备,能装k8s的集群代理程序,它都可以作为整个k8s集群一个成员。

标签选择器是什么?
当大量的pod运行在一个集群中时,怎么批量进行管理呢?想只控制一部分的pod时又该如何?如何挑选和检测这些pod?有人会想到通过名称来识别容器,但是pod是随时删除和创建的,名称也会随着pod的删除和创建而发生改变。这样我们就给一类的pod进行分组,就是在创建pod时为其附上app的key的一个键值对,这样我们进行批量操作时可以通过检查pod中是否存在app的key,来实现对多个pod的控制,这样就会有一个新的问题了,怎么实现对多个标签的管理呢?这里我们就可以通过标签选择器组件来实现。

标签选择器就是一种根据标签来过滤符合条件的资源对象的机制。

Pod与service

  1. Pod是Kubernetes里最小的资源管理对象,Pod运行在Node节点上,容器运行在Pod里,Pod里包含一个根容器和一个或多个业务容器,一般来说,紧密相关联的几个业务进程会被以不同的容器镜像的形式放在同一个Pod里。
  2. Node、Pod、容器间关系
    Pod有两种类型,普通的Pod和静态Pod,静态Pod存放在某个具体的Node上的一个具体文件中,且只在此Node上运行;普通的Pod一旦创建,就会被放入到etcd存储中,随后会被Master节点调度到某个具体的Node上进行绑定,然后被该Node上的kubelet进程实例化为一组相关的Docker容器并启动起来。
  3. Service简称(Svc)
    Svc就是一个“微服务”,Svc定义了一个服务的访问入口地址,前端应用(Pod)通过这个入口地址访问其背后的一组由Pod副本组成的集群实例。Service与其后端的Pod之间通过Label
    Selector实现“无缝对接”,Replication
    Controller(简称RC)的作用是通过满足要求的Pod副本数,保证Svc的服务能力和服务质量始终处于预期的标准。

这里我们思考一个问题就是后端的多个Pod副本实例保证Svc的服务能力,为前端提供服务,前端是如何访问后端的多个Pod的呢?那就的用到负载均衡了。

Kubernetes的集群节点及架构

架构示意图
kubernetes
Kubernetes/K8s 高可用架构图
kubernetes

  1. master节点在kubernetes中称为Kubernetes控制平面

master节点负责整个集群的管理和控制,基本上Kubernetes所有的控制命令都发给它。执行的命令一般都是在Master上执行,Master节点一般是独立运行在一台主机上,并且由于Master节点至关重要,一旦宕机会导致整个集群的失效不可用,这样我们可以对master节点做高可用,来保证服务的正常运行。

  1. node节点

除了Master节点,还有其他的节点被称为node都是负责实际工作的,master只是用来发送命令的,就类似于saltstack上的master端用来发送命令,正真工作的是minion端。

master的组件

  • etcd分布式持久化存储
  • API服务器 负责接收并处理请求
  • 调度器(Scheduler) 调度器创建的请求
  • 控制器管理器(controller Manager)确保后端节点上的控制器处于健康状态
  • 控制器(controller) 确保已创建的容器处于健康状态

node(工作节点)的组件

  • Kubelet 与master通信的集群代理
  • Kubelet服务代理(kube-proxy)
  • 容器进行时(Docker,rkt或者其他)

Kubernetes核心组件

Kubernetes Master是集群的主要控制单元,用于管理其工作负载并指导整个系统的通信。Kubernetes控制平面由各自的进程组成,每个组件都可以在单个主节点上运行,也可以在支持high-availability clusters的多个主节点上运行。

Kubernetes主要由以下几个核心组件组成:

组件名称 作用
etcd 保存整个集群的状态
apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制
controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
scheduler 负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
kubelet 负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
Container runtime 负责镜像管理以及Pod和容器的真正运行(CRI)
kube-proxy 负责为Service提供cluster内部的服务发现和负载均衡

Kubernetes核心概念

master:master指的是集群控制节点,来负责整个集群的管理和控制,基本上k8s的所有控制命令都是发给它。我们后面执行的命令基本都是在master节点上运行的。通常它会占据一个独立的x86服务器(或一个虚拟机)

Node:k8s集群中其他机器被称为node节点,Node可以是一台物理机,也可以是一台虚拟机。当某个node宕机,其上的工作负载会被master自动转移到其他节点上。

Pod

  • 最小部署单元
  • 一组容器的集合
  • 一个Pod中的容器共享网络命名空间
  • Pod是短暂的

Controllers

  • RelicaSet:确保预期的Pod副本数量
  • Deployment:无状态应用部署
  • StatefulSet:有状态应用部署
  • DaemonSet:确保node运行同一个Pod
  • Job:一次性任务
  • Cronjob:定时任务

Service

  • 防止Pod失联
  • 定义一组Pod访问策略

Label:标签,附加到某个资源上,用于关联对象、查询和筛选

Namespace:命名空间,将对象逻辑上隔离

Annotation:注释

Volume:存储卷

RC

  • 确保Pod数量: 它会确保Kubernetes中有指定数量的Pod在运行,如果少于指定数量的Pod,RC就会创建新的,反之会删除多余的,保证Pod的副本数量不变
  • 确保Pod健康: 当Pod不健康,RC会杀死不健康的Pod,重新创建新的
  • 弹性伸缩: 在业务高峰或者低峰的时候,可以用RC来动态调整Pod数量来提供资源的利用率吧,当然也可以使用HPA来实现
  • 滚动升级: 滚动升级是一种平滑的升级方式,通过逐步替换的策略,保证整体系统的稳定性

HPA(horizontal Pod Autoscaler):Pod自动弹性伸缩,K8S通过对Pod中运行的容器各项指标(CPU占用、内存占用、网络请求量)的检测,实现对Pod实例个数的动态新增和减少

kubernetes用途

在您生产环境中使用 Kubernetes 的主要优势在于,它提供了一个便捷有效的平台,让您可以在物理机和虚拟机集群上调度和运行容器。更广泛一点说,它可以帮助您在生产环境中,完全实施并依托基于容器的基础架构运营。由于 Kubernetes 的实质在于实现操作任务自动化,所以您可以将其它应用平台或管理系统分配给您的许多相同任务交给容器来执行。

利用 Kubernetes,您能够达成以下目标:

  • 跨多台主机进行容器编排。
  • 更加充分地利用硬件,最大程度获取运行企业应用所需的资源。
  • 有效管控应用部署和更新,并实现自动化操作。
  • 挂载和增加存储,用于运行有状态的应用。
  • 快速、按需扩展容器化应用及其资源。
  • 对服务进行声明式管理,保证所部署的应用始终按照部署的方式运行。
  • 利用自动布局、自动重启、自动复制以及自动扩展功能,对应用实施状况检查和自我修复。

但是,Kubernetes 需要依赖其它项目来全面提供这些经过编排的服务。因此,借助其它开源项目可以帮助您将 Kubernetes 的全部功用发挥出来。这些功能包括:

  • 注册表,通过 Atomic 注册表或 Docker 注册表等项目实现。
  • 联网,通过 OpenvSwitch 和智能边缘路由等项目实现。
  • 遥测,通过 heapster、kibana、hawkular 和 elastic 等项目实现。
  • 安全性,通过 LDAP、SELinux、RBAC 和 OAUTH 等项目以及多租户层来实现。
  • 自动化,参照 Ansible 手册进行安装和集群生命周期管理。
  • 服务,可通过自带预建版常用应用模式的丰富内容目录来提供。
上一篇:记录若依SysConfigMapper.selectConfigList初始化加载不到问题


下一篇:Android JNI调用OpenCV,长时间运行内存异常,导致闪退的log分析和解决---(ReferenceTable overflow (max=1024)造成的)