收藏 分销(赏)

企业运维之云原生和Kubernetes 实战.pdf

上传人:Stan****Shan 文档编号:1240295 上传时间:2024-04-19 格式:PDF 页数:341 大小:36.80MB
下载 相关 举报
企业运维之云原生和Kubernetes 实战.pdf_第1页
第1页 / 共341页
企业运维之云原生和Kubernetes 实战.pdf_第2页
第2页 / 共341页
企业运维之云原生和Kubernetes 实战.pdf_第3页
第3页 / 共341页
企业运维之云原生和Kubernetes 实战.pdf_第4页
第4页 / 共341页
企业运维之云原生和Kubernetes 实战.pdf_第5页
第5页 / 共341页
点击查看更多>>
资源描述

1、卷首语汹涌的数字化浪潮正给全球带来洗礼和革新,从传统 IDC 到云计算的转变,云计算已经成为信息化发展的重要基础设施,而云原生在数字化浪潮中的角色也逐步提升,迅速成为业务创新发展和降本增效的重要驱动力。云原生正以强劲的发展姿态,剑指云计算的下一个十年,乃至有望成为新的基础设施。数据显示,云原生计算基金会(CNCF)拥有 700 多位成员组织和 100 多个开源云原生项目,整个云原生生态呈爆发式增长,可以说绑定云原生就是绑定未来十年。各大云厂商都在大力发展云原生,通过收购或合作的方式补齐自身的短板,以谋求未来在云原生竞争中争得一席之地。据 Gartner 表示,“鉴于安全性、监控、数据管理和网络

2、等方面的影响,容器在企业生产部署环境中的使用仍受限制。”据此,与 2021 年 1 月,红帽公司计划收购容器和 Kubernetes 原生安全领域公司 StackROX,计划将其能力与红帽 OpenShift 结合;同年 12 月,GitLab 公司收购 Opstrace,用以扩展其 DevOps 平台,抢占集成 DevOps 工具市场更大份额;同月提供云基础设施自动化服务的 HashiCorp 公司上市,成为全球市值最高的开源公司。云原生涵盖的技术领域越来越多,但目前最为关键的三项技术依然是:容器、微服务、服务网格等。据云原生产业联盟中国云原生用户调查报告显示:“2021 年,云原生技术领域

3、的建设投入、集群规模持续走高,用户应用及软件发布更加频繁。在用户生产环境中,容器技术采纳率近 70%,Serverless 技术持续升温,应用用户近四成。”回顾 2021 年云原生技术,呈现以下发展趋势:一、容器无处不在。容器可屏蔽异构环境的差异,构建以应用为中心的多环境管理界面,向下管理 IaaS 层基础设施,让应用软件在异构环境中输出、运维、交付;向上支撑各项任务,承接大数据、数据库、AI、中间件等服务,增强存储计算分离、混合部署、运维自动化等能力。容器打破了云的边界,让云的能力大幅延伸扩展,逐渐演变成“云原生操作系统”,呈现出“计算无界,承载无限”的发展趋势。二、Serverless 持

4、续演进。据 SlashData 云原生开发现状报告显示,使用容器编排工具的开发者达 460 万,使用 Serverless 平台开发者达 400 万,使用两者占比为 180 万。2021 年Knative 发布,提升 Serverless 容器应用交付端到端的使用体验和易用性,成为 K8s 上安装广泛的 Serverless。如今,很多企业服务正全面 Serverless 化,开发者无需关注运维等通用操作,可以更专注在核心业务的研发。三、应用层核心技术开源。在开源吞噬软件的趋势下,应用层的云原生开源项目将越来越多,开源面向最广泛的开发者群体,建立技术标准和生态,吸引更多人来使用开源技术,形成良

5、好的发展趋势。四、软硬协同优化。通过容器的高密高频场景驱动计算、网络和存储进一步优化。例如阿里云通过容器+神龙裸金属、RDMA 联合优化等软硬件协同方案释放更多性能红利。我们可以看到,以云为核心的新型计算体系结构正在形成,该体系从三个层次演进:在基础设施层,云向下定义硬件、自研芯片、服务器、操作系统等底层技术,建设以云为核心的硬件体系;核心软件基于云来重构,开源社区成为创新中心,同时催生低代码等新型开发方式,让云更易用;在应用层,未来随着 5G 网络发展,计算和数据加速向云上迁移,催生云电脑、元宇宙、自动驾驶等新物种。从产业效用方面来看:云原生极大地释放了云的红利,云原生充分继承云的设计思想,

