前言

  • Kubernetes是用于管理容器化应用程序集群的工具,在计算机领域中,此过程通常称为编排;

  • 用管弦乐编排比喻上面的服务编排是很恰当的,就像乐队指挥一样,Kubernetes协调地将许多微服务组合在一起构成了应用程序。Kubernetes会自动且持续地监视集群并对其组成进行调整;

  • 了解Kubernetes架构对于部署和维护容器化的应用程序至关重要。

一、什么是Kubernetes

  • Kubernetes或简称k8s,是Google在2014年开源的一个容器集群管理系统;

  • K8s 是一个用于自动执行应用程序部署的系统。现代应用程序分散在云,虚拟机和服务器之间,手动管理应用程序不再是可行的选择。

  • K8s 将虚拟机和物理机转换为统一的API切面。然后,开发人员可以使用Kubernetes API来部署,扩展和管理容器化的应用程序。

    • 它的体系结构还为分布式系统提供了一个灵活的框架。K8s为您的应用程序自动协调扩展和故障转移,并提供部署模式。

    • 它有助于管理运行应用程序的容器,并确保生产环境中没有停机时间。例如,如果某个容器发生故障,则另一个容器会自动取代其位置,而最终用户根本不会注意到。

  • Kubernetes不仅是一个编排系统。它是一组独立的,相互关联的控制过程。它的作用是在当前状态下连续工作,并朝着期望的方向移动过程;

  • K8s 提供了容器编排、资源调度、弹性伸缩、部署管理,服务发现等一系列功能;

  • Kubernetes 目标是让容器化应用简单、高效。Kubernetes 的服务、支持和工具被广泛可用。

二、K8s的发展

  • 传统部署时代

    • 早期,组织在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。
    • 缺点:当在物理服务器上运行多个应用程序,可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。并且组织维护许多物理服务器的成本很高
  • 虚拟化部署时代

    • 作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的 CPU 上运行多个虚拟机(VM)。虚拟化功能允许应用程序在 VM 之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一应用程序自由地访问。
    • 因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性;
  • 容器部署时代

    • 容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。
    • 容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和 OS 分发进行移植;

三、K8s 具备的特性

  • 1)自我修复

    • ①在节点故障时重新启动失败后的容器,替换和重新部署,保证预期副本数量;
    • ②杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
  • 2)弹性伸缩

    • 使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务;
  • 3)自动部署和回滚

    • K8s 采用滚动更新策略更新应用,一次更新一个pod,而不是同时删除所有pod;如果更新过程中出现问题,将回滚更改,确保升级不受业务影响;
  • 4)服务发现和负载均衡

    • K8s 为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题;
  • 5)机密和配置管理

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

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

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

四、K8s 架构图与核心组件

4.1 Kubernetes 集群架构图

在这里插入图片描述

4.2 Kubernetes 各组件详解

  • 从架构图中,我们可以看出:
    • ①master节点主要由 apiserver、controller-manager 和 scheduler 三个组件,以及一个用于集群状态存储的etcd存储服务组成;
    • ②而每个node节点则主要包含 kubelet、kube-proxy 及容器引擎等组件。此外,完整的集群服务还依赖于一些附加组件,如 kubedns 等。

4.2.1 Master 节点组件

  • Master组件:提供集群的管理控制中心。

    • Master组件可以在集群中任何节点上运行,但是为了简单起见,通常在一台VM/机器上启动所有Master组件,并且不会在此VM/机器上运行用户容器。
  • ① kube-apiServer(核心组件)

    • Kubernetes API,集群的统一端口,各组件协调者,以 RESTful api 提供接口服务,所有的对象资源的增删改查和监听操作都是叫给 APIServer 处理后再提交给 Etcd 进行存储。
  • ② kube-controller-manager

    • 处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManaager就是负责管理这些控制器的
    • 控制器包括(部分):
1. 节点控制器:负责在节点出现故障时进行通知和响应;

2. 复制控制器:负责为系统中的每个复制控制器对象维护正确数量的Pod;

3. 端点控制器:填充“端点”对象(即,加入“服务和窗格”);

