Ubantu22.04系统单台主机配置k8s | 详细使用教程
一、Kubernetes 介绍
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它由 Google 设计并开源,现由云原生计算基金会(CNCF)维护,已成为容器编排领域的事实标准。Kubernetes 旨在解决大规模容器化应用程序的复杂性问题,提供高效、灵活和可靠的运行环境。
1. Kubernetes 的核心目标
-
自动化运维:自动部署、扩缩容、故障恢复。
-
资源高效利用:优化计算、存储和网络资源。
-
跨环境一致性:支持混合云、多云和本地数据中心的无缝迁移。
-
声明式配置:通过 YAML/JSON 文件定义应用状态,系统自动实现目标状态。
https://zhuanlan.zhihu.com/p/46341911
2. Kubernetes 架构
控制平面是逻辑上的管理核心,而主节点是控制平面的物理载体。
控制平面(Control Plane)的定义与功能
控制平面是逻辑概念:作为Kubernetes集群的“大脑”,负责全局管理和调度,包括资源分配、状态维护、故障恢复等核心功能。它由以下核心组件组成:
- API Server
- 作为控制平面的前端,提供REST API接口,供用户、工作节点及其他组件与集群交互。
- 处理所有资源操作(如Pod、Service、Deployment的增删改查)。
- etcd
- 分布式键值存储,保存集群所有配置和状态信息(如Pod定义、节点状态)。
- 通过Raft算法确保数据一致性和高可用性。
- Scheduler
- 负责将Pod调度到合适的工作节点,基于资源可用性、约束条件(如节点标签、亲和性规则)进行决策。
- Controller Manager
Controller Manager是Kubernetes控制平面的后台进程,内置多个控制器(Controller),每个控制器专注于一种资源类型的状态管理。其核心职责包括:
- 状态监控:持续观察集群资源(如Pod、Node、Service)的实际状态。
- 状态修复:当实际状态偏离期望值时,自动触发修复操作(如重启Pod、迁移节点)。
- 自动化编排:实现声明式API的核心逻辑,用户只需定义目标状态,Controller Manager负责实现并保持。
主节点(Master Node)的组成与角色
主节点是控制平面的物理或虚拟载体,其核心组件与控制平面完全一致:
- 控制平面组件:主节点必须运行API Server、etcd、Scheduler、Controller Manager。
- 高可用扩展:在生产环境中,主节点可能部署多个控制平面实例(如多API Server副本)以实现高可用。
- 其他辅助组件:如云控制器管理器(与云服务商集成,管理负载均衡器、存储等资源)。
控制平面与主节点的关系
- 控制平面运行在主节点上:控制平面的所有组件均部署在主节点,主节点是控制平面的物理基础。
- 主节点可能包含其他组件:例如,在高可用架构中,主节点可能部署负载均衡器或额外的etcd实例,但这些仍属于控制平面的扩展部分。
- 逻辑与物理的区分:控制平面是逻辑概念,描述管理集群的功能集合;主节点是物理或虚拟节点,承载控制平面的具体实现。
Worker是逻辑上的工作节点角色,而Worker Node(工作节点)是Worker的物理或虚拟载体。
Worker的定义与功能
逻辑角色:Worker是Kubernetes集群中的从节点(Slave),负责执行控制平面(Control Plane)的指令,运行容器化应用。
- 核心职责:
- 运行容器:提供计算资源和环境,支持容器化应用程序的运行和扩展。
- 接收指令:与控制平面通信,接收并执行调度、管理、监控等指令。
- 资源隔离:通过资源限制和隔离机制,确保应用程序之间的资源不会相互干扰。
- 弹性扩展:根据负载需求动态调整Worker节点的数量,实现集群的弹性扩展。
Worker Node的组成与角色
- 物理/虚拟载体:Worker Node是Worker的具体实现,可以是物理机、虚拟机或云实例。
- 核心组件:
- kubelet:
- 角色:节点代理,负责管理Pod的生命周期和健康状态。
- 功能:
- 注册节点到API Server,定期发送心跳信息。
- 监控Pod状态,确保Pod达到期望状态(如启动、重启、终止容器)。
- 上报节点和Pod状态信息给控制平面。
- kube-proxy:
- 角色:网络代理,负责维护节点上的网络规则。
- 功能:
- 实现Service的负载均衡,将流量转发到后端Pod。
- 动态更新网络规则,响应Service和Endpoints的变更。
- 容器运行时(如Docker、containerd):
- 角色:负责容器的实际运行。
- 功能:
- 拉取镜像、创建容器、启动和停止容器。
- 与kubelet交互,执行容器生命周期管理操作。
Worker与Worker Node的关系
- 逻辑与物理的区分:
- Worker:逻辑概念,描述从节点的角色,强调其执行控制平面指令、运行容器化应用的职责。
- Worker Node:物理或虚拟节点,承载Worker的具体实现,运行kubelet、kube-proxy和容器运行时等组件。
Worker Node的工作流程
- kubelet:
- 注册节点:启动后向API Server注册当前节点,定期发送心跳信息。
- 管理Pod生命周期:根据API Server下发的Pod配置,启动、监控、重启或终止容器。
- 监控资源使用:通过内嵌工具(如cAdvisor)收集节点和容器的资源使用情况。
- 上报状态信息:定期向API Server上报节点和Pod的状态信息。
- kube-proxy:
- 监听变更:实时监听API Server中Service和Endpoints的变更。
- 动态更新规则:根据变更信息,生成或更新iptables/ipvs规则,确保流量路由的准确性。
- 流量转发:将到达Service IP的流量转发到后端Pod,实现负载均衡。
- 容器运行时:
- 拉取镜像:根据kubelet的指令,从镜像仓库下载应用所需的镜像。
- 创建容器:基于镜像创建容器实例,并根据配置启动容器。
- 管理容器生命周期:监控容器的运行状态,执行启动、停止、删除等操作。
Worker Node的重要性
- 提供计算资源:支持容器化应用程序的运行和扩展,是集群的工作负载执行单元。
- 执行控制平面指令:确保集群状态与期望状态一致,实现自动化的管理和调度。
- 实现弹性扩展:通过增加或减少Worker Node的数量,可以根据负载需求动态调整集群的容量。
组件 | 角色 | 核心功能 |
---|---|---|
控制平面(主节点) | 管理者 | - API Server:处理集群内外的通信请求。 - etcd:存储集群配置和状态。 - Scheduler:调度Pod到工作节点。 - Controller Manager:维护集群状态和资源。 |
工作节点(从节点) | 执行者 | - kubelet:接收并执行主节点的任务(如创建Pod)。 - kube-proxy:处理网络代理和负载均衡。 - 容器运行时:实际运行容器。 |
3. Kubernetes 核心概念
容器(Container)
容器是一种轻量级、可移植的软件运行环境,能够将应用程序及其依赖打包在一起,确保在不同环境中的一致性运行。
容器是承载应用的核心单元,其设计和运行方式深度整合了 k8s 的编排能力。
k8s 不直接管理单个容器,而是将容器封装在 Pod 中。Pod 是 k8s 的最小调度单位,可包含 1 个或多个紧密协作的容器(如主容器 + 日志收集侧容器)。
同一 Pod 内的容器共享网络命名空间(IP/端口)、存储卷(Volume)和进程命名空间,便于高效通信。
容器技术(如 Docker)是 Kubernetes 的基础。
Namespace
Namespace 是 Kubernetes 中用于将集群资源划分为多个虚拟组的机制。每个 Namespace 可以包含独立的资源(如 Pod、Service、Deployment 等),实现逻辑隔离。这种隔离确保了不同团队、项目或环境的资源在命名和使用上的独立性。
- 资源隔离:Namespace 将集群资源(如 Pod、Service、Deployment 等)划分为逻辑组,实现不同团队、项目或环境的资源隔离。
- 命名唯一性:同一 Namespace 内的资源名称必须唯一,但不同 Namespace 可以使用相同的资源名称。
- 权限控制:通过 RBAC(基于角色的访问控制),可以限制用户或组对特定 Namespace 的访问权限。
机制 Namespace Cgroup 物理集群 功能 逻辑隔离(资源、权限) 资源限制(CPU、内存) 完全物理隔离 隔离级别 逻辑分组 进程级资源限制 物理硬件隔离 使用场景 多租户、多环境 容器资源限制 强隔离需求(如安全合规) 成本 低(共享集群资源) 低(共享节点资源) 高(独立硬件成本)
Namespace常用操作命令
命令 说明 kubectl create namespace
创建 Namespace kubectl get namespaces
列出所有 Namespace kubectl describe namespace
查看 Namespace 详细信息 kubectl delete namespace
删除 Namespace(谨慎操作!) kubectl config set-context --current --namespace=
切换当前 kubectl 上下文到指定 Namespace
Namespace 的完整操作命令示例
创建 Namespace
kubectl create namespace dev # 创建名为 dev 的 Namespace kubectl create namespace prod # 创建名为 prod 的 Namespace
查看 Namespace
kubectl get namespaces # 列出所有 Namespace kubectl describe namespace dev # 查看 dev Namespace 的详细信息(资源配额、标签等)
删除 Namespace
kubectl delete namespace dev # 删除 dev Namespace(谨慎操作!此操作会删除 Namespace 内所有资源)