1. Kubernetes 简介
Kubernetes,也称为 k8s,是一个开源的容器编排平台,能够自动化容器化应用程序的部署、扩展和管理。它提供了一种抽象底层基础设施的方式,并能够大规模管理应用程序,同时还提供了灵活性、可移植性和丰富的功能集。由于其广泛采用、活跃的社区以及处理复杂多层应用程序的能力,Kubernetes 已成为容器编排的事实标准。
◇Kubernetes 概述
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,支持声明式配置和自动化。它拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。
Kubernetes 的名称源自希腊语,意为舵手或飞行员。K8s 作为缩写,源于“K”和“s”之间的八个字母。Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 结合了 Google 超过 15 年的大规模生产工作负载经验以及社区中的最佳实践和理念。
◇为什么选择 Kubernetes
Kubernetes(k8s)之所以必要,是因为它提供了一个强大而灵活的平台,用于大规模部署和管理容器化应用程序。它允许轻松扩展、高弹性、应用程序可移植性、自动化许多任务以及容器平台的标准化。k8s 还有助于减少运维团队的复杂性和工作量,使他们能够专注于更具战略意义的计划。
- 官方 为什么你需要 Kubernetes 以及它能做什么
- 文章 为什么你应该使用 Kubernetes?
- 文章 入门:Kubernetes 的起源、它是什么以及为什么你应该关注
- 动态 探索关于 Kubernetes 的热门帖子
◇关键概念和术语
Kubernetes 是一个开源的容器编排平台,能够自动化容器化应用程序的部署、扩展和管理。以下是 Kubernetes 中的一些重要概念和术语:
-
集群架构:Kubernetes 背后的架构概念。
-
容器:用于打包应用程序及其运行时依赖的技术。
-
工作负载:了解 Pods,Kubernetes 中最小的可部署计算对象,以及帮助您运行它们的更高级抽象。
-
服务、负载均衡和网络:Kubernetes 中网络背后的概念和资源。
-
存储:为集群中的 Pods 提供长期和临时存储的方式。
-
配置:Kubernetes 提供的用于配置 Pods 的资源。
-
集群管理:与创建或管理 Kubernetes 集群相关的底层细节。
◇Kubernetes 替代方案
Kubernetes 是一个流行的开源容器编排工具,广泛用于管理和部署容器化应用程序。虽然还有其他容器编排工具可用,如 Docker Swarm、Mesos 和 Nomad,但 Kubernetes 与这些工具之间存在一些关键差异,其中一些如下所述:
-
架构:Kubernetes 设计为一个模块化系统,具有许多协同工作以提供容器编排的组件,例如 Kubernetes API 服务器、kubelet、kube-proxy 和 etcd。
-
可扩展性:Kubernetes 设计用于处理大规模部署,并可以根据需求扩展应用程序。
-
灵活性:Kubernetes 高度可配置,可以根据特定需求进行定制,而其他容器编排工具的配置选项可能更有限。
-
可移植性:Kubernetes 设计为云无关,可以在任何公共或私有云平台上运行,也可以在本地运行。
-
社区:Kubernetes 拥有一个庞大且活跃的开发者和用户社区,他们为其开发做出贡献并提供支持。
2. 容器
Kubernetes 建立在容器之上,因此在学习 Kubernetes 之前,您应该熟悉从头开始运行和构建容器。
- 文章 官方 Docker 教程
- 文章 Docker 课程
- 视频 100 秒内了解 Docker
- 视频 Docker 初学者免费 3 小时视频课程
- 动态 探索关于容器的热门帖子
3. 设置 Kubernetes
要设置 Kubernetes 集群,您需要选择一个部署环境,在每个节点上安装 Kubernetes 组件,使用插件配置网络,使用 kubeadm init 初始化主节点,使用 kubeadm join 加入工作节点,使用清单部署应用程序,并使用 kubectl 或管理工具管理集群。
◇安装本地集群
要在 CentOS 7 或 Ubuntu 上安装和配置 Kubernetes 集群,您需要先设置 Kubernetes 集群的先决条件和要求,然后安装 Kubernetes 组件,包括 Kubeadm、Kubelet 和 Kubectl,接着连接主节点和工作节点。一旦连接建立,您可以通过在集群上部署应用程序来检查它。
- 文章 如何在 CentOS 7 上安装 Kubernetes 集群
- 文章 如何在 Ubuntu 上使用 Kubeadm 创建 Kubernetes 集群
- 文章 在 Ubuntu 服务器上使用 Microk8s 部署 Kubernetes 集群
◇选择托管提供商
托管提供商是一种基于云的服务,提供托管的 Kubernetes 环境。这意味着提供商处理底层基础设施,如服务器、存储和网络,以及 Kubernetes 集群的安装、配置和维护。
在选择托管的 Kubernetes 提供商时,请考虑您使用的云提供商、功能和能力、定价和计费、支持、安全性和合规性以及提供商的声誉和评价。通过考虑这些因素,您可以选择一个满足您需求并为您的组织提供最佳价值的提供商。
◇部署您的第一个应用程序
要在 Kubernetes 中部署您的第一个应用程序,您需要在 YAML 文件中创建部署和服务清单,使用 kubectl apply 命令将清单应用到您的 Kubernetes 集群,使用 kubectl get pods 验证您的应用程序的 Pods 是否正在运行,并使用 kubectl get services 测试服务,然后通过 Web 浏览器或 cURL 等工具访问服务。还有一些工具和平台可以简化 Kubernetes 中的应用程序部署,例如 Helm 图表和 Kubernetes 操作符。
- 官方 使用 kubectl 创建部署
- 文章 从 A 到 Z 在 Kubernetes 上部署应用程序
- 文章 Kubernetes 101:使用 MicroK8s 部署您的第一个应用程序
- 视频 Kubernetes 教程 | 您的第一个 Kubernetes 应用程序
- 视频 Kubernetes 101:部署您的第一个应用程序
4. 运行应用程序
要在 Kubernetes 集群中运行应用程序,您需要使用 YAML 文件定义 Kubernetes 对象,如 Deployment 或 StatefulSet、Service 以及 ConfigMap 或 Secret。Deployment 或 StatefulSet 定义了容器镜像、容器端口和其他设置。Service 为应用程序提供了一个稳定的 IP 地址和 DNS 名称以便访问,而 ConfigMap 或 Secret 包含配置数据或敏感信息。要部署应用程序,请使用 kubectl apply
创建或更新 Kubernetes 对象。Kubernetes 会根据 YAML 文件自动管理应用程序的部署、扩展和网络。可以通过 kubectl
命令进行监控和修改。
◇Pods
在 Kubernetes 中,Pod 是最小的可部署单元,代表集群中运行的单个进程实例。一个 Pod 可以包含一个或多个容器,这些容器共享相同的网络命名空间,并且可以访问相同的存储卷。Pod 由 Kubernetes 创建和管理,并被调度到集群中的某个节点上运行。Pod 提供了一个轻量级且灵活的抽象层,使 Kubernetes 能够管理容器化应用程序的部署、扩展和网络。Pod 还促进了在同一 Pod 中运行的容器之间的通信和数据交换。
- 官方 Pod 文档
- 文章 Kubernetes 之道:Pod 和 Service
- 文章 配置生产环境中运行的 Kubernetes Pod 的 5 个最佳实践
- 视频 Kubernetes 中的 Pod 是什么?为什么需要它?
◇ReplicaSets
ReplicaSet 是一个控制器,用于确保集群中始终运行指定数量的 Pod 副本(相同的副本)。ReplicaSet 通过根据需求变化或硬件故障自动扩展或缩减 Pod 副本的数量,从而确保高可用性和可扩展性。它们通过 YAML 文件定义,该文件指定了所需的副本数量、要使用的 Pod 模板以及其他设置。ReplicaSet 负责监控 Pod 的状态,并根据需要创建或删除副本以满足所需状态。
◇Deployments
Deployment 是一种通过声明式配置管理 Pod 和 ReplicaSet 的资源对象,它定义了描述应用程序工作负载生命周期的期望状态,包括 Pod 数量、部署策略、容器镜像等。Deployment 控制器确保实际状态与期望状态匹配,例如替换失败的 Pod。开箱即用,Deployments 支持多种部署策略,如“重新创建”和“滚动更新”,但也可以自定义以支持更高级的部署策略,如蓝/绿部署或金丝雀部署。
◇StatefulSets
StatefulSet 是一个控制器,用于管理一组需要稳定网络标识和稳定存储卷的有状态 Pod 的部署和扩展。StatefulSets 用于运行有状态应用程序,如数据库,其中每个 Pod 的顺序和唯一性很重要。StatefulSets 为每个 Pod 提供唯一的稳定网络标识和稳定存储卷,这使得有状态应用程序即使在扩展或缩减、节点故障或更换时也能保持数据一致性。StatefulSets 通过 YAML 文件定义,该文件包括 Pod 模板、用于访问 Pod 的 Service 以及其他设置。
◇Jobs
Job 是一个控制器,用于管理有限任务或批处理作业的执行。Jobs 用于运行短期任务,如批处理、数据分析或备份,这些任务运行完成后即终止。Jobs 创建一个或多个 Pod 来运行任务,并监控每个 Pod 的完成状态。如果 Pod 失败或终止,Job 会自动创建一个替代 Pod 以确保任务成功完成。Jobs 通过 YAML 文件定义,该文件包括 Pod 模板、完成标准和其他设置。
5. 服务与网络
服务和网络是实现 Pod 与外部客户端通信的关键组件。服务为访问一组 Pod 提供了稳定的端点,而网络插件和配置选项则实现了 Pod 之间的通信和网络隔离。这些功能设计为可扩展、可靠且灵活,使开发者能够更轻松地管理和编排复杂的微服务架构。诸如 Ingress 和基于 DNS 的服务发现等附加功能,提供了灵活的外部访问服务方式,并简化了集群内的服务发现。
- 官方 Service - 文档
- 官方 Kubernetes 网络模型
- 推荐 探索关于网络的热门文章
◇服务的外部访问
Kubernetes (k8s) 服务的外部访问允许外部客户端访问集群中运行的 Pod 和服务。在 k8s 中,有多种方式可以实现服务的外部访问,包括 NodePort、LoadBalancer 和 Ingress。Ingress 是 Kubernetes 中的一个对象,它提供了一种灵活的方式来管理外部访问,基于 URL 或主机将流量路由到服务。外部访问对于确保 Kubernetes 部署的可扩展性和可靠性至关重要。
◇负载均衡
负载均衡通过使用 Service 对象将网络流量分配到多个 Pod 或节点。Service 为一组 Pod 提供了稳定的网络端点,允许其他 Pod 或外部客户端通过单个 IP 地址和 DNS 名称访问它们。Kubernetes 为 Service 提供了三种负载均衡算法,分别基于轮询、最少连接或 IP 哈希来分配流量。负载均衡是 Kubernetes 网络的重要组成部分,为集群提供了高效且可靠的流量分配。
◇网络与 Pod 间通信
网络对于 Kubernetes 集群中 Pod 和资源之间的通信至关重要。每个 Pod 都有一个唯一的 IP 地址,可以直接与其他 Pod 通信。容器网络接口(CNI)插件用于配置 Pod 的网络接口,并提供 Pod 之间的隔离。Kubernetes 还提供了诸如负载均衡、服务发现和 Ingress 等网络服务,使外部流量能够访问 Pod 和服务。这些服务通过 Kubernetes 对象(如 Service、Ingress 和 NetworkPolicies)实现。网络和 Pod 间通信对于 Kubernetes 集群的可扩展性、可靠性和灵活性至关重要。
- 官方 集群网络 - 文档
- 官方 具有 Pod 间通信的 Job
- 文章 Kubernetes 如何为应用程序提供网络和存储
- 推荐 探索关于网络的热门文章
6. 配置管理
Kubernetes (K8s) 中的配置管理是定义和管理在 K8s 集群中运行的应用程序配置的过程。K8s 提供了多种管理配置的机制,包括 ConfigMap 和 Secret,并支持多种将配置注入应用程序容器的方式。配置管理与其他 Kubernetes 功能紧密集成,对于在 Kubernetes 中构建可扩展且可靠的应用程序至关重要。
- 官方 容器中的配置管理
- 视频 Kubernetes 中的配置管理入门
◇使用 ConfigMap 注入 Pod 配置
ConfigMap 是一种存储配置数据的方式,可供集群中运行的应用程序使用。ConfigMap 是一个键值存储,可以保存诸如数据库 URL、凭证、API 密钥等应用程序配置数据。
◇使用 Secret 管理敏感数据
Kubernetes Secret 以安全的方式存储敏感数据,如密码、令牌和 API 密钥。它们可以手动或自动创建,并存储在 etcd 中。Secret 可以作为文件或环境变量挂载到 Pod 中,并且可以使用 Kubernetes RBAC 管理访问权限。然而,它们有一些限制,例如大小限制和创建后无法更新。理解 Secret 对于在 Kubernetes 中构建安全的应用程序非常重要。
7. 资源管理
Kubernetes 中的资源管理涉及管理 CPU、内存和存储资源,以确保资源的高效和有效利用。Kubernetes 提供了多种功能和工具,包括资源配额、限制、节点亲和性与反亲和性、水平和垂直 Pod 自动扩展以及集群自动扩展,以有效管理资源。这些功能有助于确保资源公平分配,避免资源争用,并使 Pod 能够访问所需的资源。通过使用这些功能,Kubernetes 可以高效地管理资源,从而提高性能、增强可靠性并降低成本。
◇设置资源请求和限制
Kubernetes 中的资源请求和限制指定了容器运行所需的最小和最大 CPU 和内存量。资源请求用于在具有足够资源的节点上调度容器,而限制则强制执行资源配额并防止容器消耗过多资源。这些设置可以在 Pod 或容器级别通过 YAML 中的 resources
字段进行配置。正确设置资源请求和限制对于确保 Kubernetes 集群中的最佳资源利用率至关重要。
- 官方 请求和限制 - 文档
- 官方 默认内存限制和请求的动机
- 文章 理解 Kubernetes 资源类型
- 文章 Kubernetes 请求和限制揭秘
◇为命名空间分配配额
为命名空间分配配额是限制 Kubernetes 中特定资源组资源使用的一种方式。可以为 CPU、内存和其他资源以及命名空间中的对象数量设置配额。这有助于确保集群中不同团队或项目之间的资源公平分配。配额可以应用于单个命名空间或整个集群。Kubernetes 允许使用硬配额(强制执行严格的资源限制)和软配额(允许在一定范围内超额)。配额可以通过 Kubernetes API 或 YAML 配置文件进行管理。
◇监控和优化资源使用
在 Kubernetes (k8s) 中监控和优化资源使用对于确保资源的高效和有效利用至关重要。为了监控资源使用,k8s 提供了 Metrics Server,并且可以与 Prometheus 集成。容器运行时接口 (CRI) 也可用于监控容器级资源使用数据。为了优化资源使用,设置适当的请求和限制、使用水平 Pod 自动扩展 (HPA)、实施 Pod 亲和性与反亲和性规则以及控制节点选择都可以帮助减少资源争用并提高资源利用率。通过监控和优化资源使用,k8s 可以确保应用程序高效运行并有效利用资源。
8. Kubernetes 安全
Kubernetes (k8s) 安全涉及保护集群资源免受潜在威胁,如未经授权的访问、数据泄露和拒绝服务攻击。这可以通过访问控制、网络安全、加密和监控等措施实现。常用的 k8s 安全工具包括基于角色的访问控制 (RBAC)、Kubernetes 网络策略、TLS 证书和容器镜像扫描。定期更新和修补 k8s 环境对于维护安全也很重要。
◇基于角色的访问控制 (RBAC)
基于角色的访问控制 (RBAC) 是一种根据分配给用户或组的角色来控制对 Kubernetes 资源访问的方法。RBAC 涉及创建角色并将其绑定到用户或组,以控制对 Kubernetes 资源的访问。角色被定义为一组规则,决定可以对特定资源执行哪些操作。通过将角色分配给用户或组,可以根据角色中定义的权限限制或授予对 Kubernetes 资源的访问。RBAC 通过限制对授权用户和组的访问,帮助确保 Kubernetes 集群的安全性和完整性。
- 官方 基于角色的访问控制最佳实践
- 文章 Kubernetes 访问控制入门
- 文章 理解 Kubernetes 授权的实用方法
- 文章 Kubernetes RBAC 的三种现实方法
- 文章 基于角色的访问控制:五种常见的授权模式
- 文章 使用 RBAC 大规模保护 Kubernetes 和其他资源
- 视频 理解 Kubernetes 中的基于角色的访问控制
◇网络安全
Kubernetes 中的网络安全涉及保护集群内不同组件之间以及与外部网络之间的网络通信。这可以通过网络策略、加密、认证、授权和防火墙规则等多种机制实现。网络策略提供了对网络流量的细粒度控制,而加密则确保 Pod、节点和外部系统之间的安全通信。认证和授权机制防止未经授权的访问,并提供各种组件之间的安全通信。防火墙规则通过限制对特定端口和协议的访问,帮助保护集群免受外部攻击。总体而言,Kubernetes 中的网络安全对于维护集群的机密性、完整性和可用性至关重要。
- 官方 网络策略 - 文档
- 文章 6 个 Kubernetes 安全最佳实践
- 文章 Kubernetes 网络安全效应
- 文章 Kubernetes 安全最佳实践,让你远离新闻头条
- 视频 Kubernetes 安全最佳实践
- 订阅 探索有关安全的热门文章
◇容器和 Pod 安全
Kubernetes (k8s) 可以通过使用可信的容器镜像、限制容器权限、强制执行 Pod 级安全策略、实施网络安全措施、使用 RBAC 进行访问控制以及使用 Secrets 和 ConfigMaps 管理敏感信息等措施来保护容器和 Pod。这些实践有助于组织降低其 k8s 集群中发生安全事件的风险。
- 官方 为 Pod 或容器配置安全上下文
- 文章 教程:创建 Kubernetes Pod 安全策略
- 文章 6 个被忽视但重要的 Kubernetes 安全功能
- 视频 Kubernetes 安全 - Pod 或容器的安全上下文
- 订阅 探索有关安全的热门文章
◇安全扫描器
Kubernetes 安全扫描器帮助在部署前识别容器镜像中的漏洞和潜在安全威胁。流行的选项包括 Aqua Security、Twistlock、Sysdig Secure、Trivy、Anchore Engine 和 OpenSCAP。这些扫描器提供了多种功能,如漏洞扫描、合规性检查和 Kubernetes 环境的运行时保护。通过将这些扫描器集成到其管道中,组织可以确保其 Kubernetes 部署的安全性和完整性,并最大限度地降低安全漏洞和数据丢失的风险。
- 文章 8+ 个开源 Kubernetes 漏洞扫描器
- 文章 7 个 Kubernetes 安全扫描器
- 文章 通过 CI/CD 自动化镜像扫描提高安全性
- 文章 Starboard:将所有 Kubernetes 安全组件整合在一起
- 订阅 探索有关安全的热门文章
9. 监控与日志
在 Kubernetes 中,监控涉及对集群及其组件的健康和性能进行持续关注。这包括监控 CPU、内存和存储等资源的使用情况和可用性,以及 Kubernetes 服务和节点的状态。一些流行的 Kubernetes 监控解决方案包括 Prometheus、Grafana 和 Datadog。
Kubernetes 中的日志记录涉及收集和分析集群中各种组件(如应用程序、Pod 和节点)生成的日志。这些日志可以提供有关集群行为和性能的洞察,并有助于排查问题。一些流行的 Kubernetes 日志记录解决方案包括 Fluentd、Elasticsearch 和 Kibana。
- 官方 资源监控工具
- 官方 监控、日志记录和调试
- 官方 日志架构
- feed 探索关于日志的热门帖子
◇日志
日志由集群节点上运行的容器化应用程序生成。您可以使用 kubectl logs
命令后跟 Pod 名称来访问这些日志。默认情况下,此命令显示 Pod 中最近容器的日志,但您可以通过在命令中添加容器名称来指定 Pod 中的特定容器。在命令中添加 -f
标志可以实时跟踪日志。Kubernetes 还提供了第三方日志记录解决方案,如 EFK 和 Prometheus 堆栈,这些解决方案为大规模应用程序提供了更高级的日志记录功能和可扩展性。
- 官方 系统日志
- 视频 Kubernetes:日志收集解释
◇指标
需要监控的指标包括 CPU 使用率、内存使用率、网络使用率、磁盘使用率、API 服务器指标、Pod 和容器指标以及集群级指标。这些指标提供了有关集群、节点和应用程序的性能和健康的洞察。Kubernetes 提供了 Prometheus、Grafana 和 Kubernetes Dashboard 等工具来收集和分析这些指标。通过监控这些指标,管理员可以识别性能问题并优化集群以提高性能和可扩展性。
- 官方 节点指标数据
- 视频 如何在 K8s 中收集指标?
◇追踪
Kubernetes 中的追踪涉及使用 Jaeger 或 Zipkin 等工具监控请求在系统不同组件之间的流动。OpenTracing 和 OpenCensus 提供了一种一致的方式来捕获集群上运行的不同组件和应用程序的追踪。追踪有助于识别性能瓶颈、调试问题并优化系统以提高性能和可扩展性。通过在 Kubernetes 中监控追踪,管理员可以识别问题并采取纠正措施,以确保系统的高效性能。
- 官方 Kubernetes 系统组件的追踪
- 视频 追踪简介
◇资源健康
Kubernetes 中的资源健康监控涉及监控 Pod、节点和容器等资源的健康和可用性。它帮助管理员使用 Kubernetes Dashboard、Prometheus 或 Grafana 等工具识别和排查可能影响系统性能和可用性的问题。资源健康监控还有助于确保系统能够抵御故障,并能够从任何中断中快速恢复。这是管理 Kubernetes 集群的重要部分,确保了系统的可靠性、可用性和可扩展性。
◇可观测性引擎
Kubernetes 中的可观测性(k8s)指的是能够深入了解集群、应用程序和服务的内部运作。Kubernetes 中的可观测性引擎是一种工具或平台,用于促进从 Kubernetes 环境中的各种来源收集、分析和可视化数据。一些流行的 Kubernetes 可观测性引擎包括 Prometheus、Grafana、Jaeger 和 Elastic Stack (ELK)。
- 开源 K8sGPT - Kubernetes 问题的 AI 扫描器
- 开源 HolmesGPT - 用于调查 Kubernetes 问题和 Prometheus 警报的 AIOps 平台
- 文章 Kubernetes 可观测性 101:工具、最佳实践等
- 文章 KubeSphere 中的 Kubernetes 可观测性
- feed 探索关于可观测性的热门帖子
10. 自动扩展
Kubernetes 中的自动扩展涉及根据需求调整分配给部署或一组 Pod 的资源。它包括水平 Pod 自动扩展(HPA)和垂直 Pod 自动扩展(VPA),分别增加或减少副本或调整资源请求和限制。自动扩展可以与集群自动扩展结合使用,以有效分配资源并确保应用程序的响应能力。它适用于处理可变工作负载或流量突然激增的情况。
◇水平 Pod 自动扩展器 (HPA)
这是 Kubernetes 中的一项功能,它根据当前工作负载的需求自动扩展 Pod 的副本数量。HPA 控制器监控 Pod 的 CPU 使用率或其他指标,并调整 Pod 的副本数量以满足指定的目标。这有助于确保工作负载能够处理流量和需求的增加,而不会使集群资源过载。
◇垂直 Pod 自动扩展器 (VPA)
垂直 Pod 自动扩展器(VPA)是 Kubernetes 中的一项功能,它自动化了调整 Pod 中容器资源限制的过程。与水平 Pod 自动扩展器(HPA)不同,HPA 扩展 Pod 的副本数量,而 VPA 扩展分配给 Pod 容器的资源。它根据每个容器的实际使用情况调整其资源请求和限制。
◇集群自动扩展
集群自动扩展是 Kubernetes 中的一项功能,它根据节点资源利用率自动扩展集群。它监控节点的利用率,并相应地创建或删除节点,以确保有适当的资源来处理工作负载,同时最大限度地降低成本。实现集群自动扩展有不同的方法,例如使用水平 Pod 自动扩展器或集群自动扩展器。它适用于工作负载高度变化的场景,确保应用程序保持响应性和可用性,而无需手动调整集群大小。
11. 调度
Kubernetes中的调度是指将工作负载分配给集群中特定节点的过程。Kubernetes调度器根据资源可用性、节点适用性和工作负载优先级等因素做出调度决策。它在集群中平衡工作负载,以确保高效的资源利用,并避免节点过载。调度会考虑地理位置、硬件需求和应用程序特定需求等因素。
- 官方 Kubernetes调度器
- 官方 调度框架
◇调度基础
调度涉及根据资源可用性、标签、亲和性/反亲和性规则、污点和容忍度等标准将Pod分配给工作节点。Pod是k8s中最小的可部署单元,由一个或多个共享相同网络命名空间的容器组成。调度器负责将Pod分配给节点,而标签用于匹配。亲和性和反亲和性规则规定了根据Pod与其他Pod或节点的关系如何调度Pod。QoS用于根据资源需求对Pod调度进行优先级排序。
◇污点和容忍度
污点和容忍度在Kubernetes中用于根据标签限制或允许Pod在特定节点上调度。污点是应用于节点的标签,用于指示某些限制或要求。容忍度是应用于Pod的标签,表明它可以容忍某些污点。当节点有污点时,只有具有相应容忍度的Pod才能在该节点上调度。此功能对于各种目的很有用,例如确保关键和非关键工作负载的分离,为特定任务保留节点,以及防止节点过载。
- 官方 污点和容忍度
- 视频 Kubernetes初学者:污点和容忍度
◇拓扑分布约束
拓扑分布约束确保Pod在集群拓扑中均匀分布。约束定义了在给定级别(如节点、区域或机架)上可以运行特定类型Pod的数量规则。这些约束可以根据特定需求进行自定义,例如确保关键工作负载分布在多个区域。它们通过防止资源过载和促进工作负载的平衡分布,帮助防止单点故障并提高应用程序弹性。可以使用Kubernetes API或命令行界面添加约束。
- 官方 拓扑分布约束
- 视频 Kubernetes | 拓扑分布约束
◇Pod优先级
Kubernetes中的Pod优先级决定了当资源需求存在竞争时,Pod在节点上调度的顺序。每个Pod都被分配一个数字优先级值,较高的值表示较高的优先级。调度器在考虑节点适用性、污点和容忍度以及亲和性和反亲和性规则的同时,最大化已调度Pod的总优先级。优先级可以根据业务逻辑或应用程序需求手动或自动设置。优先级有助于确保关键工作负载获得必要的资源并首先调度,而较低优先级的工作负载在资源可用时调度。
◇驱逐
驱逐是指由于资源限制或Pod故障等原因,终止或删除节点上运行的Pod。它们可以由系统启动,也可以由管理员通过API手动启动。驱逐可以是优雅的,允许Pod清理资源,也可以是强制的,立即终止它们。Kubernetes提供了抢占和Pod干扰预算,以有效处理驱逐并最小化服务中断。驱逐对于管理和维护Kubernetes集群是必要的,Kubernetes提供了处理它们的工具。
12. 存储和卷
卷提供可供Pod中运行的容器访问的目录,并可以由各种存储类型支持。持久卷独立于Pod,可以被多个Pod重复使用,而持久卷声明从持久卷请求特定数量的存储。存储类允许管理员定义可以动态配置的不同存储类型。
- 官方 存储文档
- 官方 持久卷文档
- 视频 Kubernetes中有状态应用程序的基础知识
- feed 探索关于存储的热门帖子
◇CSI驱动
Kubernetes中的CSI(容器存储接口)驱动程序为存储提供商提供了一种标准方式,用于与Kubernetes集成并为容器化应用程序提供持久存储。它们作为独立的容器化进程运行,并通过定义良好的API与Kubernetes通信。CSI驱动程序允许Kubernetes访问各种存储系统,并提供快照和克隆等高级功能。
◇有状态应用
在Kubernetes中,存储是有状态应用程序的关键组件,因为这些应用程序需要持久数据存储,可以在应用程序的多个副本之间使用。Kubernetes提供了几种存储选项,包括卷、持久卷和存储类。
卷是Kubernetes存储的基本构建块。卷是一个可访问运行应用程序的容器的目录,可以由不同类型的存储支持,如主机目录、云提供商磁盘或网络存储系统。卷由Kubernetes创建和管理,可以作为Pod定义的一部分挂载到容器中。
13. 部署模式
部署是Kubernetes中用于声明式管理应用程序容器在集群中的推出和扩展的资源。部署允许团队定义部署的期望状态,并自动管理底层的Pod和副本集以实现该状态。Kubernetes提供了各种部署策略,如RollingUpdate或Canary,以控制应用程序新版本的推出和扩展方式。
- 官方 部署 - 文档
- 视频 Kubernetes部署如何工作?
- feed 探索关于CI/CD的热门帖子
◇CI/CD集成
与Kubernetes集成CI/CD涉及设置一个管道,用于构建和部署应用程序到Kubernetes集群。这个过程通常包括开发应用程序代码,设置源代码仓库,选择CI/CD工具,构建Docker镜像,将镜像推送到容器注册表,使用Kubernetes清单部署应用程序,以及监控和排除管道和部署问题。通过自动化应用程序的测试和部署,CI/CD与Kubernetes集成可以帮助提高软件质量,加速开发,并确保一致和可靠的部署。
◇GitOps
GitOps是一套使用Git仓库作为声明式配置的真实来源来管理基础设施和应用程序的实践。在Kubernetes中,GitOps涉及使用Git作为系统期望状态和实际状态的单一真实来源,自动化部署和管理任务,并通常与持续交付(CD)实践一起使用。其结果是一种更一致、更可靠、更自动化的管理基础设施和应用程序的方法。
◇Helm Charts
Helm是Kubernetes的包管理器,通过使用可重用和版本化的Helm图表简化了复杂应用程序的部署和管理。这些图表由描述相关Kubernetes资源集的YAML文件组成,可以使用值文件和Go模板进行自定义。Helm图表还可以依赖于其他图表,并存储在中央仓库(如Helm Hub)中,以便于共享和访问。通过利用Helm,团队可以简化应用程序管理并减少重复工作。
- 官方 Helm文档
- 视频 Kubernetes中的Helm是什么?Helm和Helm图表解释
- feed 探索关于Helm的热门帖子
◇金丝雀部署
金丝雀部署是Kubernetes中使用的一种技术,通过将一小部分用户或流量引导到新版本,而大多数用户继续使用旧版本,来逐步推出应用程序的新版本。这种方法允许在实际条件下测试新版本,然后再完全提交更新。在Kubernetes中,金丝雀部署可以使用Istio、Linkerd或Nginx等工具实现,或者使用内置功能,如部署策略和流量路由。
- 文章 K8s部署的金丝雀部署
- 视频 Kubernetes金丝雀部署解释
◇蓝绿部署
蓝绿部署是Kubernetes中用于部署应用程序新版本的部署策略,通过运行两个相同的生产环境,一个使用当前版本(蓝色),另一个使用新版本(绿色)。在绿色环境经过完全测试后,流量会从蓝色环境路由到绿色环境,为用户提供无缝过渡,避免任何停机或中断。在Kubernetes中,蓝绿部署可以使用各种工具和技术实现,包括部署策略、流量路由和负载平衡。
◇滚动更新/回滚
滚动更新是Kubernetes中的一种部署策略,用于通过逐步更新现有Pod为新版本来部署应用程序的新版本,同时确保应用程序在整个过程中保持可用。Kubernetes允许团队配置滚动更新,以一次更新一定百分比的Pod,并等待它们变得可用后再继续更新。如果出现任何问题,Kubernetes提供了回滚机制,允许团队轻松回退到应用程序的先前版本。
14. Kubernetes高级主题
Kubernetes可以通过自定义资源和控制器扩展,以管理复杂的应用程序和工作流。它提供了各种网络模型来支持Pod和服务之间的通信,包括服务网格和网络策略,并可以与各种CI/CD工具和平台集成,以自动化应用程序部署和更新。K8s提供了各种管理存储的选项,包括本地存储、网络附加存储(NAS)和云存储提供商。
◇创建自定义控制器
Kubernetes中的自定义控制器自动化管理Kubernetes原生不支持的自定义资源。它们被实现为Kubernetes控制器,监视自定义资源并对其状态变化做出反应。自定义资源是通过扩展Kubernetes API创建的,增加特定于组织需求的新资源类型。自定义控制器可以使用各种编程语言和框架开发,如Operator框架。Operator框架提供了开发、测试和部署自定义控制器的工具和最佳实践。
- 官方 自定义控制器
- 视频 使用自定义控制器扩展Kubernetes
◇自定义调度器和扩展器
Kubernetes中的自定义调度器扩展器通过允许用户基于自定义指标和约束定义自己的调度逻辑,增强了Kubernetes的调度能力。它们被实现为与Kubernetes调度器一起运行的自定义Kubernetes控制器。自定义调度器扩展器可用于实现特定于组织需求的调度策略,并可以使用各种编程语言开发。它们拦截调度请求,根据用户定义的规则添加自定义调度逻辑,并将请求传回Kubernetes调度器。
◇自定义资源定义(CRDs)
Kubernetes中的自定义资源定义(CRDs)通过定义特定于组织需求的新资源类型来扩展Kubernetes API。CRDs创建可以管理各种资源的自定义资源,如应用程序、数据库、存储和网络。它们使用YAML或JSON清单定义,可以使用Kubernetes API服务器创建和管理。一旦创建,自定义资源可以使用Kubernetes控制器管理,并与其他Kubernetes组件集成。CRDs是简化Kubernetes操作并使组织能够以更高效和定制化的方式管理资源的强大工具。
- 官方 自定义资源 - 文档
- 视频 自定义资源定义(CRD)解释与演示
◇Kubernetes扩展和API
Kubernetes(k8s)扩展和API用于自定义Kubernetes的行为并向系统添加新功能。Kubernetes扩展,包括自定义资源定义(CRDs)、自定义控制器、自定义调度器扩展器和自定义指标API,增强了Kubernetes功能。Kubernetes API用于管理Kubernetes集群中的资源并与系统交互。Kubernetes扩展和API共同提供了一个强大的工具包,用于自定义和扩展Kubernetes,使用户能够构建自定义组件和API,简化Kubernetes中的操作。
- 官方 扩展 - 文档
- 官方 Kubernetes API - 文档
- feed 探索关于Kubernetes的热门帖子
◇集群操作
自己的集群
要创建自己的Kubernetes集群,您需要选择云提供商或设置自己的基础设施,在基础设施上安装Kubernetes,通过设置网络、存储和安全来配置集群,使用Kubernetes清单部署应用程序,并使用Kubernetes Dashboard、kubectl和Prometheus等工具监控和管理集群。这个过程可能很复杂和耗时,但它让您完全控制基础设施,并允许定制以满足特定需求。
控制平面安装
控制平面的组件对集群做出全局决策(例如调度),以及检测和响应集群事件(例如,当部署的副本字段不满足时启动新的Pod)。控制平面组件可以在集群中的任何机器上运行。然而,为了简单起见,设置脚本通常在同一台机器上启动所有控制平面组件,并且不在这台机器上运行用户容器。
- 官方 初始化控制平面节点 - 文档
- 视频 教程 - 安装控制平面组件
管理工作节点
Kubernetes通过将容器放入Pod中在节点上运行您的工作负载。节点可能是虚拟机或物理机,取决于集群。每个节点由控制平面管理,并包含运行Pod所需的服务。
- 官方 节点管理
- 视频 Kubernetes 101:节点教程
多集群管理
Kubernetes(k8s)中的多集群管理是指使用单个控制平面管理多个Kubernetes集群的能力。这种方法允许管理员集中管理和编排多个集群中的资源,无论它们位于何处,而无需在多个管理控制台或工具之间切换。