K8s1️⃣概述
知识基础:Docker
1、应用部署方式
参考:Docker 介绍
应用程序的部署方式,主要经历 3 个时代:
-
传统
-
虚拟化
-
容器化
1.1、传统部署
将应用程序直接部署在物理机上
- 优点:简单,不需要其它技术的参与。
- 缺点:无法合理分配资源,程序耦合度高。
1.2、虚拟化部署
在物理机上运行虚拟机(VM),每个虚拟机都是独立的一个操作系统
- 优点:使应用程序在不同 VM 之间彼此隔离,提供一定程度的安全性。
- 缺点:增加了操作系统,浪费了部分资源。
1.3、容器化部署
在虚拟机中运行容器,将应用程序部署在容器中
(类似 VM,但容器可共享操作系统)
- 优点:
- 每个容器拥有独立的文件系统、CPU、内存、进程空间等。
- 容器封装了应用程序及其所需函数库、依赖、配置等资源。
- 容器化的应用程序(镜像)可迁移到任何 Linux 操作系统上运行。
- 思考:容器编排问题
- 若某个容器故障,如何让另一个容器立刻启动去替补。
- 若并发访问量变大,如何实现横向扩展容器数量。
- 常见容器编排软件
- Swarm:Docker 自带的容器编排工具。
- Mesos:Apache 的资源统一管控的工具,需与 Marathon 结合使用。
- Kubernetes:Google 开源的容器编排引擎。
- OpenShift、Rancher:基于 K8s 的再封装。
2、kubernetes
Hint:kubernetes 名称源于希腊语,意为 “舵手” 或 “飞行员”。
2.1、简介
kubernetes
,简称K8s
。
Google 于 2014 年发布的一个容器编排引擎。
- 特点:开源,基于容器技术,可移植、可扩展等。
- 作用:实现资源管理的自动化。
- 本质:一组服务器集群。集群的每个节点上运行着 K8s 所管理的容器化应用。
常用功能
- 服务发现:K8s 根据 DNS 名称或 IP 地址来暴露容器,通过自动发现的形式找到依赖的服务。
- 负载均衡:若一个服务部署了多个容器实例,K8s 可自动实现请求的负载均衡。
- 弹性伸缩:根据流量,自动调整集群中正在运行的容器数量。
- 自动部署和回滚
- 使用 K8s 描述已部署容器的所需状态,可将容器更改为期望的状态。
- 若发现新发布的程序版本有问题,可进行回滚。
- 自我修复:K8s 能自动杀死不响应的容器,能迅速修复崩溃的容器(重启、替换)。
- 资源分配
- 自动完成装箱计算:K8s 允许指定每个容器所需 CPU 和 RAM(内存),以做出更好的决策来分配资源。
- 存储编排:根据容器自身需求,自动创建存储卷。
2.2、常见术语
含义 | 说明 | |
---|---|---|
Master & Node | 控制节点和工作节点 | 稍后 2.3 详解 |
Pod | K8s 创建和管理的,可部署的最小计算单元 | 容器运行在 Pod 中,一个 Pod 中包含一组容器(1 个或多个) |
Service | 集群的核心 | 提供远程服务能力,作为 Pod 对外服务的的统一入口 |
Controller | 控制器 | 负责管理 Pod 的状态(如启停、伸缩等) |
Label | 标签 | K=V 键值对,用于对 Pod 进行分类 |
NameSpace | 命名空间 | 用于隔离 Pod 的运行环境 |
2.3、核心组件(❗)
一个 K8s 集群由一组节点构成,
每个节点上运行着 K8s 所管理的容器化应用。
-
节点分类:两类节点由不同的组件构成,稍后详解。
- Master:集群控制节点,也称控制平面(Control Plane)。
- Node:工作负载节点。
-
每个集群至少有 1 个
Master
节点、1 个Node
节点。
2.2.1、Master (Control Plane)
集群的控制平面
负责全局决策,如资源调度。
说明 | 负责工作 | |
---|---|---|
etcd | 键值数据库 | 存储集群中所有资源对象的信息(如节点) |
API server | 控制平面的前端 | 接收用户请求,提供认证、授权、API 注册和发现等机制 |
Scheduler | 调度者 | 监视新建的、未指定运行节点(node)的 Pod,为其选择合适的运行节点 |
Controller manager | 控制器管理器 | 运行控制器进程 (Controller 负责维护集群状态,如故障检测、程序部署安排、自动扩展、滚动更新等) |
Cloud Controller Manager | 云控制器管理器 | (可选)嵌入特定云的控制逻辑,仅于特定的云平台 |
2.2.2、Node
集群的数据平面
负责维护运行中的 Pod,并提供运行环境。
说明 | 负责工作 | |
---|---|---|
kubelet | 集群中每个节点的代理 | 管理由 K8s 创建的容器,确保容器运行在 Pod 中且状态健康 |
kube-proxy | 集群中每个节点的网络代理 | 维护节点的网络规则,允许外界访问 Pod |
Container Runtime | 容器运行时 | 即运行容器的软件,如 Docker |
2.2.3、Addons
常用的插件:
- DNS
- 仪表盘:Dashboard 可视化用户界面。
- 容器资源监控
- 集群层面日志
- ...
case:部署 Nginx
示例:在 K8s 中部署 Nginx 服务,以此说明 K8s 各组件调用关系。
- 假设 K8s 集群中有 1 个 Master,2 个 Node。
- 当 K8s 环境启动,所有 Master 和 Node 节点的信息都会存储到
etcd
数据库中。 - 服务关系:K8s 通过 Pod 控制器管理 Pod,Pod 中运行容器,容器中部署微服务应用。
流程说明
-
用户向 K8s 集群发起一个 Nginx 服务安装请求,master 节点的
API Server
组件接收请求。 -
API Server 调用
Scheduler
组件,目的是选取合适的 Node(运行节点) -
Scheduler
- 从
etcd
中读取所有 Node 节点的信息。 - 基于特定算法选择合适的 Node,将结果返回给 API Server。
- 从
-
API Server 调用
Controller manager
组件,目的是部署 Nginx 服务。 -
Controller manager 调度 Node 节点
-
kubelet
组件接收调度指令,控制Container Runtime
-
创建一个 Pod。
-
在 Pod 中创建并运行一个 Nginx 容器。
-
以上是 Niginx 容器的部署流程。
若要访问集群中的 Nginx 服务,需通过
kube-proxy
来产生访问 Pod 的网络代理。