小少带你走进“kubernetes”的世界


一、kubernetes的特性(资源管理器)

  • 轻量级
    ①一些解释性语言:例如Python/JavaScript / Perl /Shell,效率较低,占用内存资源较多
    ②使用go语言,编译型语言,语言级别支持进程管理,不需要人为控制,所以以go开发的资源消耗占用资源小

  • 开源

  • 自我修复(控制器控制pod,保证pod可以维持我们所期望的副本数量3)
    ①在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
    ②对异常状态的容器进行重启或重建(先删除、再创建),目的是保证业务线不中断

  • 弹性伸缩
    ①Yml --> 阈值 cpu使用率 > 80% ——》触发扩容pod (CPU使用上限,docker-cgroup k8s —> 1、limit 2、configmap-配置文件 ),使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
    ②伸缩,扩容和缩容(节点 应用类型nginx)
    ③弹性,人为只要指定规则,满足条件时,就会自动触发 扩容或缩容的操作

  • 自动部署和回滚
    ①K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。

  • 服务发现()和负载均衡
    K8S为多个pod(容器)提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
    使用IPVS(章文嵩)框架“替代”iptables

  • 机密和配置管理(secret——》安全/认证加密性的数据 )
    管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

  • 存储编排
    挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。

  • 批处理
    ①提供一次性任务(job),定时任务(crontab);满足批量数据处理和分析的场景
    ②K8S 目标是为了让部署容器化应用、管理容器集群资源更加简单高效

二、kubernetes组件

2.1pod(最小资源单位)

  • 一个pod会封装多个容器组成一个子节点的运行环境(最小单元)
  • 最小部署单元
  • pod内最少跑3个容器,分布是基础容器pause+运行容器+主应用
  • 一个Pod中的容器共享网络命名空间(基础容器提供的pause)

2.2资源清单

  • K8S中资源的概念: 在kubernetes中,所有控制器,组件等都称为资源
  • 资源清单格式(资源清单/配置文件):在k8s中,一般使用yaml格式的文件来创建符合我们预期期望的pod
  • 创建资源的方法
    ①apiserver 仅接受JSON格式的资源定义
    ②yaml格式提供配置清单,apiserver 可自动将其转为JSON格式,而后再提交
  • Pod 生命周期:收到kubectl指令–>初始化容器(init container),生成文件(init可以有多个,但是不可以同时运行)–>创建容器成功–>start容器–>readnessProbe(就绪性特征):就绪检测–> liveness Probe (存活性探针):生存检测–>stop容器
    ①InitC:是一个pod中先于应用容器启动的容器
    ②init总是运行到成功完成为止,init结束后pod不会退出,多个init不能同时运行
    ③mainC主容器启动后需要一些必要的文件和目录的访问权限,而最好不包含产生这些容器的工具(冗余和安全性),所以,initC包含了这些工具和访问权限,直接给mainC提供这些文件
    ④保证容器都启动完成,不会让容器间的关联性,启动顺序导致pod一直重启
    ⑤若pod重启,所有的init都要重新执行
  • readiness: pod创建成功,但是容器里的应用没有部署完成,但是对外显示running,实际上并不能访问,就绪检测完成后pod才对外显示running。
  • liveness:liveness监测到主容器不能正常工作时,启用重启策略
  • Pod phase容器探针
    ①在Pod中担任linux命名空间共享的基础
    ②启动Pid命名空间,开启init进程
  • Pod hook(钩子):是由Kubernetes管理的kubelet发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。可以同时为Pod中的所有容器都配置 hook
  • Hook的类型包括两种
    ①exec:执行一段命令
    ②HTTP:发送HTTP请求

2.3pod控制器

2.3.1什么是控制器

  • 对不同的对象及其特性使用不同的方式控制管理

2.3.2控制器说明

ReplicaSet  	确保预期的Pod副本数量
Deployment  	无状态应用部署
StatefulSet     有状态应用部署(IP得固定)
DaemonSet  		确保所有Node运行同一种Pod
Job  			一次性任务
Cronjob         定时任务

2.4服务发现(service同一个访问入口)

  • 通过service这个统一入口/定义的访问策略对外暴露服务

  • K8S内部的Pod 通讯是以一组私有地址进行通讯的,所以默认情况下无法直接为客户端(服务、用户)提供访问

  • 可以通过Service服务发现,把我们内部的pod资源暴露给客户端访问(以暴露一个ip:端口的方式),

  • 让客户端可以通过这个IP:端口的形式访问到K8S内部的多个pod(通常意义上是一个应用的副本集)

