kubernetes容器编排系统基本概念

Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。

Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。

传统部署时代:

早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程序资源利用率不高时,剩余资源无法被分配给其他应用程序, 而且维护许多物理服务器的成本很高。

虚拟化部署时代:

因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。

虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。

每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器部署时代:

容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。

k8s 是谷歌几十年来研发的一套系统,更新了运维领域的玩法。
内容很多,先快速练习玩法,知道是什么就行,
具体【为什么】再花时间慢慢学吧!
学习前言
不能站在上帝视角,一开始就大而全的去理解 k8s 所有组件,对于新人入门是灾难。
前期,抓住重点,学会安装,应用部署,不断加入新组件,理解该组件能解决什么问题。才是循序渐进的学习方法。
当然,在课余时间,为了掌握这一类重量级的技术,就必须得看在资料,理解为什么 k8s 提供那么多组件,以及作用。
东西多,不怕多,坼开来,一点点学习,一点点进步。

学习任务

1. 理解为什么需要学 k8s (回顾第六章的学习历程,一步步而来的升级)
1.1 iptables 规则,为了理解防火墙作用,以及实现对数据包的转发,修改作用,源 ip:port 目标 ip:port 协议等
1.2 虚拟化 KVM(Kernel-based Virtual Machine) 使用 linux 内核的虚拟化模块,将物理服务器划分为多个虚拟机。
虚拟机 笔记本->vmware,
虚拟化嵌套技术 kvm: 物理机->虚拟化平台(阿里云)->容器化技术(我们是在阿里云的kvm上安装容器,安装 k8s 等等)
1.3 容器技术,容器,镜像,仓库,网络
应用跑在容器里,网络配置功能,-p,容器的应用类型,nginx
mysql 数据库软件 不可能放在容器里一个隔绝的环境 -v 创建一个volume 就是为了把数据从一个封闭的容器环境把数据拿出来。这个是有状态的容器(产生了一堆数据,进行持久化 存储功能)
1.4 从单个的容器管理命令,升级为 yaml 形式的资源描述文件,以及提供了相应的编排能力,运行,管理一组多个容器以及容器之间会共同使用到的,如桥接网络网段,如创建的数据卷 Volume ,也可以在多个容器之间共享数据。
docker run -v -p 镜像名 --restart 容器名 --link
docker run -v -p 镜像名 --restart 容器名 --link
docker run -v -p 镜像名 --restart 容器名 --link
docker run -v -p 镜像名 --restart 容器名 --link
容器docker-200,该容器启动命令不可保留,容器一个一个启动 如果升级为 yaml 文件,命令就可以保留,yaml文件写的就是上述容器的命令,运行的4个容器改为了一个 yaml 描述性文件,去描述你的四个容器该如何部署,用什么参数,用什么卷,用什么网络,这就是单机容器编排 docker-compose
wordprress	博客系统
python flask	全局变量
jumpserver  容器化部署
cicd平台	核心数据管理模块
监控系统

network 网络资源
volume 存储资源
镜像名  镜像资源
容器的名字  容器的运行参数    这些都是容器资源
yaml 语法   compose.yaml 文件  要遵循 docker-compose 官方提供的字段,key ,修改对应的 value 值就可以。

/var/lib/docker/volumes/xxxxx		volume 卷
volume /var/log/nginx 
多个容器之间
网络链接
可以在多个容器之间共享卷
1.5 问题又来了,你这只是在单机的如 docker-200 机器上操作一堆容器,容器需要部署在多个机器上呢?你后端需要运行的一组如4个容器,不能只在一个宿主机上跑吧,那不还是公用的单一的宿主机配置吗?
1.6 因此容器需要跨主机部署,以及配置跨主机的容器通信方案。
纯容器化的场景
分开在多台机器,如何维护网络,如何维护存储没提及有其他的容器编排工具
先给你带来一个思考
出现这种问题:
从单机容器到多机下的容器,运维如何办?要思考的问题 开发,运维,测试都要考虑这个问题

运维部署方式彻底颠覆,开发代码编写方式,也彻底颠覆 微服编程系统都是撤分为多个小的组件 运行在一个个容器里 称之为微服务

容器多机编排方式工具必须得有了。
1.7 以及容器运行在了多个机器上,容器就是你后端么,如何确保对容器的资源使用率监控?容器内服务监控?是不是也得手工去维护 docker?
监控的难度也加大了
技术是以步步演化而来,升级而来
容器说白了就是后端