6、未来应用将更多基于云上进行本土应用开发,即云原生应用更加适合云的架构,而云计算也为云原生应用提供较好的基础支撑,如资源隔离、分布式、高可用等,云原生最大程度发挥了云的优势。云计算的拐点已至,云原生成为驱动业务增长的重要引擎。云计算的发展已进入成熟期,云原生作为新型基础设施支撑数字化转型的重要支撑技术,逐渐在人工智能、大数据、边缘计算、5G 等新兴领域崭露头角,成为驱动数字基础设施的强大引擎。伴随全行业上云的逐步深化,企业云原生化转型进程将进一步加速。从技术特征方面来看:云原生技术架构具备以下典型特征:极致的弹性能力,不同于虚拟机分钟级的弹性响应,以容器技术为基础的云原生技术架构可实现秒级甚至毫

7、秒级的弹性响应;服务自治故障自愈能力,基于云原生技术栈构建的平台具有高度自动化的分发调度调谐机制,可实现应用故障的自动摘除与重构,具有极强的自愈能力及随意处置性;大规模可复制能力,可实现跨区域、跨平台甚至跨服务商的规模化复制部署能力。从应用价值方面来看:异构资源标准化,容器技术有效解决了异构环境的部署一致性问题,促进了资源的标准化,为服务化、自动化提供了基础;加速数字基础设施升级解放生产力,降低用户数字化技术的使用门槛,提高资源的复合利用率,变革研发运营的生产方式,打破组织壁垒,实现研发与运维的跨域协同,提升交付效率,解放生产力;提升业务应用的迭代速度,赋能业务创新。云原生技术实现了应用的敏捷

8、开发,大幅提升交付速度,降低业务试错成本,高效响应用户需求,增强用户体验加速业务创新。云原生是面向云应用设计的一种思想理念,充分发挥云效能的最佳实践路径,帮助企业构建弹性可靠、松耦合、易管理可观测的应用系统,提升交付效率,降低运维复杂度。代表技术包括不可变基础设施、服务网格、声明式 API 及 Serverless 等。基于以上种种,为了帮助用户更好地理解云原生,拥抱云原生,阿里云全球技术服务部联合开发者学堂推出了“企业运维训练营之云原生和 Kubernetes 实战”,并基于训练营的演讲内容沉淀此电子书,与各位开发者分享。目录第一章 云原生和 K8S 基础入门8容器和 K8S 基本概念(上)

9、9容器和 K8S 基本概念(下)25理解 Pod 和容器设计42kubectl 客户端使用方法及如何创建应用和暴露服务55Kubernetes 存储72Kubernetes 网络82实验一:从 0 开始创建云原生应用89第二章 阿里云容器技术深入介绍102阿里云容器镜像服务103阿里云容器服务集群应用管理131Kubernetes 调度和资源管理138负载均衡与路由147阿里云容器服务集群存储160阿里云容器服务集群日志和监控170实验二:应用部署进阶180第三章 Kubernetes 集群原理深度解析193深入剖析 linux 容器&Pod(上)194深入剖析 linux 容器&Pod(下)

10、208集群创建 POD 的过程221阿里云 ACK 集群控制器227阿里云 ACK 集群网络234实验三:灰度发布246第四章 ACK 集群管理257ACK 集群权限管理258ACK 集群升级278ACK 集群节点管理286ACK 集群弹性伸缩299ACK 集群故障处理与疑难处理312实验四:流水线部署325第一章 云原生和 K8S 基础入门分享人:余凯(言澈)9第一章 云原生和 K8S 基础入门容器和 K8S 基本概念(上)一、容器基本概念谈到容器和 K8S 基本概念,需要对以下问题进行思考:云原生、微服务和容器之间的关系;容器带给人的第一印象;容器的含义;容器具有几个重要的专有名词,这些学

11、术用语之间的关系;容器的本质。在“容器和 K8S 基本概念”这一小节结束后,对于这几个问题,应当有所理解。10第一章 云原生和 K8S 基础入门提到容器的第一概念,人们首先会想到装水的杯子、盛饭的碗、盛菜的盘子都是容器。容器在英文中叫 container,而 container 在中文的另一层含义是集装箱,并且用集装箱来形容更有利于对容器概念的理解。首先,集装箱是有一定标准的长宽高的一个长方体的箱子,每个箱子都是有一定的长宽高尺寸标准的,这是集装箱的第一层概念。第二,集装箱装载的货物,比如在上海码头装载货物,运送到纽约码头,或者说运送到新加坡码头,然后在当地进行卸货之后可以马上送到客户的手上。

