什么是 Kubernetes?
Kubernetes 又称为 k8s,是一个开源平台,用于实现容器化应用和工作负载部署、扩展和管理的自动化与编排。它为在内部、云和边缘等任何环境中以容器形式运行的应用提供了具有内置灵活性、可扩展性、可靠性、高可用性和可移植性的计算基础设施。
Kubernetes 可自动处理与大规模管理容器化工作负载相关的最常见任务,包括部署、负载均衡、横向扩展、发布和回滚以及自我修复。
许多组织已经在生产环境中使用 Kubernetes(支持的应用有少有多),还有一些组织正在对这一技术进行评估。由于其普及性,Kubernetes 已成为容器编排和管理领域的事实标准。
Kubernetes 的优势
Kubernetes 正快速普及,因为它可以帮助:
- 加快和简化应用发布周期
- 实现跨公有云、私有云和混合云以及多云环境的工作负载可移植性
- 提高资源利用效率
- 轻松实现可扩展性和做好生产准备
- 优化环境以满足业务服务级别协议 (SLA)
Kubernetes 和微服务
将传统的单体应用重构为更小的松散耦合部分,即微服务,可加快新应用特性和更新发布速度并简化扩展,从而帮助提高业务敏捷性。云原生微服务架构的采用推动了对底层计算基础架构的演进需求,我们发现,从物理系统和虚拟机过渡到容器是运行微服务的最有效方式之一。
随着微服务和容器数量的增加,对容器管理自动化的需求也不断增长。Kubernetes 可帮助满足这一需求。
Kubernetes vs. Docker
Kubernetes 能够大规模地编排和运行容器化应用;但它无法将应用代码打包成容器化格式以进行分发和执行(容器镜像包括应用代码和必要的运行时、库及其他软件依赖项)。为了运行 pod,Kubernetes 还要求必须在每个节点上安装容器运行时。Kubernetes 最初使用 Docker Engine 作为容器运行时。 但从 Kubernetes 1.24 开始,容器运行时必须符合容器运行时接口 (CRI) 标准,而 Docker Engine 不满足这一要求。CRI-O 和 containerd(最初是一个 Docker 项目)是两个常用的符合 CRI 标准的容器运行时。
要将应用打包成容器,您需要一个像 Docker 这样的工具。Docker 是构建、共享和运行容器化应用的最常用工具之一。它实现了将应用打包成可移植容器镜像操作的简化和自动化,这些容器镜像可随时在内部和云平台上(包括在 Kubernetes 环境中)执行和部署。Docker 打包容器能够在 containerd 和 CRI-O 运行时上原生运行。
Kubernetes 架构
Kubernetes 平台由一组节点组成,这些节点相互连接构成集群,共享池化计算资源。每个集群都管理着许多 pod,pod 是 Kubernetes 架构中最小的可部署单位。一个 pod 包含一个或多个应用容器。多个 pod 组合构成一个服务。可通过多种方法从外部访问 Kubernetes 集群内的应用,其中 Ingress controller(Ingress 控制器)是最流行、最高效的方法之一。
下面让我们来详细了解一下 Kubernetes 环境中的组件:
Kubernetes Pods
Kubernetes pod 是可以在 Kubernetes 中部署的最小可执行单元。Pod 是一个或多个应用容器镜像的“虚拟主机”(就像传统应用的物理服务器或虚拟机),它封装了一个或多个共享相同的计算、存储和网络资源(因此可以被视为是相对紧密地耦合)的容器。Pod 在 Kubernetes 节点上部署和执行。
Kubernetes 节点
Kubernetes 节点是计算基础设施的最小单位。节点可以是虚拟机或物理服务器,分配处理器、内存、存储和网络资源以部署、运行、扩展和管理 pod。多个节点相互连接构成一个集群。
Kubernetes 集群
Kubernetes 集群由一组节点组成,这些节点跨 pod 共享池化计算资源。集群中有两种节点:
- 工作节点——运行 pod 中的容器化应用
- 主节点——运行 Kubernetes 控制平面,编排和管理工作节点和 pod。
通常情况下,在 Kubernetes 集群中每种类型的节点都不止一个,以此来保障可用性和容错能力。
Kubernetes Deployments
Kubernetes 的 deployment 描述了如何在集群中将应用作为一组 pod 副本(或实例)运行。Deployment 定义了:
- 要运行的 pod 副本的数量
- 如何逐步部署 pod 更新
- 如何将 pod 副本回滚到之前的状态
- 如何横向扩展 pod 副本
Kubernetes 中的应用互联
Kubernetes 支持 IPv4/IPv6 双协议栈,为在集群中运行的容器化应用提供网络连通性。与 Kubernetes 集群内应用的通信以及集群内服务之间的通信都是在四层(IP 地址、端口)和七层(主机名、通用资源标识符 [URI])进行管理,包含路由、负载均衡、安全防护、监控和可视化功能。
Kubernetes 网络
在 Kubernetes 网络模型中,每个 pod 都有一个唯一 IP 地址,该地址从集群的私有地址池动态分配。同一集群中的所有节点上运行的全部 pod 都属于同一个 IP 网络,可通过该网络相互通信。Pod 内的多个容器通过环回接口彼此通信。
Kubernetes Services
Kubernetes service 让集群中作为一个或多个 pod 运行的应用或微服务可在网络上访问(即所谓的“暴露”)。Kubernetes service 将应用表示为一个执行相同功能(例如 Web 服务)的指定 pod 的逻辑组。相同的选择符(或标签)被应用于服务中的所有 pod,以标记它们在 service 中的成员资格。当部署新的 pod 或终止运行中的 pod 时,Kubernetes 使用标签来跟踪 service 的 pod 集。
Kubernetes service 可以根据定义的互联策略在集群内相互通信,并且支持从集群外部访问,例如通过使用 Ingress controller。
Kubernetes Ingress
Ingress 对象是 Kubernetes Ingress API 的一部分,可通过七层(应用层)协议(如 HTTP)对外暴露 Kubernetes 中运行的应用。Ingress 网关和 Ingress Controller 被用于控制 Ingress 对象并管理用户与应用(用户与 service 间或南北向的互联)之间的通信。
不幸的是,Ingress 对象只能够为自定义请求处理策略提供有限的支持——比如,您无法为其定义和附加安全策略。因此,许多厂商使用自定义资源定义 (CRD) 来扩展其 Ingress Controller 的能力,以满足不断变化的客户需求。
举例来说,NGINX Ingress Controller 定义自定义资源(VirtualServer、VirtualServerRoute、TransportServer 和策略),以增强 API 网关、负载均衡器以及 Kubernetes 集群边缘 Ingress 功能的性能、弹性、正常运行时间、安全防护和可观测性。为了支持频繁的应用发布,NGINX 自定义资源还支持跨多租户开发和 DevOps 团队的自助治理。
Kubernetes Gateway API
Gateway API 是一个开源项目,旨在改善和规范 Kubernetes 中的服务网络。Gateway API 规范由 Kubernetes 社区管理,是由 Kubernetes Ingress API 演变而来,用于解决生产环境中 Ingress 资源的限制,能够为请求处理定义细粒度策略并跨多个团队和角色委托配置控制权。
如欲进一步了解 NGINX 的网关 API 实施,请参阅我们的博文《关于 NGINX Kubernetes Gateway 你需要知道的 5 件事》。
Service Mesh
service mesh 是一个基础架构层,控制 Kubernetes 集群中各服务之间的通信(service 到 service 或东西向的互联)。Service mesh 为在 Kubernetes 中运行的服务提供核心功能,包括负载均衡、身份验证、授权、访问控制、加密、可观测性和流量分割(断路器、A/B 测试以及蓝绿和灰度部署),以确保通信快速、可靠和安全。
如欲了解有关 service mesh 的更多内容,请参阅我们的博文《如何选择 service mesh》。
Kubernetes 安全防护
Kubernetes 安全防护采用分层方法来保护基础架构(内部和云计算资源、网络通信和管理平面)以及在 Kubernetes 集群内运行的应用。
为了确保基础架构的安全,请遵循通用安全防护建议、教程和最佳实践来保护云端和本地私有的实施部署。
要想保护应用,可以在边缘和 Kubernetes 集群内实施强大的安全防护控制,以提供身份验证、授权、访问控制、加密、监控和可视化能力,并为进出集群及集群内的所有通信提供可选的 Web 应用防火墙和拒绝服务防护。
如欲了解有关保护 Kubernetes 的更多内容,请参阅我们的博文《使用流量管理工具保护 Kubernetes 的六种方法》。
生产环境中的应用
在 Kubernetes 的早期采用阶段,自己动手 (DIY) 方法占主导地位,但对许多组织来说,这种方法太过复杂,难以构建和操作。因此,对于生产部署,组织正在采用云托管的 Kubernetes 平台和预打包的 Kubernetes 发行版——它们集成了各种技术组件,简化了维护生命周期,并可跨混合和多云环境部署。
下面是一些托管和预打包 Kubernetes 平台的示例:
云托管的 Kubernetes
- Amazon Elastic Kubernetes Service (EKS)
- Microsoft Azure Kubernetes Service (AKS)
- Google Kubernetes Engine (GKE)
预打包的 Kubernetes 发行版
NGINX 如何助您一臂之力
NGINX Kubernetes 原生应用互联可通过降低复杂性,延长正常运行时间,并提供内部、云和边缘运行的 Kubernetes 应用的实时、详尽可视化信息,帮助改善客户体验。
- Kubernetes 互联套件——跨混合多云环境扩展、观测、治理和保护 Kubernetes 应用。
- NGINX Ingress Controller——利用 API 网关、身份和可观测性功能来管理 Kubernetes 集群边缘的应用互联
- NGINX Service Mesh—一款开发人员友好型解决方案,可确保 service 到 service 连通性、安全防护、可观测性和灵活编排
立即申请 NGINX Ingress Controller 30 天免费试用版(带有 NGINX App Protect WAF 和 DoS),并下载始终免费的 NGINX Service Mesh。