系统架构与设计(6)- Kubernetes(K8s)


Kubernetes,也被称为 K8s 或 Kube,是谷歌推出的业界最受欢迎的容器管理/运维工具(容器编排器)。它是一套自动化容器管理/运维的开源平台,包括部署、调度和节点集群的扩展等。

使用 Kubernetes 可以让开发者从以主机为中心的架构跃升至以容器为中心的架构,真正的以容器为中心的开发环境。

可以将 Docker 容器看作是 Kubernetes 内部使用的低级别的组件,而 Kubernetes 则是管理 Docker 容器的工具。

Kubernetes 的特点:

    (1) 快速精准部署应用程序;
    (2) 即时伸缩应用程序;
    (3) 无缝展示新特性;
    (4) 控制硬件用量;

Kubernetes 的优点:

    (1) 多数互联⽹公司⾥⾯⽤的技术,实现跨主机多容器编排调度管理的最佳技术之⼀;
    (2) 可以实现服务注册发现、DevOps ⾃动部署和回滚,能够⾃动 实现请求的负载均衡分配⽹络流量;
    (3) 在多数互联⽹公司中,Kubernetes 占有率很⾼,是近⼏年⼤量流⾏;
    (4) 可以作为公司内部培训技术分享必备知识,超多案例+实战等;
    (5) 多数国内外的互联网大厂都使用的一门技术;

Kubernetes: https://kubernetes.io/
Kubernetes GitHub: https://github.com/kubernetes


1. 互联⽹项⽬部署⽅式的演进历史

    1) 传统部署时代

        早期的时候,在物理服务器上运⾏应⽤程序。

        缺点:⽆法限制在物理服务器中运⾏的应⽤程序资源使⽤,会导致资源分配问题,过⾼或过低 部署多个物理机,维护许多物理服务器的成本很⾼。

    2) 虚拟化部署时代

        (1) 虚拟化技术允许在单个物理服务器的 CPU 上运⾏多台虚拟机(VM);
        (2) 虚拟化能使应⽤程序在不同 VM 之间被彼此隔离,且能提供⼀定程度的安全性;
        (3) 能够更好地利⽤物理服务器的资源,具有更⾼的可伸缩性,以及降低硬件成本等等的好处;
        
        缺点: 需要单独⼀个系统,占⽤资源;不能灵活的扩容和缩容;

    3) 容器部署时代

        容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。

        Docker 容器化技术:

            (1) ⼀⾏命令可以部署任意⼀个 Mysql、Nginx、Redis、RabbitMQ、Kakfa 等中间件;
            (2) Docker 命令可以操作当前机器上的 1 个容器;
            (3) Docker-compose 可以操作当前机器上的多个容器;
            (4) 容器⽐起 VM 被认为是更轻量级的,每个容器都具有⾃⼰ 的⽂件系统、CPU、内存、进程空间等;
            (5) 跨云和操作系统发⾏版本的可移植性:可在 Ubuntu、CoreOS、CentOS、Google Kubernetes Engine 和其他任何地⽅运⾏;

        容器化部署会遇到的问题:

            (1) 如何在一个机器上发布多个容器?

                答:使用 Docker-compose 轻松搞定!

            (2) 如果 Docker 所在物理主机挂掉了,怎么办?

                答:换个主机重新部署!

            (3) 如果需要在 10 个物理主机上部署 100 个容器,怎么办?

                答1:在每个物理主机主机上手动执行,累是累点,可以完成。

                答2:使用 Docker-swarn, Docker 守护进程的通信工具可以是 Swarn 轻松扩展到多个主机!

            (4) 如果突发流量来了需要快速扩充、代码发布错了需要回滚、应用发布需要灰度、需要配置管理、需要日志监控等,怎么办?

                答:好像,Docker-swarn 只支持部分功能 ...

        很显然问题 (4) 的情况,需要用到功能更强大的容器编排管理软件:

            (1) Docker Swarm:Docker ⾃⼰的容器编排⼯具;
            (2) Mesos:Apache 的资源管控的⼯具,结合 Marathon 使⽤;
            (3) Kubernetes:Google 开源的的容器编排⼯具,基于内部 Borg 系统的开源版本;