1.理解你学习过程中,认知,认可了的这些部署的问题
2.才能明白为什么要学习 docker 学习 k8s 
2. 如上诸多问题,在容器规模上来,跨机器的部署,就推进了容器编排技术必须要继续发展,开发出强大的编排工具,解决上述问题,以及更多的问题,这就是 k8s 为什么出现了。

k8s 软件介绍

纯容器的部署问题

纯 docker 的运行模式,是一个 docker 主机,单独管理一堆容器应用,但是发现数量多了之后,配置复杂之后,难以维护管理多个容器,并且跨主机下的容器集群,更是维护复杂。
1. 业务容器数量庞大,哪些容器部署在那些节点,使用了哪些端口,如何记录,管理,需要登录到每台集群去管理?
理论较多,操作较少,安装好 k8s 即可 开篇的理解,大于操作
 nginx 容器
 nginx + python 容器
 nginx + python + redis + mysql 容器
 代理 + 后端应用 + 缓存 + 数据库
 .cnf配置文件  env环境变量   yaml文件可以去定义配置文件,环境变量等
 
 python 容器
 expose 暴露端口
 
 yaml 另一种标记语言(Yet Another Markup Language),格式,标记语言
 如果你能提前用 yaml 文件描述这些信息,再查询容器信息的时候,都可以用 yaml 文件去查
 
 容器A
 镜像信息
 存储信息
 端口信息
 网络信息
2. 跨主机通信,多个机器中的容器之间相互调用如何做,iptables规则手动维护?
容器,随时创建,随时删除
IP是不断变化的
代码,填入的地址是什么呢?
必须走主机名(服务发现)
每一个容器跑起来后,自动对于主机名和容器所在 IP 的关系

k8s 容器的一个组件 数量保障	k8s 组件,容器数量保障

nginx 高可用负载均衡
	upstream {
		server A	容器A		V1 wordpress	->	v2	->	v3
		server B	容器B		V1 wordpress
		server C	容器C		V1 wordpress
	}

v1升级到v2到v3,发现v3版本有 bug 还可以快速的回滚到 v2 版本
3. 跨主机容器间互相调用,配置如何写,写死固定 ip + 端口?
4. 如何实现业务高可用?多个容器对外提供服务如何实现负载均衡?
5. 容器的业务中断了,如何可以感知到,感知到以后,如何自动启动新的容器?
6. 如何实现滚动升级保证业务的连续性?
7......

如何学习 k8s 组件

理解 k8s 是什么,解决什么问题

解读官网 k8s 特性

k8s 是什么? borg 是 kubernetes 的父组件
k8s 是 kubernetes 的简写,是用于自动部署,扩容和管理容器化应用程序的开源系统。
它将组成应用程序的容器组合逻辑单元,以便于管理和服务发现。
Kubernetes 源自你 Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。
Google 每周运行数十亿个容器,Kubernetes 基于与之相同的原则来设计,能够在不扩张运维团队的情况下,进行规模扩展。
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态,其服务、支持和工具的使用范围相当广泛。
Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。 Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。
从官方资料来看,就已经解决了上述提及的纯容器化管理问题。

架构演进历史,为何会出现 k8s 技术

官网资料
https://kubernetes.io/zh-cn/docs/concepts/overview/
简单总结就是
1. 传统物理机部署,资源利用率低,难以迁移  v1 物理机
2. 升级虚拟化时代 ,基于 vm 技术实现资源隔离,是一个完整的OS		v2 虚拟化 vmware商业版为代表,出现开源的 KVM ,openstack
3. 升级容器时代,容器共享宿主机 OS,且有自己的名称空间,有诸多特性。	v3 容器化部署,容器化大规模应用后,难以维护?出现了 k8s 技术

k8s 是一个平台框架,

k8s 提供了很多的功能,简化了对容器的部署管理
1.基于容器对应用的发布管理,更新,升级,降级		deployment组件能实现的功能
2.负载均衡,服务发现			
3.跨机器,跨地区的网络模式
4.自动扩缩容功能
5.针对如 nginx 无状态服务的运行组件,如 mysql 等有状态服务的运行组件
6.支持丰富的插件