12、所以集装箱不用在乎装载地和卸货地,只关心货物是否能运到。因此,不关心码头地点,是集装箱的第二个特点。第三,举个例子,三个集装箱,第一个运送到纽约,第二个运送到新加坡,第三个运送到欧洲。第一个集装箱里的货物会送到纽约,而不会跑到欧洲,这说明集装箱有一层隔离的作用,送到纽约的集装箱里的货物,不会跑到运送到新加坡的箱子里,也不会跑到运送到欧洲的箱子里。因此,集中箱有第三个特点,具有隔离作用。第四,集装箱装载货物的时候,码头不关心集装箱里面装的到底是车还是衣服等,都可以进行运输。这是集装箱的四个特点,而容器也有类似的四个特点。11第一章 云原生和 K8S 基础入门谈到容器的作用或者说容器解决了什么问题

13、,其实在正常的一个生产环境进行开发时,一定是在一个测试环境把所有应用测试完毕,符合一定的测试条件和测试结果之后,才会将应用发布到生产环境中。然而应用在测试环境中没有问题,但在生产环境中就经常会出现各种各样的问题。这些问题很多时候是底层的操作系统的原因,比如操作系统的不一致导致了环境变量的不一致,也可能导致了环境库的不一致等等。而应用的开发者往往需要花费大量时间去解决生产系统和测试系统之间应用环境不一致的问题。实际上,应用开发者对底层操作系统的层面并不关心,更关心的是上层的应用。需要一种办法,让开发者完全把精力专注于上层应用,而不需要关注底层的操作系统一致性和库的一致性,因此诞生了容器技术。容器

14、技术的特点和集装箱的特点类似。集装箱的第一个特点是具有标准的长宽高,类似地,容器运行也需要一定的运行环境,比如说底层的 Docker。集装箱的第二个特点是不在乎码头在哪里,容器也不在乎底层的操作系统类型,主流的 Linux操作系统都可以运行容器。目前阿里云容器服务 ACK 已经可支持 Windows 操作系统,也就是对阿里云 ACK 来说,容器也可以部署在一个 Windows 操作系统上。不在乎底层的操作系统,12第一章 云原生和 K8S 基础入门这是容器的第二个特点。集装箱的第三个特点是具有隔离作用。同样地,为了保证不同容器的应用不会相互干扰,容器也具有自己的隔离技术。容器的隔离技术利用 L

15、inux 的 cgroup 和 namespace,进行网络命名空间级别的隔离,以及利用 cgroup 进行相关资源的限制。集装箱的第四个特点是码头不关心箱子里装载的货物是什么,容器也具有轻量便捷的特点。正因为容器可以运行在所有操作系统上,开发者可以只关注容器本身运行的应用,而不需要花费太多时间去维护底层的操作系统,所以容器可以做到便捷和轻量,实现快速部署和快速迁移等等。除了容器技术,虚拟机也是一项热门的虚拟机技术,也实现了隔离。想要知道虚拟机和容器技术之间的区别,首先了解一下虚拟机。现在比较流行的虚拟机的相关技术和公司,包括VMware 公司的虚拟机,微软公司的 Hyper-V 的虚拟机,以

16、及 Linux 的一个 KVM 虚拟机。虚拟机有什么特点呢?首先,所有的机器是基于物理分别的,也就是有物理级别的 CPU,物理级别的内存,物理级别的 IO 等。而虚拟机是运行在基于这些物理层级别之上的 Hypervisor 层。Hypervisor 层的作用是把这些物理级别的资源转化成虚拟的 CPU、memory、IO 再提供给上层的虚拟机,然后上层的虚拟机基于这些虚拟的 CPU、memory、IO 安装自己的操作系统,然后在自己的操作系统上安装自己的应用和必要的运行库。13第一章 云原生和 K8S 基础入门那么举个例子,A 虚拟机装的是一个 Linux 操作系统,B 虚拟机装的是一个 Win

17、dows 操作系统,C 虚拟机装的是一个 centos 操作系统,这样一个宿主机上就存在了三核操作系统,每个操作系统之间是相互隔离的,而每个虚拟机都会认为自己是一个单独的机器,这样就会发现一个问题:虚拟机虽然实现了虚拟化,但还是需要关注底层,关注对操作系统的维护。与虚拟机不同的是,在容器技术中,宿主机它可能有自己的操作系统,例如 Windows 系统或者Linux 系统,在这几个操作系统上装上容器的运行环境,然后基于容器的运行环境,例如Docker 运行环境,启动三个容器,容器 A、容器 B 和容器 C,那么这些容器就包含了该容器自己的应用以及应用需要的一些相关库文件。这些容器没有自己的操作系

