0-k8s概念与组件原理

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1、什么是k8s

kubernetes是一个可移植的可扩展的开源平台是Google开源的容器集群管理系统谷歌内部:Borg)用于管理容器化的工作负载和服务可促进声明式配置和自动化。kubernetes的开头k和结尾s中间共有8个字母ubernete俗称k8s。

2、为什么使用k8s

k8s在Docker技术的基础上为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能提高了大规模容器集群管理的便捷性。同时Kubernetes是一个完备的分布式系统支撑平台具有完备的集群管理能力多扩多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、內建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。同时Kubernetes提供完善的管理工具涵盖了包括开发、部署测试、运维监控在内的各个环节。

3、集群架构及组件

1. 集群架构

在这里插入图片描述

Master负责管理集群部署集群所需组件etcdapiservercontroller managerscheduler。master 协调集群中的所有活动例如调度应用程序、维护应用程序的所需状态、扩展应用程序和滚动更新。

Node节点是 Kubernetes 集群中的工作节点用于托管正在运行的应用程序可以是物理机或虚拟机。 每个工作节点都有一个 kubeletkube-proxy它是管理节点并与 Kubernetes Master 节点进行通信的代理。节点上还应具有处理容器操作的容器运行时例如 Docker 或 rkt。一个 Kubernetes 工作集群至少有三个节点。

3. 集群组件

  • etcd 键值存储数据库维护集群内各个节点状态的一致性保存集群的状态及配置
  • apiserver处理资源操作的请求并提供认证、授权、访问控制、API 注册和发现等机制
  • controller manager 控制器管理负责维护集群的状态如故障检测、自动扩展、滚动更新等
  • scheduler调度器负责资源的调度按照预定的调度策略将 Pod 调度到相应的节点
  • kubelet负责维护容器的生命周期 Pod 的创建、启动、监控、重启、销毁等工作处理Master节点下发到本节点的任务
  • Container runtime 负责镜像管理以及 Pod 和容器的真正运行CRI
  • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡
  • Flannel/calico网络插件 负责为整个集群提供 IP 服务
  • kube-dns/coredns 负责为整个集群提供 DNS 服务
  • Ingress Controller 为服务提供外网入口

4、集群工作流程

1. 各组件通信原理以Pod为例

在这里插入图片描述

  1. kubectl 向api server 发起一个create pod 请求
  2. api server接收到pod创建请求后不会去直接创建pod而是生成一个包含创建信息并写入到etcd
  3. scheduler 查看 k8s api 类似于通知机制。
  4. 判断pod.spec.Node == null?若为null表示这个Pod请求是新来的需要创建因此先进行调度计算找到最“闲”的node并“报告”给apiserver。
  5. 写入etcd数据库中更新分配结果pod.spec.Node = nodeA (设置一个具体的节点)
  6. 对应节点的kubelet 通过”监视“发现api server 中有了个新的Node。
  7. 通过节点上的运行时去创建Pod。
  8. kubelet将结果“报告”给 apiserver。
  9. 将结果写入etcd。
  1. 使用REST API 创建Pod即(kubectl create pod)请求apiserver。
  2. apiserver接收到pod创建请求后写入到Etcd会存在记录但不会创建。
  3. scheduluer 检测到有未绑定 Node 的 Pod查找集群中资源充足的Node绑定并将调度信息写入到Etcd。
  4. kubelet 通过监测etcd数据库检测到有绑定该节点的Pod调度过来需要创建调用container runtime 运行该 Pod。
  5. kubelet 通过 container runtime 取到 Pod 状态并更新到 apiserver 中。

5、基本概念

Kubernetes中的绝大部分概念都会被抽象成Kubernetes管理的一种资源对象下图为k8s资源对象全景图

在这里插入图片描述

1. 相关名词

namespace

Namespace 命名空间是对一组资源和对象的抽象集合 是 Linux 内核用来隔离内核资源的方式。NameSpace做隔离Cgroups 做限制rootfs 做文件系统。

Label

Label 标签以 key/value 的方式附加到资源对象上如Pod 其他对象可以使用 Label Selector 来选择一组相同 label 的对象。

2. 编排对象

Pod

Pod是 Kubernetes 项目中最小的 API 资源对象Pod可以由一个或多个业务容器和一个根容器(Pause容器)组成。一个Pod表示某个应用的一个实例。Kubernetes 项目的调度器是统一按照 Pod 而非容器的资源需求进行计算的凡是调度、网络、存储以及安全相关的属性基本上是 Pod 级别的。

可以这样理解云计算系统的操作系统是 k8s 容器就相当于是其进程而 Pod 则是进程组容器镜像就是这个系统里的“.exe”安装包。Pod 里的所有容器它们共享PID、IPC、Network和UTS namespace可以声明共享同一个 Volume。

ReplicaSet

ReplicaSet是Pod副本的抽象用于解决Pod的扩容和伸缩。

Deployment

Deployment通常用来部署无状态应用如Web服务 该服务运行的实例不会在本地存储需要持久化的数据并且多个实例对于同一个请求响应的结果是完全一致的。在内部使用ReplicaSet来实现Pod副本的创建。Deployment确保指定数量的Pod“副本”在运行并且支持回滚和滚动升级。创建Deployment时需要指定 Pod模板和Label标签。

StatefulSet

StatefulSet通常用来部署有状态应用如Mysql服务服务运行的实例需要在本地存储持久化数据多个实例之间有依赖拓扑关系比如主从关系、主备关系。如果停止掉依赖中的一个Pod就会导致数据丢失或者集群崩溃。他的核心功能就是通过某种方式记录这些状态然后在 Pod 被重新创建时能够为新 Pod 恢复这些状态。它包含Deployment控制器ReplicaSet的所有功能增加可以处理Pod的启动顺序为保留每个Pod的状态设置唯一标识同时具有以下功能

  • 稳定的、唯一的网络标识符
  • 稳定的、持久化的存储
  • 有序的、优雅的部署和缩放