k8s 本质是什么,大而全的平台,组件很多,提供了很多功能组件,目的是为了更好的去管理容器
组件 Deployment 组件
维护一组容器,
nginx 容器,要求 容器数量是 4 个  用户端浏览器  10亿个用户  如果有2个容器挂了
如果是基于 docker 就手动执行 docker run nginx 就可以解决问题
如果是基于 k8s  运行的一组 nginx 容器,基于组件 deployment 控制器 运行的一组 nginx 容器,他能保障容器的副本数量一直是 4 个 nginx 容器 不需要手动重启容器  容器数量始终保持即定的数量。
deployment 这个组件是专门用于保证,应用发布的高可用性,弹性扩缩容,升级,降级的一个重要组件
还有其他专门用于维护
网络
存储
等 k8s 的其他组件。
学习各个组件,并且是基于 yaml 文件创建


学习路线
1.先学会部署这种无状态的应用
2.学其他组件部署容器网络,存储等
k8s 并不是包罗万像,它本身只有自己的一些组件,而其他功能,如消息队列,数据库,存储等部署要额外安装在 k8s 上。
1.下载 mysql 镜像
2. k8s 更好的帮你运行 mysql 镜像

下一步就是,k8s 到底是什么,架构如何,如何部署,核心理念.

1.提供了很多组件,方便你去从各个角度,更好的去维护,管理容器
a. 容器运行高可用,数量保障,版本升级,扩容,缩容。
b.容器之间的网络关系
c.容器之间的数据共享关系
d.容器内配置文件加密
e.
f.
如上都是 k8s 提供的各个组件的作用.
k8s 为了解决容器部署难题
你在有了一定的 docker 化部署的过程,体验,才能感同深受这些问题,才能真的知道容器怎么玩,以及如何和面试官交流,
容器因具有许多优势而变得流行起来,例如:

    敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
    持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性), 提供可靠且频繁的容器镜像构建和部署。
    关注开发与运维的分离:在构建、发布时创建应用程序容器镜像,而不是在部署时, 从而将应用程序与基础架构分离。
    可观察性:不仅可以显示 OS 级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
    跨开发、测试和生产的环境一致性:在笔记本计算机上也可以和在云中运行一样的应用程序。
    跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
    以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
    松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
    资源隔离:可预测的应用程序性能。
    资源利用:高效率和高密度。

为什么需要 Kubernetes,它能做什么?

容器是打包和运行应用程序的好方式。
在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 
例如,如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些?
如果这个过程,是自动创建容器,自动生成新容器,保证业务高可用,是不是更nb?
k8s 就是实现容器自动化管理的一个框架系统。

这就是 Kubernetes 要来做的事情! Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。

Kubernetes 为你提供:

    服务发现和负载均衡

    Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。

    存储编排

    Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。

    自动部署和回滚

    你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。

    自动完成装箱计算

    你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。

    自我修复

    Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。

    密钥与配置管理

    Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。

    批处理执行 除了服务外,Kubernetes 还可以管理你的批处理和 CI(持续集成)工作负载,如有需要,可以替换失败的容器。
    水平扩缩 使用简单的命令、用户界面或根据 CPU 使用率自动对你的应用进行扩缩。
    IPv4/IPv6 双栈 为 Pod(容器组)和 Service(服务)分配 IPv4 和 IPv6 地址。
    为可扩展性设计 在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能。

Kubernetes 不是什么

Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。 由于 Kubernetes 是在容器级别运行,而非在硬件级别,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡,允许用户集成他们的日志记录、监控和警报方案。 但是,Kubernetes 不是单体式(monolithic)系统,那些默认解决方案都是可选、可插拔的。 Kubernetes 为构建开发人员平台提供了基础,但是在重要的地方保留了用户选择权,能有更高的灵活性。