18、统,而是共用了宿主机的操作系统。相比于虚拟机,容器的第一个区别在于速度。对于虚拟机来说,虚拟机启动的时候是分钟级别的,可能需要好几分钟才能启动。容器因为没有底层的操作系统,只需要安装自己的应用和库文件,所以是秒级启动,很快就会启动。第二个区别体现在迁移上。如果想把一台 VMware 的虚拟机迁移到微软的 Hyper-V 可能要涉及到按照一定的标准和格式把这台 VMware 虚拟机转换成镜像,把镜像再转换成符合微软 Hyper-V 的标准格式,然后才能在 Hyper-V 的操作系统场景下运行。但是容器不需要,不管底层是Windows 还是 Linux,直接可以把镜像拿到 Windows 或者 L

19、inux 运行起来,实现了快速的迁移。一个疑问是,容器既然共用了底层的操作系统,那么容器 A、B、C 之间怎么实现隔离呢?这个隔离技术就是上文提到的利用 namespace 和 cgroup 相结合。还有一个疑问是,假如容器 A、容器 B、容器 C 在 Linux 系统中,通过底层的操作系统处理,能不能用“ps-ef”命令看到 ABC 这三个应用?是可以看到的,虽然是三个应用,但是三个应用实现了命名空间级别的隔离。14第一章 云原生和 K8S 基础入门容器的运行基于容器镜像。容器镜像可以抽象为一个安装包,比如我们装的是一个基本的安装包,例如装一个钉钉安装包,安装包在 Windows 操作系统往

20、往是一个 EXE 结尾的只读文件,不能对它进行写入,而一旦把这个钉钉安装包安装起来之后,就形成了钉钉,然后可以进行聊天,这时候它就变成了可写的。容器镜像是基于 Linux 的 Union File System 这种联合文件系统,联合文件系统类似于洋葱,是一层一层的结构。最基础的一层是 bootfs,作用是在启动的时候用 bootload 加载 kernel,kernel 加载成功后 bootfs 就会退出,把控制权交给 rootfs,而 rootfs 会基于镜像进行加载。例如一个容器的镜像包含了 Apache、emacs、Debian 系统,那么基于这三层进行一层一层叠加,达到最上一层运行成

21、一个容器的时候,容器才是可读可写的,其他层都是只读的。下面对容器镜像的特点进行演示:15第一章 云原生和 K8S 基础入门使用“docker search”命令,可以看到很多可以拉取的容器镜像。使用“docker pull centos”命令拉取 centos 镜像,因为本地就有,所以拉取的时候是一层一层拉的,有唯一的 ID 号,表示是哪一层的东西。只读的好处在于存储空间。如果要制作好几个镜像,例如第一个镜像包括 centos、apache、redis 三层,第二个镜像包括 centos、nginx、mysql 三层,如果只读的话,拉取的时候,本地保证一个 centos 层是唯一的。这样在拉取

22、的时候只要拉取一个,下一个就可以复用已经拉取好的 centos 层,主要拉取差异层。好处就是,制作镜像的时候存储空间压力更小,复用本地的镜像,节省空间,也节省拉取时间和带宽。二、如何构建镜像16第一章 云原生和 K8S 基础入门如何构建容器镜像?容器镜像主要有两个命令。“docker commit”命令是把一个正在运行的容器制作成一个镜像,“docker build”命令是基于 Dockerfile 文件构建镜像。docker commit 基于一个正在运行的容器制作镜像的好处有:17第一章 云原生和 K8S 基础入门比如现在没有容器在进行,本地有 ngnix、centos 基础镜像。“doc

23、ker create”表示通过这条命令把一个镜像文件运行成一个停止的容器。“docker ps”是类似于我们命令的 ps 和 ef,就看哪些程序在运行。“docker start”表示把这个容器启动起来了,这时候可以看到一个正在运行的容器。通过“docker commit”命令可以把正在运行的容器创建镜像,并看到镜像 ID。18第一章 云原生和 K8S 基础入门通过“docker commit”命令可以把正在运行的容器创建镜像。为什么要创建镜像呢?如果正在运行的一个 nginx 是最原始的官方镜像,基于这个正在运行的 nginx 修改了相关主页之后,开发人员希望这个 nginx 不仅可以在这台

24、机器上运行,也可以在其他的机器运行或者进行迁移,这时候就可以基于正在运行的这台容器创作成这个镜像文件,推到仓库,然后在别的机器下把这个创建好的镜像文件下载下来,直接运行就成为一个运行着已修改的主页的 nginx 容器。另一种方式是使用“docker build”命令,基于 Dockerfile 的文件形式进行创建。首先假设创建这个容器镜像的目标是要创建一个基于 centos 的 Tomcat 的镜像文件,实现的途径包括:1、有一个基本的 centos2、本地有 Tomcat3、jdk 程序4、设置环境变量5、暴露端口6、设置工作目录7、容器自己要启动 Tomcat根据这七个步骤,Dockerf