4. 服务帐户和令牌控制器:为新的名称空间创建默认帐户和API访问令牌。
  • ③ kube-scheduler

    • 根据调度算法为新创建的pod选择一个Node节点,可以任意部署;
      可以部署在同一个节点上,也可以部署在不同的节点上。
    • 调度算法有:
      预选算法,过滤nodes
      优选算法,对nodes打分
  • ④ Etcd

    • 分布式键值存储系统,用于保存集群状态数据,比如Pod、Service等对象信息;
    • Etcd 具有服务发现系统,这是mysql、Oracle数据库锁没有的,同时还有以下特点:
1. 简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单

2. 安全:支持SSL证书验证

3. 快速:根据官方提供的benchmark数据,单实例支持每秒2K+读操作

4. 可靠:采用raft算法,实现分布式系统数据的可用性和一致性

4.2.2 Node 节点组件

  • 提供Kubernetes运行时环境,以及维护pod,节点组件有:

  • ① kublet

    • kubelet 是Master在Node节点上的Agent,管理本机运行容器的生命周期。比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
  • ② kube-proxy

    • 在Node节点上维护网络规则,实现pod网络代理,四层负载均衡工作。
  • ③ docker或rocket

    • 容器引擎,运行容器

4.2.3 Add-ons 附加组件

1. kube-dns:负责为整个集群提供DNS服务;

2. Ingress Controller:为服务提供外网入口;

3. Heapster:提供资源监控;

4. Dashboard:提供GUI;

5. Federation:提供跨可用区的集群;

6. Fluentd-elasticsearch:提供集群日志采集、存储与查询

五、K8s 单节点架构

5.1 单节点简易图

在这里插入图片描述

5.2 流程详解

1. 假设用户需创建 tomcat 资源(网站/调度);

2. 请求发送至master 首先需要经过apiserver(资源控制请求的唯一入口);

3. apiserver 接收到请求后首先会先记载在Etcd中;

4. Etcd的数据库根据controllers manager(控制器) 查看创建的资源状态(有无状态化);

5. 通过controllers 触发 scheduler (调度器)6. scheduler 通过验证算法 验证架构中的nodes节点,筛选出最适合创建该资源,接着分配给这个节点进行创建;

7. node节点中的kubelet 负责执行master给与的资源请求,根据不同指令,执行不同操作;

8. 对外提供服务则由kube-proxy开设对应的规则(代理);

9. container 容器开始运行(runtime 生命周期开始计算);

10. 外界用户进行访问时,需要经过kube-proxy 访问到container;

11. 如果container 因故障而被销毁了,master节点的controllers 会再次通过scheduler 资源调度通过kubelet再次创建容器,恢复基本条件限制。

六、Kubernetes 核心概念详解

  • Pod

    • ① 最小部署单元
    • ② 一组容器的集合
    • ③ 一个pod中的容器共享网络命名空间(可以理解在同一个局域网)
    • ④ pod 是短暂的(有生命周期)
  • Controllers

    • ① ReplicaSet:确保预期的 Pod 副本数量(参数,可进行设置)

    • ② Deployment:无状态应用(例如:web、nignx、apache、tomcat)

    • ③ StatefulSet:有状态应用部署,该应用独一无二无法重新创建进行完美替代,例如mysql、Oracle数据库

    • ④ DaemonSet:确保所有的Node运行同一个Pod(把所有的Node设置为同一个命名空间)

    • ⑤ Job:一次性任务(类比 linux:at)

    • ⑥ Cronjob:定时任务(类比 linux:crontab)

    • 更高层次对象,部署和管理Pod

  • Service

    • ① 防止pod失联
    • ② 定义一组pod访问的策略(主要作用)
    • ③ 确保每个pod之间的独立性(安全)
  • Label

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

    • 命名空间,将对象逻辑上隔离
  • Annotations

    • 注释

七、kubernetes部署方式

  • 官方提供的三种部署方式分别为:
    • ① minikube
      是一个工具,可以在本地快速运行一个单点的kubernetes,仅用于尝试kubernetes或日常开发的用户使用。
    • ② kubeadm
      也是一个工具,提供 kubeadm init 和 kubeadm join,用于快速部署kubernetes集群
    • ③ 二进制包
      推荐使用,从官方下载发行版的二进制包,手动部署每个组件,组成kubernetes集群。
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