• K8s基础架构【1】


    一、什么是Kubernetes

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

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

    ①Kubernetes 是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S

    ②K8S用于容器化应用程序的部署,扩展和管理。

    ③K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等-一系列功能。

    ④Kubernetes目标是让部署容器化应用简单高效。

    二、Kubernetes特性

    ①轻量级

    使用GO语言;相对于解释型语言(Shell.Python,java)Go这种编译性语言效率高,占用内存也比解释性语言要少

    ②开源

    ③自我修复

    在节点故障时重启失败的容器,替换和重新部署,以保证达到预期的副本数量,并在未准备好之前不会处理客户端请求(类似Esxi的维护模式,请求不会转发到维护的主机上)来确保线上服务不会中断

    ④弹性伸缩

    使用命令UI或基于CPU使用情况自动快速扩容和缩容,保证在业务高并发时的高可用性,并在业务低峰期回收资源,以最小成本运行服务

    ⑤服务发现和负载均衡

    K8s为多个pod提供一个统一的访问入口(内部的IP和DNS名称),并且负载均衡器关联的所有容器,使用户无需考虑容器IP的问题

    ⑥版本回退

    如果发现新发布的程序版本有问题可用立即回退到原来版本

    ⑦存储编排

    挂载外部存储系统,无论来自本地存储,公有云,还是网络存储(GFS,SAN)都作为集群资源的一部分(类似资源池)使用,极大的提高存储使用的灵活性

    ⑧批量处理

    提高一次性任务(job),定时任务(cronjob)来满足批量数据的处理和分析的场景

    ⑨自动部署和回滚

    K8s采用滚动跟新策略跟新应用,一次跟新一个Pod,而不是以下印象到所有Pod,如果更新过程中出现问题,将回滚更改。确保升级并不会影响业务

    ⑩机密和配置管理  (secret——》安全/认证加密性的数据)

    将机密数据和应用程序配置在K8s这边管理,不需要将敏感数据暴露在镜像里,提高敏感数据的安全性,当然把常用的配置存储在K8s中也方便程序的使用

    三、Kubernetes集群架构与组件

    K8S是属于主从设备模型(Master-Slaver架构),Master节点负责集群的调度、管理、运维Slave节点是集群中的运算工作负载节点

    在K8S中,主节点一般叫做Master节点,从节点一般叫做WorkerNode节点,Master节点向Node节点分配工作和负载

    Master虽然可用在集群中任意一个计算机上运行,但是作为集群中的管理者还是得给其相应的尊重的最好单独分台,如果Master宕机,虽然不会影响已经跑起来的集群,但是所有的控制命令都将失效。除去Master节点,其他的机器称为Worker Node节点,一个Node节点挂掉之后,他的工作负载会被Master迁移到其他节点上去。

    Kubernetes的几大组件

    Master组件

    Kube-apiserver:用于暴露Kubernetes API,任何资源请求和调用操作都是通过kube-apiserver的接口进行,以HTTP Restful API提高接口服务,所有对象资源的增删改查和监听等操作都是交给APIServer处理后再提交给etcd,其实可用这么理解,APIServer负责接受K8S的所有请求,然后通过通知不同的组件来完成不同的用户请求。

    Kube-controller-manager:运行管理控制器,是Kubetnetes中处理常规任务的后台线程,是kubernetes集群中 所有资源自动化控制中心。在kuberbetes中一个资源对应着一个控制器,而Controller是负责管理这些控制器的。通过APIServer来监控整个集群状态,确保集群处于预期的工作状态,列如当某个节点挂掉了,Controller Mangeser会监控到宕机,并执行自动化恢复流程来确保集群处于预期的工作状态

    ControllerManager的控制器:

    控制器

    功能

    NodeController(节点控制器)

    负责发现接地故障以及响应

    ReplicationController(副本控制器)

    保证集群中RC(资源对象)所关联的Pod副本数量始终保持预设值

    EndpointsController(端点控制器)

    填充端点对象(就是将Service和Pod连接),负责监听Server的对应的Pod的副本变化,可用理解断电就是服务所暴露出服务的访问位置,需要访问服务必然要知道他的端点

    Service Account & Token Controllers(服务账户和令牌控制器)

    为新的命名空间创建默认账户和Api访问令牌

    ResourceQuotaController(资源配额控制器)

    限制资源对象不会超量抢占系统资源

    NameSpaceController(命名空间控制器)

    管理namespace的生命周期

    Service Controller(服务控制器)

    属于K8S集群与外部云平台的一个接口控制器

    Kube-scheduler:负责资源调度的进程,依据为新创建的Pod选择一个合适的节点,就是当用户要部署时scheduler会依据调度策略选择最适合做Node的节点来部署Pod。

    k8s的调度策略:

    预选策略:将不符合运行条件的节点直接筛除

    优选策略:在符合运行条件中的节点在选最适合的节点

    存储中心

    etcd:分布式键值存储系统(特性:服务自动发现)。用来保存数据,如Pod、Service等对象信息。Kubernetes中只有APIserver具有读写权限,其他组件必须得通过APIServer接口才能读取数据。

    Node组件

    Kublete作为node节点的监视器和Master节点的通讯器存在的。Kbulete会定期向Master发生所监视节点的运行的服务状态,并接受Master下达的指示来采取调整措施。Kublete是直接和容器引擎交互实现容器生命周期的管理。Kublete从Master上获取到自己节点上Pod的期望状态,如果自己节点的pod与master期望不一致时则调用容器创建从而达到预期状态。并且Kublete会管理镜像和容器的清理功能,保证节点上镜像不会占满磁盘空间,且丢弃的容器不会占用太多的资源

    Kube-Proxy:在每个节点上实现pod网络代理,我们面向的并不是pod而是kube-proxy,是kubernetesservices的载体,它实际上维护的是虚拟的Pod集群网络,且Kuber-apiserver通过监控kube-proxy来进行对Kubernetes Server的更新和端点的维护。

    在k8s里面微服务的负载均衡就是由Proxy来实现的,它是一个分布式代理服务器

    工作流程

    kubectl创建一个Pod的流程:

    首先先到Auth进行鉴权,如果通过就会通过APIserver将请求消息提交给Etcd

    scheduler和controller-manager会监听APIserver

    scheduler监听到了请求后scheduler会提交一个list(清单)里面包含着需要获取的node的节点信息给APIserver让他去Etcd获取后端Node节点的信息

    schedulert监听到了信息会通过预选/优选进行打分再将打分好的信息交给APIServer,此时collentermanager监听到信息会根据请求创建Pod的信息(需要用啥控制器)将控制器资源给到APIServer。

    APIServer根据scheduler的list去寻找到相应的Kubelet

    Kubelet通过K8S与容器的接口(如containerd)进行交互,假设如果是docker容器的话,此时Kubelet会通过docekrshim以及runc接口与docker的守护进程docker-server进行交互,来创建对应的容器,再生成对应的Pod

    Kubelet同时会借助metrics server收集本节点的所有状态信息,然后再提交给APIServer

    最后APIServer会提交list清单给etcd来存储(更新)

  • 相关阅读:
    (学习日报)2022.7.20
    计算机毕业设计JavaWeb端校园报修系统(源码+系统+mysql数据库+lw文档)
    QTcpSocket发送数据方法
    记录--`ElementUI` 中的奇技淫巧
    [附源码]计算机毕业设计JAVA点餐系统
    网络编程、OSI七层协议
    HTMl案例二:注册页面
    .NET高级面试指南专题二十六【适配器模式介绍,用于将一个类的接口转换成客户端所期待的另一个接口】
    HTB-Devel
    go版本1.16.5 运行项目出现undefined: math.MaxInt报错
  • 原文地址:https://blog.csdn.net/weixin_52190986/article/details/126978338