2. Kubernetes 相关功能

    说了半天,Kubernetes 是什么呢? 它能干什么?
 
    Kubernetes 的本质是⼀组服务器集群,可以在对应服务器集群的每个 节点上运⾏程序,来对节点中的容器进⾏管理。

    类似 Master-Work ⽅式,每个服务器上安装特定的 K8s 组件,就可以形成集群,然后部署对应的应⽤即可。

    1) 服务发现和负载均衡
    
        Kubernetes 可以使⽤ DNS 名称或⾃⼰的 IP 地址来暴露容器;
        如果进⼊容器的流量很⼤,Kubernetes 能够⾃动实现请 求的负载均衡分配⽹络流量,从⽽使部署稳定;
    
    2) 存储编排

        Kubernetes 允许⾃动挂载选择的存储系统,例如本地存储、云提供商存储等。
    
    3) ⾃动部署和回滚
    
        可以⽤k8s⾃动化部署创建新容器,删除现有容器并将它们的所有资源⽤于新容器;
        当版本发布错误,可以⽴刻回退到之前的版本;
    
    4) ⾃我修复

        如果某个容器宕机了,K8s 可以快速重新启动新的的容器,替换旧的容器。
    
    5) 密钥与配置管理

        K8s允许存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。


3. Kubernetes 的一些重要概念

    1) Cluster (集群)
    
        Cluster(集群)是计算、存储和网络资源的集合。K8s 利用这些基础资源来运行各种应用程序。因此 Cluster 是 K8s 的基础环境。

    2) Master (主控)

        Master 是指集群的控制节点。每个K8s集群中,都至少有一个 Master 节点来负责整个集群的管理和控制。几乎所有的集群控制命令都是在 Master 上执行的。因此,Master 是整个集群的大脑。另外为了实现高可用,用户还可以部署多个 Master 节点。当然,Master节点可以是物理机,也可以是虚拟机。Master 上运行如下程序:

            (1) Kubernetes API Server (Kubernetes API 服务器)

                Kubernetes API Server 的进程名称为 kube-apiserver。Kubernetes API Server 提供了Kubernetes 各类资源对象的增删改查的 HTTP Rest 接口,是整个系统的数据总线和数据中心。Kubernetes API Server 提供了集群管理的 Rest API 接口,包括认证授权、数据校验以及集群状态变更,提供了其他模块之间的数据交换和通信的枢纽,是资源配额控制的入口,有完善的集群安全机制。

            (2) Kubernetes Controller Manager (Kubernetes 控制器管理器)

                Kubernetes Controller Manager 作为集群内部的管理控制中心,负责集群内的 Node 节点、Pod 副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源配额(ResourceQuota)的管理。当某个 Node 意外宕机时,Controller Manager 会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。

            (3) Kubernetes Scheduler (Kubernetes 调度器)

                Kubernetes Scheduler 的作用是根据特定的调度算法把 Pod 调度到指定的工作节点(Node)上,该过程叫做绑定(Bind)。Scheduler 的输入为需要调度的 Pod 和可以被调度的节点的信息,输出为调度算法选择的 Node 节点,并将该 Pod 绑定到这个 Node 节点。

            (4) Etcd
            
                Etcd 是 Kubernetes 集群中一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息。

    3) Node(节点)
    
        在 K8s 中除了 Master,其他的节点都称为 Node 节点。Node 节点是 K8s 中的承担主要计算功能的工作节点。整个 K8s 集群中的 Node 节点协同工作,Master 会根据实际情况将某些负载分配给各个 Node 节点。当某个 Node 节点出现故障,其他 Node 节点会顶上。Node 上运行如下程序:

        (1) Kubelet

            在 K8s 中,每个 Node 节点都会启动 kubelet 进程,用来处理 Master 节点下发到本节点的任务,管理 Pod 和其中的容器。kubelet 会在 API Server 上注册节点信息,定期向 Master 汇报节点资源的使用情况,并通过 cAdvisor 监控容器和节点资源。可以把 kubelet 理解成是一个代理进程,是 Node 节点上的 Pod 管家。

        (2) Kube-proxy

            Kube-proxy 运行在所有的 Node 节点上,它监听每个节点上 Kubernetes API 中定义的服务变化情况,并创建路由规则来进行服务负载均衡。

        (3) Docker 引擎

            Docker 引擎,负责容器的创建和管理等。

    4) Pod
    
        Pod 是 K8s 最基本的操作单元,一个 Pod 中可以包含一个或多个密切相关的容器,一个 Pod 可以被一个容器化的环境看作应用层的逻辑宿主机,一个 Pod 中的多个容器应用通常是紧密耦合的,Pod 在 Node 节点上被创建、启动或者销毁。
        
        每个 Pod 中运行着一个特殊的被称之为 Pause 的容器,其他容器则为业务容器。这些业务容器共享 Pause 容器的网络栈和 Volume 挂在卷,因此它们之间的通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个 Pod 中。
        
        同一个 Pod 里的容器之间仅需通过 localhost 就能互相通信。同一个 Pod 中的业务容器共享 Pasue 容器的 IP 地址,共享 Pasue 容器挂在的存储卷。

    5) Pod Controller

        控制器是管理 Pod 的中间层,只需要告诉 Pod 控制器,想要创建多少个什么样的 Pod,它会创建出满⾜条件的 Pod 并确保每⼀个 Pod 资源处于⽤户期望的⽬标状态。如果 Pod 在运⾏中出现故障,它会基于指定策略重新编排 Pod。

        通过它来实现对 Pod 的管理,⽐如启动 Pod、停⽌ Pod、扩展 Pod 的数量等。

        类型:ReplicaSet、Deployment、Horizontal Pod Autoscaler、DaemonSet 等

    6) Service (服务)
    
        在 K8s 集群中,虽然每个 Pod 都会分配一个单独的IP地址,但这个 IP 地址会随着 Pod 的销毁而销毁。那么如果有一组 Pod 组成一个集群来提供佛那个服务,那么如何访问它呢?通过服务即可。一个服务可以看作一组提供相同服务的Pod的对外访问接口,服务作用于哪些Pod是通过标签选择器来定义的。服务通常拥有以下特点:

            (1) 拥有一个指定的名字,比如 mysql-server。
            (2) 拥有一个虚拟IP地址和端口号,销毁之前不会改变,只能内网访问。
            (3) 能够提供某种远程服务能力
            (4) 被映射到了提供这种服务能力的一组容器应用上。

        如果服务要提供外网服务,就需要指定公共IP和Node端口,或外部负载均衡器。

    7) Label(标签)

        K8S 提供了⼀种机制来为 Pod 进⾏分类,那就是 Label(标签),同⼀类 Pod 会拥有相同的标签 Label 的具体形式是 key-value 的标记对,可以在创建资源的时候设置,也可以在后期添加和修改。

        给某个资源对象定义⼀个Label,就相当于给它打了⼀个标签,可以通过Label Selector(标签选择器)查询和筛选拥 有某些 Label 的资源对象,K8s 通过这种⽅式实现了类似 SQL 的对象查询机制。

        Label 选择器:对应的资源打上标签后,可以使⽤标签选择器过滤指定的标签。

        标签选择器⽬前有两个:

            (1) 基于等值关系(等于、不等于)
            (2) 基于集合关系(属于、不属于、存在)

        层次关系:

            Service -> 标签选择器 -> Pod

    8) Volumes (卷)

        默认情况下容器的数据都是非持久化的。所以 Docker 提供了卷机制以便将数据持久化存储。类似的,Kubernetes提供了强大的卷机制和丰富的插件,解决了容器数据持久化和容器间共享数据的问题。

        与 Docker 不同,Kubernetes 卷的生命周期与 Pod 绑定。容器宕掉后 Kubelet 再次重启容器时,卷的数据依然还在,而 Pod 被删除时,卷才会清理。数据是否丢失取决于具体的卷类型。持久化存储卷为独立于计算资源的一种物理存储资源,不属于任何一个 Node 节点。因此,在 Pod 被删除时,不会丢失数据,除非人工将其删除。

    9) NameSpace (命名空间)

        通过将系统内部的对象分配到不同的命名空间中,形成逻辑上的不同项目、小组或用户组,从而使得在共享使用整个集群的资源的同时还能分配管理它们。

        Kubernetes 集群在启动后,会创建一个名为 default 的默认命名空间,如果不特别指定命名空间,那么用户创建的 Pod、RC、服务都会被系统创建到默认的命名空间中。默认情况下,相同命名空间中的对象将具有相同的访问控制策略。

    10) 应⽤分类

        有状态应⽤ (需要使用之前的数据):

            (1) 不能简单的实现负载均衡的服务、有数据产⽣的服务、如 Redis、MySql、RabbitMQ 等;
            (2) 相关服务须通过⼀些较复杂的配置才能做到负载均衡;
            (3) 有状态的应⽤,建议直接在物理机部署,⽅便维护管理;

        ⽆状态应⽤:

            (1) ⽆状态的应用,能快速扩容(账号服务没有);
            (2) 没有对应业务数据的应⽤,可以简单的实现负载均衡,复制⼀个节点即可快速扩容,如 SpringCloud 中的业务服务;
            (3) ⽆状态的应⽤适合部署在 Kubernetes(K8s)中或者容器中。