25、ile 文件内容如下:19第一章 云原生和 K8S 基础入门然后可以运行“docker build”命令创建镜像文件。20第一章 云原生和 K8S 基础入门Dockerfile 的作用是,首先创建了一层,例如基于 ubuntu 14.04 运行了一个 ubuntu 14.04 容器,然后挂载相关的 volume,然后基于这个容器,可以进行相关步骤操作生成镜像,再经过这个镜像进行容器的运行。接下来介绍几种 Dockerfile 指令:FROM 指令是基于的基础镜像文件;MAITAINER 命令或者 LABEL 指令是给这个镜像文件打一些标签;RUN 指令是运行一些命令,比如安装一些相关的东西;A

26、DD 指令有点像 COPY,但是比 COPY 多了解压缩功能;WORKDIR 指令是设置进入容器的首要工作目录;VOLUME 指令定义这个存储的管理功能;ENTRYPOINT 指令是容器启动时的默认命令;EXPOSE 指令是设置开放端口。统计启动和默认命令的 expositor 开放端口。21第一章 云原生和 K8S 基础入门三、如何运行容器如何运行一个容器?首先需要容器镜像。本地制作的镜像可以在本地使用,也可以通过说Docker 仓库的方式进行共享。在本地制作的一个镜像,保存在本地,可以把它推送到仓库里,然后其他的合法的用户,连接到这个仓库就能把这个镜像给拉取到各自的本地变成一个本地镜像,然

27、后就可以基于本地镜像运行成一个容器。这样就实现了镜像文件的一个就是和镜像仓库的相互共享。22第一章 云原生和 K8S 基础入门例如本地没有 mysql 镜像,通过“docker search”命令可以查询相关镜像,查询结果中“docker.io”表示是 docker 官方镜像。使用“docker pull”命令拉取 mysql 官方镜像。拉取的过程可以看出镜像文件是一层一层的,有些非常快完成的层可能就是本地已经保存的,如果本地没有的,就会把这一层的文件拉取下来。23第一章 云原生和 K8S 基础入门而通过“docker inspect”命令可以看到镜像的详细信息(ID、运行参数、状态、运行的相

28、关命令等)。基于 Docker 环境,可以使用一些相关的命令。首先“docker images”表示列出镜像。“docker rmi”就是删除 image 镜像。“docker tag”是打标签,“docker history”就是展示镜像历史。把镜像运行成一个容器有几种方法,可以通过“run”命令把镜像文件直接运行成一个 running状态的容器,也可以通过“create”命令把镜像文件运行为一个 stop 状态的容器,然后再通过“start”命令将 stop 状态的容器启动为 running 状态的容器。通过“unpause”和“pause”命令也可以切换容器的状态。“commit”命令可

29、以将一个容器制作成某个需要的镜像。“cp”命令类似“scp”,可以传输容器和宿主机之间的文件。“diff”命令用来查看镜像和容器之间的不同。使用“logs”命令可以查看容器之间运行的日志。仓库和镜像之间的关系包括通过“pull”和“push”进行拉取和提交。通过“login”和“logout”可以实现登录仓库和退出登录,因为推送到仓库需要身份验证。24第一章 云原生和 K8S 基础入门四、小结对第 1 章容器和 K8S 基础概念做一个小结:1、容器的基本概念,容器几个特征,和虚拟机的区别,我们需要容器的原因2、容器怎么制作,dockerfile 几个命令(add、from)3、docker 的

30、命令 images、ps、exec、logs4、容器、镜像、仓库之间的联系25第一章 云原生和 K8S 基础入门容器和 K8S 基本概念(下)一、什么是 K8S?K8S 是一个容器编排工具,K8S 本身不是容器,而是对容器进行编排。编排是要实现一种目的:通过标准化、格式化的各种手段和途径实现目的,让它符合一种平衡状态,即通过 K8S 让容器实现状态。26第一章 云原生和 K8S 基础入门以 docker 来说,docker 已经提供了相关的命令,那为什么还需要容器编排工具呢?比如这台机器数据上运行了两台容器,一个是 nginx,另一个是 tomcat,我们可以通过 docker 命令对它进行相

