01 Kubernetes 概述


Kubernetes 是什么

• Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。
• K8S用于容器化应用程序的部署,扩展和管理。
• K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。
• Kubernetes目标是让部署容器化应用简单高效。
• 官方网站: http://www.kubernetes.io
• 官方网站: https://kubernetes.io/zh/

1
2
# 概念 https://kubernetes.io/zh/docs/concepts/
# 参考 https://kubernetes.io/zh/docs/reference/
1
2
1. k8s 是一个容器平台
2. k8s 是微服务平台

Kubernetes 特性

• 自我修复
在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。

• 弹性伸缩
使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。

• 自动部署和回滚
K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。

• 服务发现和负载均衡
K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。

• 机密和配置管理
管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。

• 存储编排
挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。

• 批处理
提供一次性任务,定时任务;满足批量数据处理和分析的场景。

1
2
3
1. 负载均衡 : 用户实际访问 -> service统一入口 -> 负载容器
2. docker : 适合单机
3. k8s : 适合集群

Kubernetes 集群架构与组件

1
2
3
4
5
6
7
8
9
10
11
1. 两个角色: 
- master主控制节点:管控整个集群,调度
- node工作节点:跑任务,创建容器

2. 用户部署应用 先发送请求到 -> API Server 协调创建部署
3. API Server 发送给scheduler调度,根据资源利用率,看部署到哪个节点
4. 如果需要创建3个副本 会交给 controller-manager 控制器 去完成
5. 操作信息记录到etcd中
6. master全部完成后 会交给node工作节点,node节点创建容器 和 网络规则(怎么去访问这组容器) -> docker 创建容器
7. pod 一个或多个容器组成
8. etcd 可以部署在master 也可以独立部署

Master核心组件

API Server

  1. Kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,
  2. 所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给Etcd存储。

scheduler

  1. 根据调度算法为新创建的Pod选择一个Node节点,
  2. 可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

controller-manager

  1. 处理集群中常规后台任务,一个资源对应一个控制器,
  2. ControllerManager就是负责管理这些控制器的。

etcd

  1. 分布式键值存储系统。用于保存集群状态数据,
  2. 比如Pod、Service等对象信息。

Node核心组件

kubelet

  1. kubelet是Master在Node节点上的Agent,
  2. 管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。
  3. kubelet将每个Pod转换成一组容器。

kube-proxy

  1. 在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。

docker 或 rocket

  1. 容器引擎,运行容器,常用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

  1. 标签,在k8s中,所有的关联和筛选都是通过标签去做,每个资源都会打标签
  2. 比如 Service 如何找到这一组Pod,通过标签关联
  3. 标签,附加到某个资源上,用于关联对象、查询和筛选

Namespace

  1. 命名空间,将对象逻辑上隔离
  2. 逻辑概念, 用户可以访问某一个命名空间,看到的是指定的命名空间,针对团队项目创建不同的命名空间,管控权限

每天5分钟玩转k8s

重要概念梳理

Master

  1. Master 是 Cluster 的大脑,它的主要职责是调度,即决定将应用放在哪里运行。
  2. Master 运行 Linux 操作系统,可以是物理机或者虚拟机。为了实现高可用,可以运行多个 Master。

Node

  1. Node 的职责是运行容器应用。Node 由 Master 管理,Node 负责监控并汇报容器的状态,并根据 Master 的要求管理容器的生命周期。
  2. Node 运行在 Linux 操作系统,可以是物理机或者是虚拟机。

Pod

  1. Pod 是 Kubernetes 的最小工作单元。
  2. 每个 Pod 包含一个或多个容器。
  3. Pod 中的容器会作为一个整体被 Master 调度到一个 Node 上运行。

Pod 作用

  1. 可管理性:
    • 有些容器天生就是需要紧密联系,一起工作。Pod 提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes 以 Pod 为最小单位进行调度、扩展、共享资源、管理生命周期。
  2. 通信和资源共享:
    • Pod 中的所有容器使用同一个网络 namespace,即相同的 IP 地址和 Port 空间。它们可以直接用 localhost 通信。同样的,这些容器可以共享存储,当 Kubernetes 挂载 volume 到 Pod,本质上是将 volume 挂载到 Pod 中的每一个容器。

Pods 两种使用方式

  1. 运行单一容器:

    • one-container-per-Pod 是 Kubernetes 最常见的模型,这种情况下,只是将单个容器简单封装成 Pod。
    • 即便是只有一个容器,Kubernetes 管理的也是 Pod 而不是直接管理容器。
  1. 运行多个容器:

    • 但问题在于:哪些容器应该放到一个 Pod 中?
    • 答案是:这些容器联系必须 非常紧密,而且需要 直接共享资源。
  1. Tomcat 从 MySQL 读取数据,它们之间需要协作,但还不至于需要放到一个 Pod 中一起部署,一起启动,一起停止。同时它们是之间通过 JDBC 交换数据,并不是直接共享存储,所以放到各自的 Pod 中更合适。

Controller

  1. Kubernetes 通常不会直接创建 Pod,而是通过 Controller 来管理 Pod 的。
  2. Controller 中定义了 Pod 的部署特性,比如有几个副本,在什么样的 Node 上运行等。
  3. 为了满足不同的业务场景,Kubernetes 提供了多种 Controller,包括 Deployment、ReplicaSet、DaemonSet、StatefuleSet、Job 等。

Deployment

  1. 是最常用的 Controller。Deployment 可以管理 Pod 的多个副本,并确保 Pod 按照期望的状态运行。