Kubernetes:

    不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。
    不部署源代码,也不构建你的应用程序。 持续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。
    不提供应用程序级别的服务作为内置服务,例如中间件(例如消息中间件)、 数据处理框架(例如 Spark)、数据库(例如 MySQL)、缓存、集群存储系统 (例如 Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制(例如开放服务代理)来访问。

    不是日志记录、监视或警报的解决方案。 它集成了一些功能作为概念证明,并提供了收集和导出指标的机制。
    不提供也不要求配置用的语言、系统(例如 jsonnet),它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。
    不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。
    此外,Kubernetes 不仅仅是一个编排系统,实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程:首先执行 A,然后执行 B,再执行 C。 而 Kubernetes 包含了一组独立可组合的控制过程,可以持续地将当前状态驱动到所提供的预期状态。 你不需要在乎如何从 A 移动到 C,也不需要集中控制,这使得系统更易于使用且功能更强大、 系统更健壮,更为弹性和可扩展。

Kubernetes 特性

1. 自动化上线和回滚

容器化部署应用,快速升级,降级的介质是镜像
Kubernetes 本质是去管理 docker 数据卷,多个容器数据共享
走本地存储 /var/lib/mysql
多个 web 后端 (wordpress 容器里),共享静态资源,多个容器的静态数据,如何使用 NFS(/usr/share/nginx/html) 存储方式除 NFS 外,还有很多种。
Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同时终止所有实例。如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署方案生态系统。

2. 存储编排(业务高可用,便于升级,降级)

自动挂载所选存储系统,包括本地存储,诸如 AWS 或 GCP 之类公有云提供商或者诸如 NFS,ISCSI,Ceph,Cinder 这类网络存储系统

3. 自动装箱(支持各类分布式存储系统)

根据资源需求和其他的约束自动放置容器,同时避免影响可用性,将关键性的和尽力而为性质的工作负载进行混合放置,以提高资源利用率并节省更多资源。

4. IPv4/IPv6 双协议栈

为 Pod 和 Service 分配 IPv4 和 IPv6 地址

5. 自我修复(健康检查功能,出了问题,自我修复) 利用容器的快速创建,快速删除,本质是:容器挂了,删除,重建

重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会将它们公布给客户端。

6. 服务发现与负载均衡(内置 DNS,基于主机名实现机器通信,解决了记录 ip:port 的问题) 容器 IP : 应用 port

服务发现主键 service
无需修改你的应用程序即可使用陌生的服务发现机制。
Kubernetes 为容器提供了自己的 IP 地址和一个 DNS 名称,并且可以在它们之间实现负载均衡。

7. Secret 和 配置管理 (管理大量的配置文件,隐私密码)

部署和更新 Secret 和 应用程序的配置而不必重新构建容器镜像,且不必将软件堆栈配置中的秘密信息暴露出来。

8. 批量执行

除了服务之外, Kubernetes 还可以管理你的批量处理和 CI 工作负载,在期望时替换掉失效的容器。

9. 水平扩缩 (自动根据负载压力,弹性扩缩容器)

使用一个简单的命令,一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。

10. 为扩展性设计

无需更改上游源码即可扩展你的 Kubernetes 集群
看懂,听懂,k8s 官网对自己的软件介绍,以及刚才说的,
k8s 本质是更好的去维护容器 docker 代表性容器软件

k8s 核心架构组件

k8s 核心概念组件 乐高积木 搭建一个霸天虎

如何设计一个容器管理平台?

1. 集群架构,管理节点分发容器到数据节点
2. 如何部署业务容器到各数据节点
3. N个数据节点,业务容器如何选择部署在最合理的节点
4. 容器如何实现多副本,如何满足每个机器部署一个容器的模型
5. 多副本如何实现集群内负载均衡。
分别式系统,两类角色: 管理节点 和 工作节点

k8s称之为容器管理平台的本质,解决了什么问题

系统架构来看,k8s 分为 3 个节点
master	控制节点,工头
node	工作节点,工人

从功能 去理解该如何学习 k8s

如果让你设计一个容器管理平台    linux0224 k9s
1.集群架构	至少2台机器   master 主节点  node  工作节点
master 根据维护者,写的 yaml 文件,对容器的运行描述,创建具体的容器,到 node 工作节点
2.该容器管理平台,应该自动识别,目标节点的,状态,选择最适合的节点部署 新容器
3.容器管理平台,你实现确保,应用的副本数是健康,正确的,后端的容器数量。
4.容器内的负载均衡,反向代理该如何配置(k8s 的一个组件就可以实现)

以上4点运维部署业务场景
下一步学习 k8s技术 完成这些场景的部署
k8s 部署,也就是完成如上的架构,以及解决上述的问题

核心组件

Kubernete 主要由以下几个核心组件组成:

1.etcd 保存了整个集群的状态,分布式高性能数据库;

2. api-server 提供了资源操作的唯一入口,并提供认证,授权,访问控制,API 注册和发现等机制;

3. controller manager 负责维护集群的状态,比如故障检测,自动扩展,滚动更新等;

Replication Controller 主从复制控件
Node controller 节点控件
ResourceQuota Controller 资源配额控件
Namespace Controller 命名空间控件
ServiceAccount Controller 服务账号控件
Token Controller 单点登陆(令牌)控件
Service Controller 服务控件(控制器)
Endpoints Controller 端点控制器(副本控制器)

4. scheduler(调度器) 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的 Node 机器上;

5. kubelet 负责维护容器的生命周期,同时也负责 Volume (CVI) 和 网络 (CNI)的管理;kubelet:进行自注册启动参数如下

1)运行在每一个 node 节点上的 代理软件,脏活累活都是他干;
2)pod 管理:
kubelet定期从所监听的数据源获取节点上 pod/container 的期望状态(运行什么容器,运行的副本数量,网络或者存储如何配置等等),并调用对应的容器平台接口达到这个状态。
3)容器健康检查:
kubelet 创建了容器之后还要查看容器是否正常运行,如果容器运行出错,就要根据 pod 设置的重启策略进行处理。
4)容器监控:
kubelet 会监控所在节点的资源使用情况,并定时向 master 报告,资源使用数据都是通过 cAdvisor 获取的,知道整个集群所有节点的资源情况,对于 pod 的调度和 正常运行至关重要,