2.5存储(服务分类)

  • 无状态服务:LVS
    ① 服务不依赖自身的状态,实例的状态数据可以维护在内存中。
    ②任何一个请求都可以被任意一个实例处理。
    ③ 不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。
    ④ 在一个封闭的系统中,只存在一个数据闭环。
    ⑤ 通常存在于单体架构的集群中
  • 有状态服务(如数据库,需持久化)
    ①服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。
    ②一个请求只能被某个节点(或者同等状态下的节点)处理。
    ③存储状态数据,实例的拓展需要整个系统参与状态的迁移。
    ④在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。
    ⑤通常存在于分布式架构中。

2.6调度器

  • K8S会自动完成把一个新的pod 调度到对应的节点(预选/优选算法)
  • 对于生产环境上,我们往往会需要将pod创建的过程(比如创建到的节点位置)进行管理,
    ① 指定节点位置创建Pod(指定调度)
    ② 将不同的Pod创建在一个节点上(亲和)
    ③ 将不同的Pod 创建在不同的节点上(反亲和)
    ④ 根据自己的需要,对pod进行节点组装等

2.7Label标签

  • 标签,附加到某个资源上,用于关联对象、查询和筛选
  • 创建一个POD
    ① 编写pod yml文件(nginx资源怎么跑,用什么环境变量,需不需要资源限制,要调度到哪个节点) label:nginx
    ② 把pod 暴露出去,Service,通过yml文件定义 label:nginx
    通过同一个label标签,进行关联,组合在一起

2.8Namespaces(命名空间)

  • 将对象逻辑上隔离
  • 资源名称空间:网络、user、pid 、
  • k8s自带名称空间default 、kube-system

2.9Annotations(注释)

  • 描述性信息

2.10集群安全(RBAC,通讯加密–ca书加密手段)

  • 认证、鉴权、访问控制、原理及流程
  • 从搭建集群,就需要用到加密,CA认证
  • 管理和控制,必须先通过认证/授权,才能进行管理
  • 应用,nginx、squid ,需要一些访问控制策略

2.11HELM(K8S 中包的管理工具)

  • 类似linux里面yum
  • helm 安装 magodb
  • helm 模板、自定义

三、K8s架构

3.1master组件

①kube-apiserver
Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口 服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给 Etcd存储。
② kube-controller-manager(控制器管理中心-定义资源类型)
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager 就是负责管理这些控制器的。
③ kube-scheduler 根据调度算法(预选/优选的策略)为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
④ etcd
分布式键值存储系统(特性:服务自动发现)。用于保存集群状态数据,比如Pod、Service等对象信息

3.2node组件

① kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期,比如创 建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
kubelet 先和docker 引擎进行交互,docker容器 (一组容器跑在Pod中)
② kube-proxy(四层) 对于七层的负载,k8s官方提供了一种解决方案ingress-nginx
在Node节点上实现Pod网络代理,维护网络规则、pod之间通信和四层负载均衡工作。
默认会写入规则至iptables ,目前支持IPVS、同时还支持namespaces
③ docker或rocket
容器引擎,运行容器。

3.3用户访问流程

● 假设用户需创建 nginx资源(网站/调度)kubectl ——》auth ——》api-server
基于yaml 文件的 kubectl create run / apply -f nginx.yaml(pod 一些属性,pod )
● 请求发送至master 首先需要经过apiserver(资源控制请求的唯一入口)
● apiserver 接收到请求后首先会先记载在Etcd中
● Etcd的数据库根据controllers manager(控制器) 查看创建的资源状态(有无状态化)
● 通过controllers 触发 scheduler (调度器)
● scheduler 通过验证算法() 验证架构中的nodes节点,筛选出最适合创建该资源,接着分配给这个节点进行创建
● node节点中的kubelet 负责执行master给与的资源请求,根据不同指令,执行不同操作
● 对外提供服务则由kube-proxy开设对应的规则(代理)
● container 容器开始运行(runtime 生命周期开始计算)
● 外界用户进行访问时,需要经过kube-proxy -》service 访问到container (四层)
● 如果container 因故障而被销毁了,master节点的controllers 会再次通过scheduler 资源调度通过kubelet再次创建容器,
恢复基本条件限制(控制器,维护pod状态、保证期望值-副本数量)
pod ——》ip 进行更改——》service 定义统一入口(固定被访问的ip:端口)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值