Kubernetes 是什么
• Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
• K8S用于容器化应用程序的部署,扩展和管理。
• K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
• Kubernetes目标是让部署容器化应用简单高效。
• 官方网站: http://www.kubernetes.io
• 官方网站: https://kubernetes.io/zh/
1 | # 概念 https://kubernetes.io/zh/docs/concepts/ |
1 | 1. k8s 是一个容器平台 |
Kubernetes 特性
• 自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。
• 弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。
• 自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。
• 服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。
• 机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。
• 存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。
• 批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景。
1 | 1. 负载均衡 : 用户实际访问 -> service统一入口 -> 负载容器 |
Kubernetes 集群架构与组件
1 | 1. 两个角色: |
Master核心组件
API Server
- Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,
- 所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。
scheduler
- 根据调度算法为新创建的Pod选择一个Node节点,
- 可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
controller-manager
- 处理集群中常规后台任务,一个资源对应一个控制器,
- ControllerManager就是负责管理这些控制器的。
etcd
- 分布式键值存储系统。用于保存集群状态数据,
- 比如Pod、Service等对象信息。
Node核心组件
kubelet
- kubelet是Master在Node节点上的Agent,
- 管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。
- kubelet将每个Pod转换成一组容器。
kube-proxy
- 在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
docker 或 rocket
- 容器引擎,运行容器,常用docker。
Kubernetes 核心概念
Pod
• 最小部署单元
• 一组容器的集合,里面可能是1个、3个、多个
• 一个Pod中的容器共享网络命名空间,也可以挂载数据卷让数据共享
• Pod是短暂的,服务更新或者重新发布就会销毁
Controllers
• 针对不同的应用场景,分为不同的控制器
• ReplicaSet : 确保预期的Pod副本数量,创建pod 有几个副本 如果少一个会帮我们启动,多了会删除,不会直接接触
• Deployment : 无状态应用部署,一般使用该控制器,实际上就是 ReplicaSet
• StatefulSet : 有状态应用部署,无状态N1节点的pod 偏移到n2节点,还能继续使用,有状态就有很多限制,偏移过去后无法继续使用,比如有存储,或者网络ID唯一,zookeeper集群,mysql主从,有状态需要考虑存储和网络ID。
• DaemonSet : 确保所有Node运行同一个Pod 适合每个node节点上都运行一个应用 监控agent
• Job : 一次性任务 就执行一次 比如备份或者离线任务
• Cronjob : 定时任务,类似crontab 定时周期去执行 比如数据备份
• Controllers是更高级层次对象,用于部署和管理Pod
Service
• 防止Pod失联
• 定义一组Pod的访问策略
• 找到一组pod,负载均衡
部署应用必须掌握
1 | 1. Controllers 部署应用 -> 创建一组Pod -> Service暴露应用,让外部访问 |
Label
- 标签,在k8s中,所有的关联和筛选都是通过标签去做,每个资源都会打标签
- 比如 Service 如何找到这一组Pod,通过标签关联
- 标签,附加到某个资源上,用于关联对象、查询和筛选
Namespace
- 命名空间,将对象逻辑上隔离
- 逻辑概念, 用户可以访问某一个命名空间,看到的是指定的命名空间,针对团队项目创建不同的命名空间,管控权限
每天5分钟玩转k8s
重要概念梳理
Master
- Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行。
- Master 运行 Linux 操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个 Master。
Node
- Node 的职责是运行容器应用。Node 由 Master 管理,Node 负责监控并汇报容器的状态,并根据 Master 的要求管理容器的生命周期。
- Node 运行在 Linux 操作系统,可以是物理机或者是虚拟机。
Pod
- Pod 是 Kubernetes 的最小工作单元。
- 每个 Pod 包含一个或多个容器。
- Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行。
Pod 作用
- 可管理性:
- 有些容器天生就是需要紧密联系,一起工作。Pod 提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes 以 Pod 为最小单位进行调度、扩展、共享资源、管理生命周期。
- 通信和资源共享:
- Pod 中的所有容器使用同一个网络 namespace,即相同的 IP 地址和 Port 空间。它们可以直接用 localhost 通信。同样的,这些容器可以共享存储,当 Kubernetes 挂载 volume 到 Pod,本质上是将 volume 挂载到 Pod 中的每一个容器。
Pods 两种使用方式
运行单一容器:
- one-container-per-Pod 是 Kubernetes 最常见的模型,这种情况下,只是将单个容器简单封装成 Pod。
- 即便是只有一个容器,Kubernetes 管理的也是 Pod 而不是直接管理容器。
运行多个容器:
- 但问题在于:哪些容器应该放到一个 Pod 中?
- 答案是:这些容器联系必须 非常紧密,而且需要 直接共享资源。
- Tomcat 从 MySQL 读取数据,它们之间需要协作,但还不至于需要放到一个 Pod 中一起部署,一起启动,一起停止。同时它们是之间通过 JDBC 交换数据,并不是直接共享存储,所以放到各自的 Pod 中更合适。
Controller
- Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 的。
- Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。
- 为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。
Deployment
- 是最常用的 Controller。Deployment 可以管理 Pod 的多个副本,并确保 Pod 按照期望的状态运行。
ReplicaSet
- 实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet。
DaemonSet
- 用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon。
StatefuleSet
能够保证 Pod 的每个副本在整个生命周期中名称是不变的。
而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。
同时 StatefuleSet 会保证副本按照固定的顺序启动、更新或者删除。
Job
- 用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。
Service
Deployment 可以部署多个副本,每个 Pod 都有自己的 IP,外界如何访问这些副本呢?
通过 Pod 的 IP 吗?要知道 Pod 很可能会被频繁地销毁和重启,它们的 IP 会发生变化,用 IP 来访问不太现实。
Kubernetes Service 定义了外界访问一组特定 Pod 的方式。Service 有自己的 IP 和端口,Service 为 Pod 提供了负载均衡。
Kubernetes 运行容器(Pod)与访问容器(Pod)这两项任务分别由 Controller 和 Service 执行。
Namespace
如果有多个用户或项目组使用同一个 Kubernetes Cluster,如何将他们创建的 Controller、Pod 等资源分开呢?
Namespace 可以将一个物理的 Cluster 逻辑上划分成多个虚拟 Cluster,每个 Cluster 就是一个 Namespace。
不同 Namespace 里的资源是完全隔离的。
Kubernetes 默认创建了两个 Namespace。
default – 创建资源时如果不指定,将被放到这个 Namespace 中。
kube-system – Kubernetes 自己创建的系统资源将放到这个 Namespace 中。
可以使用 kubectl get namespace 查看当前集群里所有的命名空间。
Kubernetes 架构
- Kubernetes Cluster 由 Master 和 Node 组成,节点上运行着若干 Kubernetes 服务。
Master 节点
- Master 是 Kubernetes Cluster 的大脑,运行着如下 Daemon 服务:kube-apiserver、kube-scheduler、kube-controller-manager、etcd 和 Pod 网络(例如 flannel)。
API Server(kube-apiserver)
- API Server 提供 HTTP/HTTPS RESTful API,即 Kubernetes API。
- API Server 是 Kubernetes Cluster 的前端接口,各种客户端工具(CLI 或 UI)以及 Kubernetes 其他组件可以通过它管理 Cluster 的各种资源。
Scheduler(kube-scheduler)
- Scheduler 负责决定将 Pod 放在哪个 Node 上运行。
- Scheduler 在调度时会充分考虑 Cluster 的拓扑结构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。
Controller Manager(kube-controller-manager)
- Controller Manager 负责管理 Cluster 各种资源,保证资源处于预期的状态。
- Controller Manager 由多种 controller 组成,包括 replication controller、endpoints controller、namespace controller、serviceaccounts controller 等。
- 不同的 controller 管理不同的资源。例如 replication controller 管理 Deployment、StatefulSet、DaemonSet 的生命周期,namespace controller 管理 Namespace 资源。
etcd
- etcd 负责保存 Kubernetes Cluster 的配置信息和各种资源的状态信息。
- 当数据发生变化时,etcd 会快速地通知 Kubernetes 相关组件。
Pod 网络
- Pod 要能够相互通信,Kubernetes Cluster 必须部署 Pod 网络,flannel 是其中一个可选方案。
- 以上是 Master 上运行的组件
Node
- Node 是 Pod 运行的地方,Kubernetes 支持 Docker、rkt 等容器 Runtime。
- Node上运行的 Kubernetes 组件有 kubelet、kube-proxy 和 Pod 网络(例如 flannel)。
kubelet
- kubelet 是 Node 的 agent,当 Scheduler 确定在某个 Node 上运行 Pod 后,会将 Pod 的具体配置信息(image、volume 等)发送给该节点的 kubelet,
- kubelet 根据这些信息创建和运行容器,并向 Master 报告运行状态。
kube-proxy
- service 在逻辑上代表了后端的多个 Pod,外界通过 service 访问 Pod。
- service 接收到的请求是如何转发到 Pod 的呢?这就是 kube-proxy 要完成的工作。
- 每个 Node 都会运行 kube-proxy 服务,它负责将访问 service 的 TCP/UPD 数据流转发到后端的容器。
- 如果有多个副本,kube-proxy 会实现负载均衡。
Pod 网络
- Pod 要能够相互通信,Kubernetes Cluster 必须部署 Pod 网络,flannel 是其中一个可选方案。
完整的架构图
- 为什么 k8s-master 上也有 kubelet 和 kube-proxy 呢?
- 这是因为 Master 上也可以运行应用,即 Master 同时也是一个 Node。
- 几乎所有的 Kubernetes 组件本身也运行在 Pod 里,执行如下命令:
- kubectl get pod –all-namespaces -o wide
- Kubernetes 的系统组件都被放到 kube-system namespace 中。
- 这里有一个 kube-dns 组件,它为 Cluster 提供 DNS 服务,我们后面会讨论。
- kube-dns是在执行 kubeadm init 时(第 ⑤ 步)作为附加组件安装的。