认识
一、认识
Kubernetes
(常简称为 k8s
)是一个开源的容器编排平台,由 Google
设计和开发,并由 Cloud Native Computing Foundation
(CNCF
) 维护。Kubernetes
的目标是为容器化应用提供自动化部署、扩展和管理的能力。提供以下基本功能:
-
将应用水平扩容到多个集群
-
为扩容的实例提供负载均衡的策略
-
提供基本的健康检查和自愈能力
-
实现任务的统一调度
Kubernetes
是一个功能强大且灵活的容器编排平台,适用于各种复杂的应用部署和管理场景。Kubernetes
适合大型项目、复杂应用和需要高度可扩展性和灵活性的场景。Kubernetes
提供了更全面的功能和更强大的编排能力,适合需要复杂部署策略、大规模集群管理和多租户隔离的企业级应用。
1.1 为什么需要 K8s
传统容器编排的痛点: 容器技术虽然解决了应用和基础设施异构的问题,让应用可以做到一次构建,多次部署,但在复杂的微服务场景,单靠 Docker
技术还不够,仍然存在以下问题没有解决:
-
集成和编排服务模块
-
提供按需自动扩容,缩容能力
-
健康检查,故障自愈
-
集群内的通信
1.2 K8s 能够解决什么问题?
-
按需的垂直扩容,新的服务器(
Node
)能够轻易的增加或者删除 -
按需的水平扩容,容器实例能够轻松扩容、缩容
-
副本控制器,不用担心副本的状态
-
服务发现和路由
-
自动部署和回滚,如果应用状态错误,可以实现自动回滚
二、功能
2.1 服务发现
通过服务和 Ingress
资源,Kubernetes
提供了内置的服务发现和负载均衡功能。
2.2 负载均衡
通过服务和 Ingress
资源,Kubernetes
提供了内置的服务发现和负载均衡功能。
2.3 自愈能力
Kubernetes
自愈能力强,支持更多健康检查和恢复机制。 Kubernetes
会监控 Pod
和节点的健康状态,并在检测到故障时自动重启或替换 Pod
。
2.4 水平扩展
Kubernetes
支持根据 CPU
或内存的使用情况自动扩展或缩减应用程序实例数量。
2.5 存储编排
Kubernetes
可以自动挂载所需的存储系统,包括本地存储、云存储和网络存储。
2.6 滚动更新和回滚
Kubernetes
支持更高级的滚动更新和回滚策略。 Kubernetes
可以自动化应用程序的部署和更新,并支持回滚到先前的版本,确保应用程序在更新过程中保持可用。
2.7 命名空间和资源隔离
通过命名空间实现多租户环境的资源隔离,确保不同团队或项目的资源独立管理。
三、核心
3.1 核心组件
1. Master
节点: 对集群做出全局决策(比如调度),以及检测和响应集群事件,管理集群的控制平面,负责所有管理任务。主要组件包括:
-
kube-api-server
:Master
节点上负责提供Kubernetes API
服务的组件;处理所有的REST API
请求,并与集群的各个组件进行通信。 -
etcd
:etcd
是兼具一致性和高可用性的键值数据库,可以作为保存Kubernetes
所有集群数据等的后台数据库。 分布式键值存储,用于保存集群的所有配置信息和状态数据。 -
kube-scheduler
: 负责根据资源需求和可用性将容器分配到合适的节点上。 -
kube-controller-manager
: 在Master
节点上运行控制器的组件。运行各种控制器以确保集群的状态符合预期。这些控制器包括:-
节点控制器
Node Controller
: 负责在节点出现故障时运行通知和响应 -
副本控制器
Replication Controller
: 负责为系统中的每个副本控制器对象维护正确数量的Pod
-
终端控制器
Endpoints Controller
: 填充终端(Endpoints
)对象(即加入Service
与Pod
)。 -
服务账户和令牌控制器
Service Account & Token Controllers
, 为新的命名空间创建默认账户和API
访问令牌
-
2. Node
工作节点: 运行容器化应用的节点,主要组件包括:
-
kubelet
: 一个在集群中每个节点上运行的代理,它保证容器都运行在Pod
中。节点级代理,确保容器在节点上运行并保持它们的健康状态。 -
Kube-Proxy
: 一个在集群中每个节点上运行的网络代理。实现网络代理,处理Pod
网络通信和负载均衡。 -
Container Runtime
: 负责运行容器的软件。运行容器的实际环境,如Docker
、containerd
或CRI-O
。
3.2 核心概念
Pod
: Kubernetes
中最小的部署单位,由一个或多个容器组成,这些容器共享网络和存储。每个 Pod
都有一个唯一的 IP
地址,并且可以在不同节点上移动。
Service
: 提供一组 Pod
的稳定访问点,支持负载均衡。Service
可以使用 ClusterIP
、NodePort
或 LoadBalancer
类型来暴露服务。服务是一种抽象,定义了一组 Pod
的逻辑集合以及访问这些 Pod
的策略。它提供了持久的 IP
地址和 DNS
名称,确保即使 Pod
重启或替换,服务地址也保持不变。
Volume
: 提供 Pod
共享的持久存储,可以挂载到 Pod
中的容器上。支持多种存储类型,如 NFS
、iSCSI
、云存储(如 AWS
EBS
、GCP
Persistent Disk
)。
Namespace
: 用于在同一集群中隔离资源和对象,便于管理和组织。适用于多租户环境或隔离开发、测试和生产环境。
ConfigMap
: 用于存储非机密配置信息,可以挂载到 Pod
中。
Secret
: 用于存储敏感信息(如密码、密钥),以加密方式存储和使用。
Deployment
: 高级管理 Pod
和 ReplicaSet
的控制器,用于声明和管理应用的期望状态。支持滚动更新和回滚。
ReplicaSet
: 确保指定数量的 Pod
副本运行,通常由 Deployment
管理。
StatefulSet
: 用于管理有状态应用,确保 Pod
有固定的标识和稳定的存储。适用于数据库和其他需要持久化数据的应用。
DaemonSet
: 确保每个(或指定)节点上运行一个 Pod
副本,适用于日志收集、监控等系统服务。
Job
: 管理一次性任务,确保任务成功完成。
CronJob
: 管理定时任务,根据时间表定期运行 Job
。
四、工作
-
用户提交请求: 通过
kubectl
命令行工具或其他客户端向API Server
发送请求。 -
API Server
处理请求:API Server
处理请求并将数据存储在etcd
中。 -
Scheduler
调度Pod
:Scheduler
检查未绑定的Pod
并根据资源需求和策略将其调度到合适的节点上。 -
kubelet
管理Pod
:kubelet
在指定节点上创建和管理Pod
,确保它们按预期运行。 -
Service
和负载均衡:Kube-Proxy
管理网络规则,确保服务请求被正确路由到对应的Pod
。 -
Controller
保持状态:Controller Manager
运行各种控制器,确保集群的实际状态与期望状态一致。
五、应用
Kubernetes
具有 强大的编排能力,支持复杂的应用部署和管理需求。具有高可用性, 自动化的自愈和扩展机制确保应用程序的高可用性。同时 具有高扩展性,通过控制器和自定义资源定义(CRD
)可以扩展 Kubernetes
的功能。还 具有灵活的存储和网络解决方案, 支持多种存储和网络插件。适用场景如下:
-
微服务架构:适合部署和管理微服务架构的应用程序。
-
持续集成和持续部署(
CI/CD
):支持自动化的应用程序部署和更新。 -
多租户环境:通过命名空间和资源配额实现资源隔离和管理。
-
混合云和多云环境:支持跨多个云提供商的统一管理。