• 【K8S】kubernetes基础原理


    K8S】kubernetes基础原理

    Kubernets是什么

    Kubernetes的缩写为:K8S,这个缩写是因为k和s之间有八个字符的关系。
    Kubernetes是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes拥有一个庞大且快速增长的生态系统。Kubernetesd的服务、支持和工具广泛可用

    Kubernetes 特点

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

    Kubernetes的特性

    轻量级

    • 使用go语言——>>编译型语言,语言级别支持进程管理,不需要人为控制,所以以go开发的资源消耗占用资源小

    开源

    自我修复

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

    弹性伸缩

    • 使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务
    手动弹性伸缩(针对于pod),当I/O读/写、磁盘、内存的压力(单个pod) > 80% , 修改replicasets :3->4 更新一下nginx.yml
    
    自动:Yml --> 阈值 cpu使用率 > 80% ——》触发扩容pod (CPU使用上限,docker-cgroup k8s --->  1、limit
    
    伸缩:扩容和缩容
    弹性:人为只要指定规则,满足条件时,就会自动触发扩容或缩容的操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    自动部署和回滚

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

    服务发现和负载均衡

    • 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
    • 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡

    机密(加密配置)和(普通)配置管理

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

    存储编排(静态、动态)

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

    批处理

    • 提供一次性任务(job),定时任务(crontab);满足批量数据处理和分析的场景

    kubernetes组件

    Pod(最小的资源单位)

    • 一个pod 会封装多个容器组成一个子节点的运行环境 (最小单元,容器的种类3+)
    • 最小部署单元
    • 一组容器的集合(基础容器 + 初始化容器+ 业务容器(主应用容器+挂斗/副容器)
    init容器:初始化容器环境
    pause容器:在pod内提供network namespace和存储卷支持
    业务容器/应用容器,提供业务运行(跑业务的)
    
    • 1
    • 2
    • 3

    Pod内容器网络使用什么模式

    • localhost和container

    资源清单(YML)

    K8S资源管理器中资源的“配置文件”

    • K8S中资源的概念
    • 资源清单格式(资源清单/配置文件):Yaml/语法
    • Pod 生命周期(创建——》发布/暴露(service)——》更新——》回滚——》删除)

    Pod 控制器(维护Pod状态,期望值)

    什么是控制器?

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

    控制器说明:

    • **ReplicaSet(RS子控制器):**确保预期的Pod副本数量和状态
    • **Deployment:**无状态应用部署,无特殊状态,无独立状态的应用
    • **StatefulSet:**有状态应用部署(IP得固定)有状态应用部署,特性之一是 启动与关闭pod,都是有先后启动/关闭顺序的 依次启动与关闭
    • **DaemonSet:**确保所有Node运行相同服务/应用的一个Pod
    • **Job:**一次性任务
    • **Cronjob:**定时任务
    • **ingress:**管理的是L7层的网络模式,流量管理(http/https流量)
    • **ingress包含:**nginx、Haproxy、traffic、istio、kong
    • **PV PVC:**动态存储
    无状态服务:LVS
    • 服务不依赖自身的状态,实例的状态数据可以维护在内存中
    • 任何一个请求都可以被任意一个实例处理
    • 不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点
    • 在一个封闭的系统中,只存在一个数据闭环
    • 通常存在于单体架构的集群中
    有状态服务:

    例如数据库(需要持久化)

    服务本身依赖或者存在局部的状态数据,这些数据需要自身持久化或者可以通过其他节点恢复。
    一个请求只能被某个节点(或者同等状态下的节点)处理。
    存储状态数据,实例的拓展需要整个系统参与状态的迁移。
    在一个封闭的系统中,存在多个数据闭环,需要考虑这些闭环的数据一致性问题。
    通常存在于分布式架构中

    简化:
     
    无状态服务:就是没有特殊状态的服务,各个请求对于服务器来说统一无差别处理,请求自身携带了所有服务端所需要的所有参数(服务端自身不存储跟请求相关的任何数据,不包括数据库存储信息
     
    有状态服务:与之相反,有状态服务在服务端保留之前请求的信息,用以处理当前请求,比如session等
     
     
    超简化:
     
    有状态服务:需要持久化,多次请求之间需要共享一些信息
    无状态服务:一次性,不需要持久化,每次请求都是一条新的数据
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    有点像docker -p -P

    K8S内部的Pod 通讯是以一组私有地址进行通讯的,所以默认情况下无法直接为客户端(服务、用户)提供访问,可以通过Service服务发现,把我们内部的pod资源暴露给客户端访问(以暴露一个ip:端口的方式),让客户端可以通过这个IP:端口的形式访问到K8S内部的多个pod(通常意义上是一个应用的副本集)

    通过service这个统一入口/定义的访问策略对外暴露服务,Service 作为一组Pod 的统一访问出入口(定义一组Pod的访问策略),以RR分流算法进行负载均衡,把Pod中的应用服务暴露出来给客户端访问service ——》暴露方式是四层的

    访问的方式是通过kube-proxy 匹配iptables功能进行转发的(四层)
    k8s官方默认提供了四层的代理/负载均衡方式,而我们可以借助于官方后续支持的ingres-nginx 提供七层转发/负载均衡

    service

    service有几种模式

    • nodePort
    把pod映射出去,使用的ip是node节点的IP和端口范围
    先经过servicce,会端口和IP映射为节点的端口和IP,然后在过网关防火墙LB出去
    
    • 1
    • 2
    • ClusterIP
    k8s内部默认的一种扁平化通讯的一种方式
    
    • 1
    • headless
    无头服务,直接把pod暴露出来,不会使用service的IP和端口,一般用于内部
    
    • 1
    • loadbalance(LB)
    给pod做负载均衡 是L4(节点)/L7(集群) 软件/硬件 
    
    • 1
    • ExternalIP(overlay)
    不经过servicer 直接出网关防火墙LB,外面访问也是直接访问pod
    
    • 1

    服务之间对接:通过service

    CNI插件(container network interface 容器网络接口)

    为了让Pod之间可以进行通讯(不同节点之间)

    CNI主要类型

    • flannel
    flannel的几种模式
    vxlan(默认)
    geteway(网关)
    UDP模式(不用了)
    
    • 1
    • 2
    • 3
    • 4

    面试题:flannel的几种模式,有什么区别,udp和vxlan有何区别

    • 我们只考虑vxlan封装策略,因为flannel的特性之一,也是主控的书数据传输和转发
    • 公司用的,改不了

    用于不同节点之间Pod通讯

    pod的ip是怎么被分配的
    k8s集群中有一个核心组件ETCD核心数据库,存储集群中所有的资源信息,包括pod——ip的分配
    
    假设node1节点上的pod1和node2节点上的pod3进行通讯
    
    pod1发送来过,通过veth对,经过docker0,被flannel 0的钩子函数勾过去,flannel 0查看路由信息,根据路由信息确定pod3在node2节点(读取etcd中的路由信息知道opd3在哪个节点),然后将这个信息给予到flannel守护进程,守护进程会发送给网卡,并且对数据进行重新封装.将pod的源IP和目标ip封装到正常数据包的协议之后,通过网卡进行UDP的传输。
    
    到node2的网卡接收到后,解封装解封到协议后,发现元pod1的IP和目标pod的IP.目标pod IP是pod3的在自己节点上,然后将数据包给予到flannel守护进程,守护进程会给予到自己的alannel 0,然后在给到对应的docker 0 ,最后docker 0给到pod3
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • calico

    主控的角度是路由策略

    BGP(动态路由) IP——IP(隧道模式 稍多)
    
    • 1
    • canal

      策略和传输、转发封装 (两手抓)

    创建service需要servicecontroller,EndpointController,kube-proxy,三大模块同时协作

    servicecontroller

    当一个service对象状态发生变化的时候,Informer都会通知serviceController,创建对应的服务

    endpointcontroller
    • Endpointcontroller会同时订阅service和Pod的增删事件。其功能如下:
    • 负责生成和维护所有endpoint对象的控制器
    • 负责监听service和对应pod的变化
    • 监听到service被删除,则删除和该service同名的endpoint对象
    • 监听到新的service被创建,则根据新建service信息(YAML)获取相关pod列表,然后创建对应endpoint对象
    • 监听到service被更新,则根据更新后的service信息获取相关pod列表,然后更新对应endpoint对象
    • 监听到pod事件,则更新对应的service的endpoint对象,将podip记录到endpoint中
    • 主体:service pod
    • 主体:endpoint对象

    功能:定义后端位置和自动发现、自动更新

    kube-proxy

    kube-proxy负责service实现,实现了k8s内部service和外部node port到service的访问

    kube-proxy采用iptables的方式配置负载均衡,基于iptables的kube-proxy的主要职责包括两大块:一块是侦听service更新事件,并更新service相关的iptables规则;一块是侦听endpoint更新事件,更新endpoint相关的iptables规则(如KUBE-SVC-链中的规则),然后将包请求转入endpoint对应的Pod

    小结:
     
    serviceController:是控制service来创建对应的Pod关联的规则的
     
    endpointController:是定义后端pod的具体位置,也就是endpoint (upstream +consul的自动发现和更新)
     
    kube-proxy:是用来定义具体的后端转发和分流规则的
     
    以上组成了一个service所必要的功能
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    存储

    静态存储

    volumes

    动态存储
    • 保障容灾性
    • 为有状态应用提供持久化支持 PV PVC Ceph + nfs

    调度器(Scheduler)

    简单来说就是确定pod要跑在哪个节点的组件

    K8S会自动完成把一个新的pod 调度到对应的节点(预选/优选算法)对于生产环境上,我们往往会需要将pod创建的过程(比如创建到的节点位置)进行管理

    例如:

    • 指定节点位置创建Pod(指定调度)
    • 将不同的Pod创建在一个节点上(亲和)
    • 将不同的Pod 创建在不同的节点上(反亲和)
    • 根据自己的需要,对pod进行节点组装等

    预选:排除基础条件不符合的节点,例如 资源不够,节点有污点,节点禁止调度,节点做了反亲和

    优选:在预选后,根据更加精细化的算法来打分+权重值最后得出总分,并择优选择

    标签(Label)

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

    • label:可对资源“打上标记”
    • 通过selector标签选择器,来将不同类型的资源,通过相同标签关联在一起(耦合/组合在一起)

    创建一个Pod

    1、编写pod yml文件(nginx资源怎么跑,用什么环境变量,需不需要资源限制,要调度到哪个节点) label:nginx

    2、把pod 暴露出去,Service——》通过yml文件定义 label:nginx

    命名空间(namespaces)

    将对象逻辑上隔离,主要为了方便管理

    资源名称空间:网络、user、pid

    • default
    • kube-system
    • kube-node-release
    • kube-public

    在同一个名称空间的pod可以通信(创建pod不指定默认在default里)

    名称空间限制pod数量

    生产环境:一般会新建一个namespace,专门放置一些项目/服务使用的pod资源

    注释(annotations)

    Annotations :注释(描述性信息)

    集群安全

    K8S集群中所有的资源,组件包括外部向内部访问,服务运行等等,均需要安全

    • CA证书
    • RBAC准入控制权限管理
    • 秘钥、token形式等等

    认证、鉴权、访问控制、原理及流程

    从搭建集群,就需要用到加密,CA认证

    管理和控制,必须先通过认证/授权,才能进行管理

    跑的一些应用,nginx、squid ——》需要一些访问控制策略

    HELM(K8S 中包的管理工具)

    类似linux里面yum

    helm 安装 magodb

    helm 模板、自定义

  • 相关阅读:
    C. Dolce Vita Educational Codeforces Round 127 (Rated for Div. 2)
    当当API接口开发系列(商品详情页面和按关键词搜索商品列表)
    Pandas数据处理分析系列3-数据如何预览
    锚点链接的使用
    使用SpringBoot整合数据库连接池Druid的错误总结
    基于Java+SpringBoot+vue前后端分离校园周边美食探索分享平台设计实现
    无法启动此程序,因为计算机中“找不到msvcp140.dll”的解决方法
    Eigen 由三点求平面方程及平面法向量
    Unirech腾讯云国际代充-云服务器cvm常见问题解答
    阿里云易立:以增效促降本,容器服务全面进入智能化时代
  • 原文地址:https://blog.csdn.net/y1701/article/details/127607963