6. Container runtime 负责镜像管理以及 Pod 和 容器的真正运行 (CRI);

7. kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡,主要提供 iptables,ipvs 规则。

8. kubectl :

命令行接口,用于对 Kubernetes 集群运行命令
https://kubernetes.io/zh-cn/docs/reference/kubecli/
# kubernetes核心组件	大白话解释
kubernetes安装,启动好 k8s 之后,至少看到的几个组件以及后续,部署你的应用,再用其他的组件
# etcd  	组件1
1. k8s 内部运行组件,存储所有节点的信息,节点的ip 节点的主机名 节点上部署的容器信息等都存储在数据库,,key-value 值的数据库 和 Redis一个用法 他的名字叫 etcd 

# api-server 是集群的入口 	组件2
2. k8s 作为一个高级的容器管理平台,对每一个发来的请求,都要进行校验,该请求是否被集群允许,
比如 删除集群中的一个容器组 是否被允许
k8s 默认运行后,有6个组件,每一个组件的请求,与响应,都要经过这个 api-server 组件,来进行校验。

# controller manager	组件3
3. 组件3,具体部署容器,到目标节点,使用的控制器
容器负载均衡部署
Deployment控制器就是之一

# scheduler  调度器	组件4
比如 k8s-master
运维写 nginx.yml
描述信息	根据 k8s 的默认字段去填写即可
预期部署3个 nginx 容器到 k8s-node2 节点上
主节点 k8s-master 会根据 nginx.yml 文件信息把 nginx的3个容器放到 k8s-node2这台机器上,从主节点到工作节点以及容器创建,中间有一个组件--scheduler (调度器)决定容器部署到节点上(哪台机器 比如 k8s-node2 这台主机上即工作节点上)  scheduler安装在主节点上


# kubelet   组件5 负责容器的生命周期
1.拉去镜像
2.运行容器
是目标节点上的进程,  kubelet组件 在做此事

# kubectl: 组件6 
再 master 节点上敲打的命令,像 docker 命令一样 客户端命令  和 api-server 通信,进行交互
比如 运行3个 nginx 容器 到 k8s-node2 机器上  这句话最终会被写成 yaml 文件,最后告诉 k8s-master 去完成这个需求
使用客户端命令:kubectl create -f install-nginx.yml
命令行工具读取你写的 yaml 文件,最终在机器上完成3个 nginx 容器的创建部署等,中间过程涉及一系列的组件通信

组件架构图

pod 创建流程

1. k8s 集群是被一组称之为 Node 的节点机器组成,这些节点上运行 k8s 管理的容器进程。

1.k8s 集群,至少需要2台 ECS机器
2.k8s 本身,也是以容器运行再目标机器上,目标机器(再 k8s 里面成为 Node 节点)

2. 具体 Node 节点机器上运行的容器被一个叫做 Pod 的组件管理;

k8s 里面不再直接去操作容器了,而是 k8s 提供了一个组件,叫 pod, 封装了一组容器,容器最后都是被 pod 进行管理。
pod 管理一组容器,这一组容器公用 pod 内的名称空间
pod 里面有一个根容器,根容器创建隔绝的网络,文件系统,用户进程资源,进程空间
以上是 pod 的逻辑

# 创建集群
主节点:k8s-master-10	运行一堆组件而且都是以容器化运行
节点1:k8s-node-11		kubelet 组件完成容器的管理-增删改查
节点2:k8s-node-11		kubelet 组件完成容器的管理-增删改查

