首页 > 技术文章 > kubernetes构架及组件介绍

wml3030 2021-11-15 15:25 原文

传统部署时代

早期在物理机上直接运行应用程序,无法对其定义资源边界,导致资源不分配,其他的程序性能下降

虚拟化部署时代

虚拟化允许应用程序在VM之间隔离,并提供安全界别,但是不能自由访问应用程序
因为虚拟haul可以轻松添加或更新应用程序,减低硬件成本,所有可以更好的利用资源,可以时实现更好的可伸缩性,每个mv都是一台完整的计算机。
因为调用的是虚拟资源所有没有特别的优质底层资源。

kubernetes概述

kubernetes是一个开源的可移植,可扩展的容器编排调度引擎,使用GO语言开进行发。和docker容器结合在一起,可实现容器技术的分布式架构方案。主要用于自动化部署,扩张和管理容器类应用,提供资源调度,部署管理,服务发现,扩容缩容,监控等功能。
它的目标不仅仅是一个容器编排功能,二十题共一个应用规范,用户可以描述集群的架构,定义服务的最终状态,kubernetes可以将系统达到和维持在这个状态。

使用kubernetes具备的好处

  • 具备微服务架构
    微服务架构背后有多个实例副本支撑,二k8s平台中内嵌的负载均衡调度器发挥着重要作用

  • 具备超强的横向扩容能力

kubernetes服务功能

  • 数据卷:当pod容器之间想要共享数据时,可以使用数据卷
  • 应用程序监控检查
  • 复制应用程序实例:保证一个pod或一组同类的pod数量始终可用
  • 弹性伸缩:根据设定的指标(cpu利用率)自动缩放pod副本数
  • 服务发现:使用环境变量或dns服务插件保证容器中程序发现pod入库访问地址
  • 负载均衡:一组pod副本分配一个私有的集群ip地址
  • 滚动更新
  • 服务编排
  • 资源监控
  • 提供认证和授权:支持角色访问

kubernetes服务特点

  • 服务发现和负载均衡:如果容器的流量很大,kubernetes可以负载均衡分配网络流量,从而包含智能服务部署的稳定性
  • 存储编排:可以自动挂载选择的存储系统
  • 自动部署和回滚
  • 自动二进制打包
  • 自我修复:可以重启失败的容器,替换容器,杀死不响应用户定义的云行状况检查的容器
  • 密钥与配置管理:

kubernetes应用场景

  • 快速部署应用
  • 快速扩展应用
  • 物非对接新的应用功能
  • 节省资源,优化硬件资源的使用

kubernetes架构

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

master节点组件

master节点提供集群的管理控制中心,对集群进行全局决策,并检测和响应集群事件,基本上k8s所有的控制命令都是发送给master,master负责具体的执行过程,建议master节点占据一个独立的服务器并做高可用

  • kube-apiserver:用于暴露kubernetes api接口,任何资源请求/调用操作都经过它,提供了http rest接口的关键服务进程,是kubernetes中有的资源的增删改查等操作的唯一入口,也是集群控制入口进程

  • Etcd:是kubernetes听的默认存储,所有集群数据都保存在其中。使用时建议备份

  • kube-scheduler:是负责资源调度的进程,监视新创建且没有分配到node的pod

  • kube-controller-manager:运行管理控制器,是集群中吃力常规任务的后台进程,是kubernetesi所有资源对象的自动化控制中心。

    • 节点控制器(node controller):对每个节点进行检查pod状态,并且响应
    • 复制控制器(replication controller):负责维护正确数量的pod
    • 端点控制器(endpoints controller):填充端点对象(即连接servers 和 pods)
    • 服务账户和令牌控制器:为新的命名空间创建默认账户和api访问令牌

node节点

node节点是k8s集群中的工作负载节点,每个node都会别master分配一些工作负载,当某个node宕机时,node上的工作负载会被master转移到其他的node节点上去

  • kubelet:负责pod对应容器的创建,启停等任务,同时与master节点密切协作,实现管理
  • kube-proxy:用于实现酷比二本 Service之间的通信与负载均衡机制
  • docker Engine(docker):docker引擎,负责本机的容器创建和管理工作

node节点可以在运行期间动态增加kubernetes集群中,前提是这个节点上已经正确安装,配置和启动上述关键进程。默认情况上下,kubelet会向master注册自己。一旦node节点被纳入集群管理范围,kubelet进程会定时向master汇报自身情况。

