01k8s介绍
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化 工作负载和服务,有助于实现声明性配置和自动化。它有一个庞大、快速增长的生态系统。Kubernetes 服务、支持和工具广泛可用。Kubernetes 这个名字起源于希腊语,意思是舵手或飞行员。K8s 作为缩写 计算"K"和"s"之间的八个字母的结果,谷歌开源 2014 年的 Kubernetes 项目。

**传统部署时代:**早期,组织在物理服务器上运行应用程序。没有办法定义 物理服务器中应用程序的资源边界,这导致了资源 分配问题。例如,如果多个应用程序在物理服务器上运行,则 可能是一个应用程序将占用大部分资源的实例,因此, 其他应用程序将表现不佳。对此的解决方案是运行每个应用程序 在不同的物理服务器上。但这并没有扩大,因为资源没有得到充分利用,而且它 对于组织来说,维护许多物理服务器的成本很高。
**虚拟化部署时代:**作为一种解决方案,引入了虚拟化。它允许你 在单个物理服务器的 CPU 上运行多个虚拟机 (VM)。虚拟化 允许在 VM 之间隔离应用程序,并提供安全级别为 一个应用程序的信息不能被另一个应用程序自由访问。
虚拟化允许更好地利用物理服务器中的资源,并允许 更好的可扩展性,因为可以轻松添加或更新应用程序,从而减少 硬件成本等等。通过虚拟化,您可以呈现一组物理 资源作为一次性虚拟机群集。
每个 VM 都是运行所有组件的完整计算机,包括其自己的操作 系统,位于虚拟化硬件之上。
**容器部署时代:**容器类似于 VM,但它们已经放松了 用于在应用程序之间共享操作系统 (OS) 的隔离属性。因此,容器被认为是轻量级的。与 VM 类似,容器 有自己的文件系统、CPU 份额、内存、进程空间等。正如他们 与底层基础架构分离,可跨云移植 和操作系统发行版。
容器之所以流行,是因为它们提供了额外的好处,例如:
-
敏捷的应用程序创建和部署:提高 容器映像创建与 VM 映像使用相比。
-
持续开发、集成和部署:提供可靠的 以及快速高效的容器镜像构建和部署 回滚(由于映像不变性)。
-
开发和运维关注点分离:在 构建/发布时间而不是部署时间,从而解耦 来自基础架构的应用程序。
-
可观测性:不仅显示操作系统级别的信息和指标,而且 应用程序运行状况和其他信号。
-
跨开发、测试和生产的环境一致性:运行 在笔记本电脑上和在云中一样。
-
云和操作系统分发可移植性:在Ubuntu,RHEL,CoreOS,本地运行, 在主要公共云和其他任何地方。
-
以应用程序为中心的管理:提高运行 虚拟硬件上的操作系统,以使用逻辑资源在操作系统上运行应用程序。
-
松散耦合、分布式、弹性、解放的微服务:应用程序是 分解成更小的独立部分,可以动态部署和管理 -- 不是在一台大型单一用途机器上运行的单片堆栈。
-
资源隔离:可预测的应用程序性能。
-
资源利用率:高效率、高密度。
02Kubernetes可以做什么
1)服务发现和负载平衡Kubernetes 可以使用 DNS 名称或使用自己的 IP 地址公开容器。如果容器的流量很高,Kubernetes 能够进行负载均衡和分发。网络流量,以便部署稳定。
2)存储编排Kubernetes 允许您自动挂载您选择的存储系统,例如 本地存储、公共云提供商等。自动推出和回滚您可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 以为您的容器创建新容器 部署,删除现有容器并将其所有资源采用到新容器。
3)自动垃圾箱包装你为 Kubernetes 提供了一个节点集群,它可以用来运行容器化任务。你告诉Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。Kubernetes 可以适合 容器到节点上,以充分利用资源。
4)自我修复Kubernetes 重启失败的容器,替换容器,杀死没有失败的容器 响应用户定义的运行状况检查,并且在客户端之前不会将其通告给客户端 已准备好服务。
5)机密和配置管理Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌、 和 SSH 密钥。您可以部署和更新机密和应用程序配置,而无需 重新构建容器映像,而不会在堆栈配置中公开机密。
03k8s架构
Kubernetes 借鉴了 Borg 的设计理念,比如 Pod、Service、Labels 和单 Pod 单 IP 等。Kubernetes的整体架构跟 Borg 非常像,如下图所示

Kubernetes 主要由以下几个核心组件组成:
-
etcd 保存了整个集群的状态;
-
kube-apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
-
kube-controller-manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
-
kube-scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
-
kubelet 负责维持容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
-
Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI),默认的容器运行时为Docker;
-
kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡;
kube-proxy工作原理:

04k8s各组件间协议

CNI:
CNI是Container Network Interface的是一个标准的,通用的接口 ;用于连接容器管理系统和网络插件。提供一个容器所在的network namespace,将network interface插入该network namespace中(比如veth的一端),并且在宿主机做一些必要的配置(例如将veth的另一端加入bridge中),最后对namespace中的interface进行IP和路由的配置。现有解决方案:flannel,calico,weave。
CRI:
容器运行时接口(Container Runtime Interface);CRI包含了一组protocol buffers,gRPC API,相关的库; 提供可插拔的容器运行时 ;k8s节点的底层由一个叫做"容器运行时"的软件进行支撑,它负责比如启停容器这样的事情;Docker是K8s中最常用的容器运行时;
OCI:
围绕容器的格式和运行时制定一个开放的工业化标准,并推动这个标准,保持容器的灵活性和开放性,容器能运行在任何的硬件和系统上,容器不应该绑定到特定的客户机或编排堆栈,不应该与任何特定的供应商紧密关联,并且可以跨多种操作系统;
05mast与node架构图

06k8s分层架构图

分层解释:
核心层:
Kubernetes 最核心的功能,对外提供 API 构建高层的应用,对内提供插件式应用执行环境;
应用层:
部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS 解析等)、Service Mesh(部分位于应用层);
管理层:
系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态 Provision 等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy 等)、Service Mesh(部分位于管理层);
**接口层:**kubectl 命令行工具、客户端 SDK 以及集群联邦;
**生态系统:**在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴;
-
Kubernetes 外部:日志、监控、配置管理、CI/CD、Workflow、FaaS、OTS 应用、ChatOps、GitOps、SecOps 等
-
Kubernetes 内部:CRI、CNI、CSI、镜像仓库、Cloud Provider、集群自身的配置和管理等