kubernetes简称k8s,k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。
K8S 最初是由 Google 开发的,后来捐赠给了 CNCF(云原生计算基金会,隶属 Linux 基金会)
kubernetes是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。kubernetes拥有一个庞大的快速增长的生态,其服务、支持和工具的使用范围相当广泛。
早期,各个组织是在物理服务器上运行应用程序。 由于无法限制在物理服务器中运行的应用程序资源使用,因此会导致资源分配问题。 例如,如果在同一台物理服务器上运行多个应用程序, 则可能会出现一个应用程序占用大部分资源的情况,而导致其他应用程序的性能下降。 一种解决方案是将每个应用程序都运行在不同的物理服务器上, 但是当某个应用程式资源利用率不高时,剩余资源无法被分配给其他应用程式, 而且维护许多物理服务器的成本很高。
因此,虚拟化技术被引入了。虚拟化技术允许你在单个物理服务器的 CPU 上运行多台虚拟机(VM)。 虚拟化能使应用程序在不同 VM 之间被彼此隔离,且能提供一定程度的安全性, 因为一个应用程序的信息不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器的资源,并且因为可轻松地添加或更新应用程序, 而因此可以具有更高的可扩缩性,以及降低硬件成本等等的好处。 通过虚拟化,你可以将一组物理资源呈现为可丢弃的虚拟机集群。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器类似于 VM,但是更宽松的隔离特性,使容器之间可以共享操作系统(OS)。 因此,容器比起 VM 被认为是更轻量级的。且与 VM 类似,每个容器都具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。
容器具有许多的优势,从而变得流行起来,那么好,容器有什么有点呢?来,往下看😎
介绍了这么多,k8s的概念大家应该都知道了,那么好,为什么要用k8s呢,他能做什么呢?
首先啊,容器呢,他是打包和运行应用程序的好方式。在生产环境中,你需要管理‘它’,也就是管理运行着应用程序的容器,并确定服务不会下线。例如,如果一个容器发生了故障,则你需要启动另一个容器。这个行为交给系统去处理,是不是更容易些?
这就是k8s需要做的事!k8s为你提供了一个可弹性运行分布式系统的框架。k8s会满足你的扩展要求、故障转移你的应用、提供部署模式等。例如,k8s可以轻松管理系统的canary(金丝雀)部署。
简单来说,通过k8s你可以快速部署应用、快速扩展应用、无缝对接新的应用功能、节省资源,优化硬件资源的使用。使用它的目的就是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。
k8s能做什么呢?接着往下看
可以在物理机或虚拟机的kubernetes集群上运行容器化应用,k8s能提供一个已‘容器为中心的基础架构’,满足在生产环境中运行应用的一些常见要求,如:
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
自动完成装箱计算
你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
自我修复
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
那么好,介绍了它是什么,为什么需要k8s,他有什么用,那么好,k8s不是什么?
首先啊,k8s不是传统的、包罗万象的paas(平台及服务)系统。 Kubernetes 在容器层面工作,而非在硬件层面,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡,允许用户集成他们的日志记录、监控和警报方案。 但是,Kubernetes 不是单体式(monolithic)系统,那些默认解决方案都是可选、可插拔的。 Kubernetes 为构建开发人员平台提供了基础,简单来说就是提供了用于搭建开发平台的基础模块,同时为用户提供了不同模块的选择性以及多样性。
Kubernetes:
不限制应用程序的类型。Kubernetes的目标是广泛支持不同类型的工作负载,包括:有状态、无状态、数据处理等类型的应用。只要应用可以在容器中运行,就能够非常好地在 Kubernetes 上运行
不部署源码、不编译或构建应用程序。持续集成、分发、部署(CI/CD)的工作流极大程度上取决于组织的文化、偏好以及技术要求。Kubernetes可以作为部署平台参与到 CI/CD 流程,但是不涉及镜像构建和分发的过程
可选的有 Jenkins / Gitlab Runner / docker registry / harbor 等
不提供应用程序级别的服务,包括:中间件(例如,消息总线)、数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存(例如,Redis),或者分布式存储(例如,Ceph)。此类组件可以在 Kubernetes 上运行,或者可以被运行在 Kubernetes 上的应用程序访问
不限定日志、监控、报警的解决方案。Kubernetes 提供一些样例展示如何与日志、监控、报警等组件集成,同时提供收集、导出监控度量(metrics)的一套机制。您可以根据自己的需要选择日志、监控、报警组件
可选的有 ELK / Prometheus / Graphana / Pinpoint / Skywalking / Metrics Server 等
不提供或者限定配置语言(例如,jsonnet)。Kubernetes提供一组声明式的 API,您可以按照自己的方式定义部署信息。
可选的有 helm/kustomize/kubectl/kubernetes dashboard/kuboard/octant/k9s 等
不提供或限定任何机器的配置、维护、管理或自愈的系统。
在这个级别上,可选的组件有 puppet、ansible、salt stack 等
此外,Kubernetes不是一个纯粹意义上的容器编排系统。事实上,Kubernetes 消除了容器编排的需求。容器编排的技术定义是预定义流程的执行
(先做A、再做B、然后做C)。与此相对应,Kubernetes构建了一系列相互独立、可预排的控制过程,以持续不断地将系统从当前状态调整到声明的目标状态。如何从 A 达到 C,并不重要。集中化的控制也就不需要了。这个设计思想使得Kubernetes使用更简单、更强大、稳健、反脆弱和可扩展。