31、关管理,但是如果有一千个容器,每个都需要用 docker 命令管理,这样压力特别大,因为每个容器相互之间是依存关系,也可能是不依存关系亦或是反亲和的关系。这就体现出K8S 这种容器编排工具的必要性。二、K8S 功能Kubernetes 功能包括以下几个:服务发现与负载均衡假如运行了五个 nginx 容器,这五个 nginx 的作用相同,而一个容器的容量是有一定能力限制的,可能 1000 QPS 的流量负载场景下,nginx 容器就被装满了。单个容器不可能进行无限制的扩容,即使在扩容到一定程度后,它实际上也无法时刻保持满载状态,这对 CPU 资源是极大的占用与浪费。在大流量场景下,更好的方法是把

32、流量分散到不同的 nginx 容器里,每个nginx 只要分配很小的 CPU,无需专门分配一个宿主机来运行,可以在任何宿主上运行。我们就可以通过 K8S 可以实现原目的,通过前端的 VIP 进行一个负载均衡,让流量分发到 nginx上。27第一章 云原生和 K8S 基础入门容器自动装箱容器和容器之间是怎么结合的?假设有容器 A 和容器 B,其中容器 A 为生产容器。生产容器必然会产生日志,且该容器日志将被采集用于生产环境的业务分析,容器 B 则用于分析容器 A的日志。此时,两容器之间就需要绑定,两者一定要在同一节点上。容器 A 在某一节点上产生日志,容器 B 可以采集这个节点上的日志。否则如果

33、容器 B 在别的节点上,就无法访问容器A 的日志节点。K8S 可以执行将两容器绑定的操作。存储编排容器可能需要绑定或挂载 MAS 盘,本地云盘等等。我们可以通过 coubies 得以实现,容器的自动恢复比如有五个容器运行,五个容器中突然挂掉一个,K8S 可以实现自动恢复一个容器或者自动创建一个容器。自动发布与回滚如果 nginx 更新了最新版,发现些许问题,一些相关配置消失,K8S 能快速地将版本回滚。配置与密文即 config map 与 secret 管理。比如部署时,容器需要去和指定的仓库进行身份验证。容器定义好之后,通过保存的密钥文件和配置,容器可以去自动引用。在进行交互的时候能直接使

34、用这些内容,而不需要再次进行输入。批量执行对于 job 类型任务,K8S 可以做到批量的执行水平伸缩假设有五个 nginx 容器,平时流量是够的。但某时刻访问量突然增多了,五个 nginx 可能就无法承受流量。K8S 可以自动根据流量情况来更改副本的大小。流量少的时候就用三个 nginx 容器,就可以释放出两个 nginx 资源,可以用在别的容器上。容量大的时候,就可以自动的变为 8个容器,这样就能够承受更多的流量,访问就不会有卡顿。这个水平伸缩也可以通过kubelet 实现。28第一章 云原生和 K8S 基础入门1、K8S 功能调度假设黄,红,蓝三种颜色的球,表示等待调度的容器,紫色框内表示

35、正在调度的容器,底下表示已经调度的容器。这个白色的方框则是节点,共有十个节点。现在有个问题,假如节点的规格是一致的,认为 2 号节点,5 号节点,6 号节点,8 号节点通过 K8S 的这个集群,都能满足这个节点标志。通常来说,这个场景下从集群中找到对应的节点主要有两个思路。一个是在被调度的时候,K8S 发现 2 号节点后直接调度 2 号节点。还有一个是 K8S 先把 2 号、5 号、6号、8 号节点找出来,然后再从这四个节点中选择一个进行调度。K8S 采用的是第二种方法。它会先找出所有的节点,而后筛选出可以满足调度的节点,然后对这些满足调度的节点进行评分,按照分数由高到低进行排序。排序最高的那

36、个节点会被选择进行调度,这是 K8S 的调度匹配机制。这实际上是一个调度的问题。第二个问题,假设现在当前一共只有 6 个节点,可以看到一个容器,就需要占用一个节点上的所有资源。当前的 6 个节点都不满足该条件,那么说明默认情况下是无法调度的,容器应该在 pending 状态。但是它实际上不一定是处于 pending 状态的,这取决于对 Pod 的优先级设定。我们可以对不同的容器、不同的 Pod 设置优先级,优先级高的先满足调度条件。29第一章 云原生和 K8S 基础入门2、K8S 功能自动恢复比如一个节点无响应,K8S 集群无法感知到这个节点的运行状态,超过一定的时间阈值后,K8S 会认为这个