DaemonSet

DaemonSet服务守护进程它的主要作用是在Kubernetes集群的所有节点中运行我们部署的守护进程相当于在集群节点上分别部署Pod副本如果有新节点加入集群Daemonset会自动的在该节点上运行我们需要部署的Pod副本相反如果有节点退出集群Daemonset也会移除掉部署在旧节点的Pod副本。

DaemonSet的主要特征

  • 这个 Pod 运行在 Kubernetes 集群里的每一个节点Node上
  • 每个节点上只会运行一个这样的 Pod 实例
  • 如果新的节点加入 Kubernetes 集群后该 Pod 会自动地在新节点上被创建出来
  • 而当旧节点被删除后它上面的 Pod 也相应地会被回收掉。

DaemonSet常用场景

  • 网络插件的 Agent 组件如FlannelCalico需要运行在每一个节点上用来处理这个节点上的容器网络
  • 存储插件的 Agent 组件如CephGlusterfs需要运行在每一个节点上用来在这个节点上挂载F远程存储目录
  • 监控系统的数据收集组件如Prometheus Node ExporterCadvisor需要运行在每一个节点上负责这个节点上的监控信息搜集。
  • 日志系统的数据收集组件如FluentLogstash需要运行在每一个节点上负责这个节点上的日志信息搜集。

Job/CronJob

  • Job负责处理任务即仅执行一次的任务它保证批处理任务的一个或多个Pod成功结束解决一些需要进行批量数据处理和分析的需求比如Jenkins Slave发布完代码后任务结束Pod自动销毁
  • CronJob则就是在Job上加上了时间调度用来执行一些周期性的任务。

HPA

Horizontal Pod AutoscalingPod水平自动伸缩简称HPA。通过监控分析RC或者Deployment控制的所有Pod的负载变化情况来确定是否需要调整Pod的副本数量这是HPA最基本的原理。

3. 其他对象

ConfigMap

ConfigMap就是为了让镜像和配置文件解耦以便实现镜像的可移植性和可复用性因为一个configMap其实就是一系列配置信息的集合将来可直接注入到Pod中的容器使用而注入方式有两种一种将configMap做为存储卷一种是将configMap通过env中configMapKeyRef注入到容器中

Secret

Secret用来保存敏感信息例如密码、OAuth 令牌和 ssh key等等将这些信息放在Secret中比放在Pod的定义中或者docker镜像中来说更加安全和灵活。

RBAC

RBAC基于角色的访问控制可以用来给用户授予对集群操作不同的权限。

4. 服务发现

Service

Service是一种抽象的对象它定义了一组Pod的逻辑集合和一个用于访问它们的策略我们可以通过访问Service来访问到后端的Pod服务其实这个概念和微服务非常类似。一个Serivce下面包含的Pod集合一般是由Label Selector来决定的。

Ingress

Ingress就是从 kuberenets 集群外部访问集群的一个入口将外部的请求转发到集群内不同的 Service 上其实就相当于 nginx、haproxy 等负载均衡代理服务器目前选择有很多 traefik、nginx-controller、Kubernetes Ingress Controller for Kong、HAProxy Ingress controller。

5. 存储对象

PV/PVC

  • PV 的全称是PersistentVolume持久化卷是对底层的共享存储的一种抽象PV 由管理员进行创建和配置它和具体的底层的共享存储技术的实现方式有关比如 Ceph、GlusterFS、NFS 等都是通过插件机制完成与共享存储的对接。
  • PVC 的全称是PersistentVolumeClaim持久化卷声明PVC 是用户存储的一种声明PVC 和 Pod 比较类似Pod 消耗的是节点PVC 消耗的是 PV 资源Pod 可以请求 CPU 和内存而 PVC 可以请求特定的存储空间和访问模式。对于真正使用存储的用户不需要关心底层的存储实现细节只需要直接使用 PVC 即可。

StorageClass

StorageClass动态 PV可以自动帮我们创建 PV不再需要手动创建PV。

6. 其他概念

Helm

Helm包管理工具相当于kubernetes环境下的yum包管理工具。

CRD

CRD是对 Kubernetes API 的扩展Kubernetes 中的每个资源都是一个 API 对象的集合例如我们在YAML文件里定义的那些spec都是对 Kubernetes 中的资源对象的定义所有的自定义资源可以跟 Kubernetes 中内建的资源一样使用 kubectl 操作。

Operator

Operator是由CoreOS公司开发的用来扩展 Kubernetes API特定的应用程序控制器它用来创建、配置和管理复杂的有状态应用如数据库、缓存和监控系统。Operator基于 Kubernetes 的资源和控制器概念之上构建但同时又包含了应用程序特定的一些专业知识比如创建一个数据库的Operator则必须对创建的数据库的各种运维方式非常了解创建Operator的关键是CRD自定义资源的设计。Operator是将运维人员对软件操作的知识给代码化同时利用 Kubernetes 强大的抽象来管理大规模的软件应用。
rnetes 的资源和控制器概念之上构建但同时又包含了应用程序特定的一些专业知识比如创建一个数据库的Operator则必须对创建的数据库的各种运维方式非常了解创建Operator的关键是CRD自定义资源的设计。Operator是将运维人员对软件操作的知识给代码化同时利用 Kubernetes 强大的抽象来管理大规模的软件应用。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: k8s