什么是K8s
Kubernetes 也称为 K8s,是用于自动部署、扩缩和管理容器化应用程序的开源系统。
Kubernetes 最初是由 Google 工程师作为 Borg 项目开发和设计的,后于 2015 年捐赠给 云原生计算基金会(CNCF)。
什么是 Kubernetes 集群?
有效的 Kubernetes 部署称为集群,也就是一组运行 Linux容器的主机。您可以将 Kubernetes 集群可视化为两个部分:控制平面与节点(或称为计算设备)。
每个节点都是其自己的 Linux 环境,并且可以是物理机或虚拟机。每个节点都运行由若干容器组成的容器集。
控制平面负责维护集群的预期状态,例如运行哪个应用以及使用哪个容器镜像。计算机则负责应用和工作负载的实际运行。控制平面接受来自管理员(或 DevOps 团队)的命令,并将这些指令转发给计算机。
此交接将与许多服务协同,以自动决定哪个节点最适合执行该任务。服务会将工作定义与容器集解耦,并自动将服务请求分发到正确的容器集——无论这个容器集会移动到集群中的哪个位置,甚至可以被替换掉。然后,它将在该节点分配资源,并指派容器集来完成任务请求。
Kubernetes 在操作系统上运行,并与节点上运行的容器集交互。
Kubernetes 集群的预期状态定义了应运行哪些应用或其他工作负载、应使用哪些镜像、应提供哪些资源,以及其他配置详情。
在使用这种基础架构时,管理容器的方式基本不变。但您需要在更高级别参与容器管理,无需对独立的容器或节点实施微观管理,就能更好地控制容器。
您可以自己决定具体在哪里运行 Kubernetes。可以是裸机服务器、虚拟机(VM)、公共云提供商、私有云和混合云环境。Kubernetes 的一大优势就是它可以在许多不同类型的基础架构上运行。
Kubernetes vs.Docker
Docker 可被用作由 Kubernetes 编排的容器运行时。当 Kubernetes 将容器集调度到节点上时,该节点上的 kubelet(确保每个容器都在运行的服务)会指示 Docker 启动指定的容器。
然后,kubelet 持续从 Docker 收集这些容器的状态,并将该信息聚合到控制平面中。Docker 将容器拉到该节点上,并启动和停止这些容器。
将 Kubernetes 与 Docker 搭配使用带来的区别在于,自动化系统要求 Docker 在所有节点上对所有容器执行这些操作,而非要求管理员手动操作。
Kubernetes 的用途是什么?
Kubernetes 可以帮助您交付和管理容器化、传统和云原生应用,以及重构为微服务的应用。
为了满足日新月异的业务需求,开发团队需要能够快速构建新的应用和服务。云原生开发模式从容器内微服务开始,不仅可以加快开发速度,同时能够更轻松地转换和优化现有应用。
使用 Kubernetes 进行应用开发
生产应用跨越多个容器,而这些容器必须部署到多个服务器主机上。Kubernetes 可以提供所需的编排和管理功能,以便您针对这些工作负载大规模部署容器。
借助 Kubernetes 编排功能,您可以构建跨多个容器的应用服务、跨集群调度、扩展这些容器,并长期持续管理这些容器的健康状况。有了 Kubernetes,您便可切实采取一些措施来提高 IT 安全性。
Kubernetes 还需要与联网、存储、安全性、遥测和其他服务整合,以提供全面的容器基础架构。
一旦把它扩展到生产环境和多个应用,您显然需要许多托管在相同位置的容器来协同提供各种服务。
Linux 容器可为基于微服务的应用提供理想的应用部署单元和独立的执行环境。通过将微服务放入容器,就能更加轻松地编排各种服务(包括存储、网络和安全防护)。
随着这些容器的累积,环境中容器的数量会急剧增加,复杂度也随之增长。
Kubernetes 通过将容器分类组成 “容器集”,解决了容器激增带来的许多常见问题。容器集为分组容器增加了一个抽象层,可帮助您调度工作负载,并为这些容器提供所需的服务,如联网和存储等。
Kubernetes 的其他部分可帮助您在这些容器集之间平衡负载,同时确保运行正确数量的容器,充分支持您的工作负载。
如果能正确实施 Kubernetes,再辅以其他开源项目(例如 Open vSwitch、OAuth 和 SELinux),您就能够轻松编排容器基础架构的各个部分。
核心概念
节点
命名空间
容器组
副本集
部署
服务
nodes 节点
Kubernetes 通过将容器放入在节点(Node)上运行的 Pod 中来执行你的工作负载。 节点可以是一个虚拟机或者物理机器,取决于所在的集群配置。 每个节点包含运行 Pod 所需的服务; 这些节点由控制面负责管理。
通常集群中会有若干个节点;而在一个学习所用或者资源受限的环境中,你的集群中也可能只有一个节点。
节点上的组件包括 kubelet、 容器运行时以及 kube-proxy。
namespaces 命名空间
在 Kubernetes 中,命名空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一命名空间内的资源名称要唯一,但跨命名空间时没有这个要求。 命名空间作用域仅针对带有命名空间的对象, (例如 Deployment、Service 等),这种作用域对集群范围的对象 (例如 StorageClass、Node、PersistentVolume 等)不适用。
pods 容器组
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储、网络、以及怎样运行这些容器的规约。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的 “逻辑主机”,其中包含一个或多个应用容器, 这些容器相对紧密地耦合在一起。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于在同一逻辑主机上运行的云应用。
除了应用容器,Pod 还可以包含在 Pod 启动期间运行的 Init 容器。 你也可以注入临时性容器来调试正在运行的 Pod。
replicaset 副本集
ReplicaSet 的作用是维持在任何给定时间运行的一组稳定的副本 Pod。 通常,你会定义一个 Deployment,并用这个 Deployment 自动管理 ReplicaSet。
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。
deployment 部署
Deployment 用于管理运行一个应用负载的一组 Pod,通常适用于不保持状态的负载。
一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。
你负责描述 Deployment 中的目标状态,而 Deployment 控制器(Controller) 以受控速率更改实际状态, 使其变为期望状态。你可以定义 Deployment 以创建新的 ReplicaSet,或删除现有 Deployment, 并通过新的 Deployment 收养其资源。
service 服务
将在集群中运行的应用通过同一个面向外界的端点公开出去,即使工作负载分散于多个后端也完全可行。
Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。
Kubernetes 中 Service 的一个关键目标是让你无需修改现有应用以使用某种不熟悉的服务发现机制。 你可以在 Pod 集合中运行代码,无论该代码是为云原生环境设计的,还是被容器化的老应用。 你可以使用 Service 让一组 Pod 可在网络上访问,这样客户端就能与之交互。