37、节点是不可调度的,已经不存在了。K8S 会在别的集群上,比如在别的可运行的节点上,重新把这个 pod 调度起来,以维持副本数。这个无法感知到的节点上的 pod 拉起后不一定是运行的。所有集群节点的调度是受到 K8S 集群的总调度,这个离开的节点有可能因为Kubelet(集群上的组件之一),无法接收到 K8S 集群是否要驱逐该 pod 的信息,而继续仍处于运行状态。自动恢复功能则可以再提取别的集群,在没有办法感知到这个节点上的 pod 存在的情况下,它依旧可以在其他的节点上进行调度。30第一章 云原生和 K8S 基础入门自动恢复:可以看到现在两个黄色的节点,两个黄色的 pod 业务流量特别大,可

38、以通过刚才说的 HPA 方式,自动再生成一个黄色的 pod,把它调度到运行的节点,用来共同承担流量压力。三、K8S 架构K8S 是一个 CS 的架构,也就说是 client 和 server 的架构。client 和 server 架构其实很简单,所有的命令或页面进行的相关操作,访问的都是 master 节点,然后由 master 节点对相关的命令进行处理,处理之后将结果发送给各个节点上,做具体相应的操作。1、master 节点主要组件31第一章 云原生和 K8S 基础入门api server:可以认为它是一个大网,所有的组件,所有的命令,所有包括敲的命令都是和api server 进行交互的

39、,由 api server 进行相关的处理。处理完然后再分发到各个组件运行。controller:是一个调度器,它的主要目的是维持副本,以及对副本进行相关设置。deployment:K8S 里面有很多不同的 deployment,deployment 是无状态的服务。statefulset:statefulset 是有状态的服务。DaemonSet:DaemonSet 在每个节点上起一个。job:job 运行一次直到成功为止,或者说达到失败阈值。cronjob:cronjob 是定期的执行 job,可以称为定期 job。scheduler:其实就是调度器的意思,可以把要创建的 pod 调度到它

40、所在的节点上或者它设置的节点上ETC:是一个键值数据库,是持久化存储的,来保证业务的一致性。它为什么持久化?pod的所有相关的信息,包括副本信息、SVC 的信息等等,都是以键值的形式存储在 ETCD 的。这样在 pod 被删除之后,可以通过 ETCD 进行比对,通过 ETCD 存储的状态与现在状态进行比对,可知需要保持的副本数量。2、Node32第一章 云原生和 K8S 基础入门假如是在自己的环境中,比如说在物理环境上搭载服务器时,我们是有上述这些组件的。但是如果是阿里云的 ACK Pro 版本,即托管版,这些组件都是被阿里云托管和维护的,客户侧是看不到这些的。如果是阿里云的 ACK 的话,客

41、户需要关心的是 Node 上的两个组件,一个是 Kubelet,一个是Kube-proxy,这是客户可以看到的。Kubelet 作用在于比如 schedule 要调度一个节点 1,调度并不是它自己直接发起的,而是相关命令通过 master 节点发送给这个节点上的 Kubelet 组件。Kubelet 根据相关的调度信息,然后调用容器的 runtime(可能是 containerd 也可能是docker 也可能是别的),然后调取 runtime 传达该 pod 有启用容器的需要,然后告诉containerd 需要起个 pod,containerd 它就会拉起一个 pod。再比如 pod 需要挂载

42、、需要存储配置,也不是通过 Kubelet,而是通过调用存储插件,然后告诉这些存储插件,自己需要调用的配置信息,包括静态动态的选择、存储的配置选项、网络配置等,网络配置给 pod 配置IP,告知这些网络插件需要设置 IP。Kube-proxy 的作用:比如有五个 pod 前端是一个 VIP,然后流量被发送到这个 IP,这个 IP 再分发到这些 pod 上。如果这个 pod 是新调度的,调度出来后,如何把它加到 VIP 里面,如何知道 VIP 可以把流量打包分发到新的 pod?可以通过 Kube-proxy。它主要使用的是 iptables或者是 ipvs 这两种。33第一章 云原生和 K8S

43、基础入门Node 节点上主要有 Kubelet 组件,以及 Kube-proxy 组件。其中,Kube-proxy 主要有iptables 和 ipvs。对于大规模部署的集群,可能有几千个 pod,此时推荐使用 ipvs。因为ipvs 比较适合大规模集群,它是幂等性,可以快速进行相关的负载均衡定位,然后找到目的 IP,而 Kubelet 会调用其他的日志组件。看整个架构图可以发现,用户其实和 api server 进行交互的,我们所有的命令或者控制台上进行相关的操作都是通过发给 api server,api server 根据我们发送的相关命令,再把相关的东西发送给 controller ma