需求:
创建一个无状态的 nginx 应用部署1个 nginx 容器(pod)即可。

1. 在 master 节点写 yaml 文件 
描述你对容器的运行要求,创建 pod 的要求
install-nginx.yml

2.使用 kubectl 命令去创建,应用这个资源描述文件,才涉及 k8s 组件交互,
发出请求,我要创建一个 pod 去运行 nginx 了。请求发给谁?
kubectl create -f install-nginx.yml	--->  api.server

3. pod 是如何被创建到目标机器的原理流程
验证 kubectl 命令发来的请求是否被允许,利用本地一个 https 证书,证书是直接写入 kubectl 配置文件的
该请求被允许后才会执行,

4. api-server 会将 nginx-pod 创建的信息,记录到 etcd 数据库中(数据库中记录了一些信息,nginx 镜像版本,容器的名字,以及是否要端口暴露)

5.api-server 会通知下一个组件,调度器组件 scheduler ,准备调度 pod .
scheduler组件决定 pod 部署到哪个机器上,会去查看远程节点资源使用率,根据一个最良好的机器 去部署。

6.scheduler 调度,去会去 etcd 里面查询,你部署 pod 信息到底如何,scheduler,调度,判定出一个合适的 node 节点去部署 pod (选择好了,具体的机器,还未执行)

7.scheduler 调度器,会告诉 api-server 自己决定 pod 要部署到那台 node 节点上。

8. api-server 会将这个信息再写入 etcd 数据库中,数据更新了。(nginx 本身的容器信息+绑定关系,要部署到哪个机器上)

9. 此时,api-server 会通知远程具体机器 如 k8s-node2 上的工作进程 kubelet ,去读取 etcd 里面的信息,根据这些信息,创建 nginx 镜像以及创建 pod (nginx 容器)



a. 随着每天的学习
b. pod 玩明白后,能说出来几个
c. 一回生,而回熟,三天后就可以说出来了。
d. 待会安装部署,完成这个 pod 的创建即可
e。再根据创建的结果,再来理解创建的组件通信流程

3. 在你安装完毕 k8s 之后,就得到了一个集群环境;

集群是指有一堆 Node 节点机器,并且这些节点运行 pod ,也就是容器了,

参考资料-------如何创建yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: octopus-deployment
  labels:
    app: web
spec:
  selector:
    matchLabels:
      octopusexport: OctopusExport
  replicas: 1
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: web
        octopusexport: OctopusExport
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                labelSelector:
                  matchExpressions:
                    - key: app
                      operator: In
                      values:
                        - web
                topologyKey: kubernetes.io/hostname

参考资料  2

1.k8s 能干什么
https://kubernetes.io/zh-cn/docs/concepts/overview/#why-you-need-kubernetes-and-what
https://kubernetes.io/zh-cn/docs/concepts/overview/

2. docker 资料
https://docs.docker.com/get-started/

3.kubeadm 创建 k8s 集群
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/

4.prometheus 资料
https://prometheus.io/docs/introduction/overview/

5.ansible 安装 k8s 工具,阅读优秀剧本,也可以
https://github.com/easzlab/kubeasz

6.阿里云 k8s 资料 (生产资料最佳推荐)
https://www.aliyun.com/product/kubernetes

7.查询 k8s 多版本的 API 黑科技
https://k8s.mybatis.io/v1.19

8.自动生成 yaml 黑科技
https://k8syaml.com/

9. kubectl 命令
https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands

10.Kubernetes API
https://kubernetes.io/zh-cn/docs/concepts/overview/kubernetes-api/

11. 百度
https://github.com/baichuan-inc/Baichuan-7B

                理解 k8s 核心几块资源

        k8s 默认的组件很多,每一个 Pod 控制器,以及网络插件组件,没法一个个的去读,前期也都被封装在了底层,也关心不到。

        因此,只聊我们能用到的几个组件,如 Pod 创建,需要用到几个组件,需要背一背,以及查看对应的资源,在机器上的容器进程信息。

        后续不断的加入新知识,再去理解对应的组件,即可循序渐进的理解 k8s 的复杂知识。

        当然,建议也是,平日里看 k8s 官网文档,以及如 k8s 权威指南 v5版本书籍,去阅读理论知识,扩充自己的理论知识,更合适。

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值