4. Kubernetes 集群架构

    1) 整体架构

        K8s 整体架构,是 Client-Server 模型.

        控制节点 Master 负责集群的管理:

            (1) apiserver:提供操作k8s 集群资源的唯⼀⼊⼝,RESTful ⽅式请求,并提供认证、授权、访问控制、API 注册和发现等;
            (2) scheduler:负责资源的调度,按照预定的调度策略,计算将 Pod 调度到相应的 Node 节点进⾏应⽤部署;
            (3) controller-manager:控制器管理中⼼,负责维护集群的状态,⽐如故障检测、滚动更新等,根据调度器的安排通知对应的节点创建 Pod(将上面的调度器设计的)放到对应的容器中去;
            (4) etcd:存储中⼼,是兼具⼀致性和⾼可⽤性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库;

        工作节点 Node 负责为集群提供运⾏环境:

            (1) Node 是 Pod 真正运⾏的主机,可以是物理机也可以是虚拟机, Node 本质上不是 K8s 来创建的, K8s 只是管理 Node 上的资源,为了管理 Pod,每个 Node 节点上⾄少需要运⾏ container runtime(Docker)、kubelet 和 kube-proxy 服务;
            (2) kubelet:相当于主节点派到⼯作节点的⼀个代表(小跟班),⽤于管 理本机容器(相当于 Master 节点的化身),负责维护容器 的⽣命周期也负责 Volume(CVI) 和⽹络(CNI)的管理
            (3) kube-proxy:负责为 Service 提供 cluster 内部的服务发现/⽹络代理/负载均衡等操作,为部署的应⽤程序提供访问⼊⼝(对外的通讯员),和 apiserver(操作内部的)是不⼀样的,后者是操作 K8s 集群内部的;
            (4) 通过 Kubectl(kubecontroller)进行交互,连接 apiserver,到 etcd 中获取各个资源的 Pod 等连接的情况。再执行调度器进行计算,计算 Pod 到哪一个容器中去。由 apiserver 通知 controller-manager 来决定部署到哪里去。由 controller-manager 通知 Node 节点,然后通过容器引擎,来通知在创建 Pod 部署容器;

    2) K8s 集群类型

        (1) 单个 Master 集群(⼀主多从)

            推荐测试环境,服务器要求:服务器要求⾄少 2 台 2 核 4G 以上的云服务器
            
        (2) 多个 Master 集群 (多主多从,⾼可⽤集群)

            推荐⽣产环境使⽤,服务器要求:服务器要求⾄少 4 台 2 核 4G 以上的云服务器
            
        (3) 单节点 k8s 集群 (单⼀个节点)

            服务器要求:服务器要求⾄少⼀台 2 核 4G 以上的云服务器

    3) K8s 搭建⽅式

        (1) kubeadm 搭建(推荐)

            kubeadm 是⼀个 K8s 部署⼯具,提供 kubeadm init 和 kubeadm join ⽤于快速搭建 K8s 集群,推荐使用。

        (2) 二进制包搭建

            从 github 下载发⾏版的二进制包,⼿动部署每个组件, 组成 Kubernetes 集群。需要了解底层知识,步骤繁琐,坑⽐较多。

        (3) Minikube 搭建

            Minikube 是⼀种轻量化的 Kubernetes 集群,是 k8s 社区为了帮助开发者和学习者能够更好学习和体验 k8s 功能⽽推出的,使⽤个⼈ PC 的虚拟化环境就快速构建启动单节点 k8s。

      Minikube 在不同操作系统上支持的驱动类型:

          Linux:Docker(推荐)、KVM2(推荐)、VirtualBox、QEMU(实验性)、None、Podman(实验性)、SSH
               macOS:Docker(推荐)、Hyperkit、VirtualBox、Parallels、VMware、Fusion、QEMU(实验性)、SSH
               Windows:Hyper-V(推荐)、Docker(推荐)、VirtualBox、VMware、QEMU(实验性)、SSH

 


来源: https://blog.csdn.net/qq_29235677/article/details/125878987

posted @ 2022-11-01 20:47  垄山小站  阅读(249)  评论(0编辑  收藏  举报