44、nager 和 schedule 以及 ETCD 等,然后再分发到 Node 上,Node 上的 Kubelet 和 Kube-proxy 进行处理。四、核心概念1、核心概念Pod34第一章 云原生和 K8S 基础入门Pod 是整个 K8S 中最小的调度单元,一个 Pod 是由好几个容器(至少一个)组成的。我们可以设置 Pod 运行时的 CPU 和 memory,可以给每个容器挂载不同的 volume,比如说container1 挂载 100G,container2 可以挂载 20G 等。然后可以运行一些环境变量,像容器 1和容器 2 各自需要的环境变量等等之类的。Pod 有以下一些状态:35

45、第一章 云原生和 K8S 基础入门running 是至少有一个容器运行,而一个 pod 里面有好几个容器,有一个容器运行了则显示为 running,所以 running 状态下的业务不一定是正常的。succeed 表示容器正常退出。terminating 表示容器正在停止,是被删或者是其他问题。我们经常会遇到 pod terminating超过很长时间都没有被删掉的情况。第一个原因可能是这个 pod 所在的宿主机空间满,为什么空间满会影响 terminating?因为 K8S 要删除 pod,调用的是底层的容器的运行环境,可能调用的是 docker、container,空间满会影响 docke

46、r、container 的运行,进而造成 terminating无法成功。还有一些可能是 I 属性文件存在,I 属性是指这个文件不可删、不可修改。一般是因为 pod 运行的时候,一些运行的程序修改调用了一些 I 属性的文件,比如 rancher。我们要删掉的话就需要先改一下属性文件;又或者是因为 finalizer 导致 terminating 无法成功,pod 运行的时候,可能会产生其他一些有附属结构、附属关联的东西,我们可以称为附属关联。这种关联是一种由其他程序产生的,要删除的时候,必须由其他程序把这些东西给删除,这个 pod才能被删除,否则 pod 没有办法自动删除。当然也有可能是 ku

47、belet 的 bug。containercreating 表示 pod 正在创建,有可能出现一直在创建的问题,这可能是因为挂载volume 的时候出现了问题,一直处在创建中。第二个可能是对容器资源进行限制的时候,单位可能写错了。比如在对 memory 进行限制的时候,两百兆的正确写法应该是 200MI,很多情况下会写错成 200M,其实 200M 并不代表 200 兆,代表的是 0.2bytes。这很容易产生一个问题:容器还没起来就遇到了 Cgroup 的 OOM 把容器给杀死了。还有可能是内存碎片化产生的问题。pending 表示容器已创建完毕了,但是在等待调度。等待调度有很种情况。第一种

48、情况是没有分配节点,假如没有分配节点,那么可能是集群里没有地方调度,意味着整个集群的资源都不够。或者是 pod 设置的时候,没有进行 Node select,即选择哪些 Node 进行调度。又或者是污点,亲和性没有满足等情况,都有可能造成这个问题。第二种情况是已经分配节点,此时这个节点肯定已经满足 K8S 的 pod 调度要求的,但是实际还是没有被调度在目标节点上运行,有可能是因为这个节点上磁盘满了,也有可能是因为这个节点上的 pod 的 IP 池不够了,所以造成了 pod 没有办法调度上去。可能还有一种情况 imagepull backoff,即拉取镜像失败了。拉取镜像失败可能是网络问题导致

49、没有办法连接仓库,也有可能是和仓库之间进行的相关验证产生问题了,还有可能用了 http 方式进行拿取,而不是 https 方式。如果用 http 方式,就必须36第一章 云原生和 K8S 基础入门要用另一种方式进行要求。还有可能是 crash loop back off,它表明这个 pod 曾经正常运行,后来因为某种原因终止。终止出来的情况会显示 code,code 的值一般是 0-127。如果是 0的话,表示它是正常终止,不需要额外关注;如果 code 是 1 到 127,那么可能需要看 pod 日志。比如一个 pod 有两个容器的 nginx 和 centos,两个容器设置了不同的 CPU

50、 limit 限制以及 restart count。如果它有不正常的重启,Exit code 会有状态码 1 到 127,很多时候可能是和 pod 上的应用有关。比如说应用突然抛出了异常,或者说这个客户的这个应用是和 DNS 强相关的,别的附属条件或者 DNS 没有正常运行,这个 pod 就一定会终止(有一定可能性),但是这需要和业务设计相关,业务设计是这么按照逻辑设计的才有可能。2、核心概念Volume我们可以通过 volume 进行挂载,挂载本地或后端,同时 volume 可以把本地宿主机上的目录给挂载上去,也可以是分布式存储或者云存储。3、核心概念Deployment37第一章 云原生和

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 研究报告 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服