插件(Addons)

插件使用kubernetes资源实现集群功能。因为这些提供集群级别的功能,所以插件的命名空间资源我属于kube-system命名空间

  • DNS
  • dashboard:一个web界面,很方便。

除了核心组件,还有一些推荐的Add-ons:

  • kube-dns负责为整个集群提供DNS服务
  • Ingress Controller为服务提供外网入口
  • Heapster提供资源监控
  • Dashboard提供GUI
  • Federation提供跨可用区的集群
  • Fluentd-elasticsearch提供集群日志采集、存储与查询

kubernetes资源对象
kubernetes所有的资源对象都可以通过其提供的kubectl工具进行增删改查等操作,并将其保存在Etcd中持久化存储。

  • pod(豆荚):是kubernetes创建或部署的最小的基本单位,一个pod代表集群上正在运行的一个进程。一个pod由一个或多个容器组成,od中容器可以共享存储和网络。在同一台docker主机上运行,每个pod都有一个特殊的别称为“根容器”的pause容器,pause容器对应的镜像属于kubernetes平台的一部分。除了pause容器,每个pod包含一个或多个紧密相关的用户业务容器
  • label(标签):一个label是一个key-value的键值对,其中key与value由用户自己指定,label可以附加到各种资源对象上,一个资源对象可以定义任意数量的label,同一个label也可以被添加到任意数量的资源对象中,可以通过label selector 标签选择器查询和筛选拥有某些label的资源对象
  • replicaset controller(复制控制器 RC):是最早保证pod高可用的api对象,通过监控运行中的pod来保证集群中运行指定数目的pod副本。
    RS与RC唯一区别就是label selector支持不同,RS支持行的基于集合的标签,RC仅支持基于等式的标签
  • Deploymnet(部署):表示用户对k8s集群的更新,也可以是创建一个新的服务,逐渐将新RS中副本数量增加到理想状态,并且将旧RS中的副本数减少到0的复合操作,未来对所有的长期服务型的业务管理
  • service(服务):RC保证了pod数量,deployment保证维护,此时就需要service来解决访问问题,service将pod包含到一起,并对外提供一个访问地址。然后service对其进行负载均衡调度,进行分配。
    是由kube-proxy(负载均衡器)实现的,在k8s的每个node节点都会运行一个kube-proxy组件。
  • jbk(计划任务):用来控制批处理型任务的api对象
  • volume(数据卷):共享pod中容器使用的数据
  • namespace:命名空间将独享逻辑分配到不同的namespace,可以是不同的项目,用户等区分管理
  • statefulset:适合持久性的应用程序,有唯一的网络标志符(ip),持久存储,有序的部署,扩展,删除和滚动更新

kubernetes原理

  • master就是集群的大脑
  • node就是干活的,一般一个node就是一个虚拟机或者物理机,上面部署这docker服务和kubelet服务。

Deployment-应用管理者
当我们有一个k8s集群后,此时可以在上面跑docker可以运行的应用,也就是docker镜像
有了镜像后。就会通过Deployment配合着文件描述应用,写入配置文件.yaml中
有了配置文件就可以通过k8s提供的命令行客户端kubectl去管理这个应用,kubectl会和master通过验证授权连接上api在和RestAPI通信,完成应用管理,例如kubectl create -f .yaml 来创建这个应用。
创建完成,由k8s来保证应用运行。

pod-kubernetes 最小调度单位

pod就是一组容器,可以通过volume共享存储
相同的网络空间,一样的IP地址,一样的网卡和网络设置
互相沟通隧道

service-服务发现-找到每一个pod
上面的Deployment创建后,pod也运行起来了,但是pod-ip+prot来访问时,ip一直在变,并且pod-ip很多,所以,需要一个来对其控制

service通过pod的label标签来对其维护,并且对外提供了多个入口

  • ClusterIP:service在集群内的唯一IP地址
  • nodePort:service会在集群中的每个node启动一个端口
  • loadBalancer:在nodeport的基础上,借助公有云环境创建一个外部的负载均衡器,并将请求转发到nodeip:nodeport上
  • externalname:讲服务通过DNS CNAME记录方式转发到指定的域名


rollingupdate-滚动升级
就是一边增加新版本的pod数量,一边减少旧版本的pod直到0

管理员--kubelet--deployment(nginx.yaml)--label--service--pod--container

推荐阅读