ReplicaSet

  1. 实现了 Pod 的多副本管理。使用 Deployment 时会自动创建 ReplicaSet,也就是说 Deployment 是通过 ReplicaSet 来管理 Pod 的多个副本,我们通常不需要直接使用 ReplicaSet。

DaemonSet

  1. 用于每个 Node 最多只运行一个 Pod 副本的场景。正如其名称所揭示的,DaemonSet 通常用于运行 daemon。

StatefuleSet

  1. 能够保证 Pod 的每个副本在整个生命周期中名称是不变的。

  2. 而其他 Controller 不提供这个功能,当某个 Pod 发生故障需要删除并重新启动时,Pod 的名称会发生变化。

  3. 同时 StatefuleSet 会保证副本按照固定的顺序启动、更新或者删除。

Job

  1. 用于运行结束就删除的应用。而其他 Controller 中的 Pod 通常是长期持续运行。

Service

  1. Deployment 可以部署多个副本,每个 Pod 都有自己的 IP,外界如何访问这些副本呢?

  2. 通过 Pod 的 IP 吗?要知道 Pod 很可能会被频繁地销毁和重启,它们的 IP 会发生变化,用 IP 来访问不太现实。

  3. Kubernetes Service 定义了外界访问一组特定 Pod 的方式。Service 有自己的 IP 和端口,Service 为 Pod 提供了负载均衡。

  4. Kubernetes 运行容器(Pod)与访问容器(Pod)这两项任务分别由 Controller 和 Service 执行。

Namespace

  1. 如果有多个用户或项目组使用同一个 Kubernetes Cluster,如何将他们创建的 Controller、Pod 等资源分开呢?

  2. Namespace 可以将一个物理的 Cluster 逻辑上划分成多个虚拟 Cluster,每个 Cluster 就是一个 Namespace。

  3. 不同 Namespace 里的资源是完全隔离的。

  4. Kubernetes 默认创建了两个 Namespace。

    • default – 创建资源时如果不指定,将被放到这个 Namespace 中。

    • kube-system – Kubernetes 自己创建的系统资源将放到这个 Namespace 中。

    • 可以使用 kubectl get namespace 查看当前集群里所有的命名空间。

Kubernetes 架构

  1. Kubernetes Cluster 由 Master 和 Node 组成,节点上运行着若干 Kubernetes 服务。

Master 节点

  1. Master 是 Kubernetes Cluster 的大脑,运行着如下 Daemon 服务:kube-apiserver、kube-scheduler、kube-controller-manager、etcd 和 Pod 网络(例如 flannel)。

API Server(kube-apiserver)

  1. API Server 提供 HTTP/HTTPS RESTful API,即 Kubernetes API。
  2. API Server 是 Kubernetes Cluster 的前端接口,各种客户端工具(CLI 或 UI)以及 Kubernetes 其他组件可以通过它管理 Cluster 的各种资源。

Scheduler(kube-scheduler)

  1. Scheduler 负责决定将 Pod 放在哪个 Node 上运行。
  2. Scheduler 在调度时会充分考虑 Cluster 的拓扑结构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。

Controller Manager(kube-controller-manager)

  1. Controller Manager 负责管理 Cluster 各种资源,保证资源处于预期的状态。
  2. Controller Manager 由多种 controller 组成,包括 replication controller、endpoints controller、namespace controller、serviceaccounts controller 等。
  3. 不同的 controller 管理不同的资源。例如 replication controller 管理 Deployment、StatefulSet、DaemonSet 的生命周期,namespace controller 管理 Namespace 资源。

etcd

  1. etcd 负责保存 Kubernetes Cluster 的配置信息和各种资源的状态信息。
  2. 当数据发生变化时,etcd 会快速地通知 Kubernetes 相关组件。

Pod 网络

  1. Pod 要能够相互通信,Kubernetes Cluster 必须部署 Pod 网络,flannel 是其中一个可选方案。
  2. 以上是 Master 上运行的组件

Node

  1. Node 是 Pod 运行的地方,Kubernetes 支持 Docker、rkt 等容器 Runtime。
  2. Node上运行的 Kubernetes 组件有 kubelet、kube-proxy 和 Pod 网络(例如 flannel)。

kubelet

  1. kubelet 是 Node 的 agent,当 Scheduler 确定在某个 Node 上运行 Pod 后,会将 Pod 的具体配置信息(image、volume 等)发送给该节点的 kubelet,
  2. kubelet 根据这些信息创建和运行容器,并向 Master 报告运行状态。

kube-proxy

  1. service 在逻辑上代表了后端的多个 Pod,外界通过 service 访问 Pod。
  2. service 接收到的请求是如何转发到 Pod 的呢?这就是 kube-proxy 要完成的工作。
  3. 每个 Node 都会运行 kube-proxy 服务,它负责将访问 service 的 TCP/UPD 数据流转发到后端的容器。
  4. 如果有多个副本,kube-proxy 会实现负载均衡。

Pod 网络

  1. Pod 要能够相互通信,Kubernetes Cluster 必须部署 Pod 网络,flannel 是其中一个可选方案。

完整的架构图

  1. 为什么 k8s-master 上也有 kubelet 和 kube-proxy 呢?
  2. 这是因为 Master 上也可以运行应用,即 Master 同时也是一个 Node。
  3. 几乎所有的 Kubernetes 组件本身也运行在 Pod 里,执行如下命令:
  4. kubectl get pod –all-namespaces -o wide

  1. Kubernetes 的系统组件都被放到 kube-system namespace 中。
  2. 这里有一个 kube-dns 组件,它为 Cluster 提供 DNS 服务,我们后面会讨论。
  3. kube-dns是在执行 kubeadm init 时(第 ⑤ 步)作为附加组件安装的。

通过例子理解 k8s 架构