微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Kubernetes学习(二)你不得不了解的K8s核心组件

这里是weihubeats,觉得文章不错可以关注公众号小奏技术文章首发。拒绝营销号,拒绝标题

Master

Kubernetes里的Master指的是集群控制节点,简单理解为一台机器。在每个Kubernetes集群里都需要有一个Master来负责整个集群的管理和控制,基本上Kubernetes的所有控制命令都发给它,他负责具体的执行过程。相当于整个Kubernetes集群的大脑,非常重要,所以一般我们部署Master节点都是独立的一台服务器(高可用最少三台)
Master节点上有如下核心进程

  • Kubernetes API Server(kube-apiserver): 提供了HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程
  • Kubernetes Controller Manager(kube-controller-manager): Kubernetes里所有资源对象的自动化控制中心,可以将其理解为资源对象的“大总管”
  • Kubernetes Scheduler(kube-scheduler): 负责资源调度(Pod调度)的进程,相当于公交公司的“调度室”,负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。
  • etcd: 所有资源对象的数据都被保存在etcd中,etcd是一款kv内存数据库,简单理解和redis有些类似,但又有所不同

在这里插入图片描述


本质上Master也是一个Node

Node

Kubernetes中除了Master,其他机器就被称为Node.Node可以是物理机,也可以是虚拟机。每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上。
Node上的核心进程:

  • kubelet: 负责Pod对应的容器的创建、启停等任务,同时与Master密切协作,实现集群管理的基本功能
  • kube-proxy: 实现Kubernetes Service的通信与负载均衡机制的重要组件.集群内部或外部的网络通信都是由kube-proxy维护的
  • Container Runtime: 容器运行环境,比如我们常见的Docker,当然也有其他容器运行环境: containerd、 CRI-O 以及 Kubernetes CRI (容器运行环境接口) 的其他任何实现

在这里插入图片描述

Pod

PodKubernetes最重要的基本概念,Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。我们可以理解pod就是一个容器,也可以理解为一个pod就是相当于一台独立主机,里面可以装多个容器,容器内部网络通信都是通过localhost来访问.
Pod是运行在Node上面的,每个Pod中都一个特殊的根容器(Pause),Pause的镜像属于Kubernetes平台的一部分.
Pause一个Pod里面的容器共享网络,共享存储

在这里插入图片描述

Pod分类

Kubernetes中的Pod有两种类型

  • 普通的Pod: 创建完就会存放在etcd中,然后由Kubernetes Master调度到某个具体的Node上并进行绑定(Binding),然后该Pod就会被Node上的kubelet进厂进行实例化将Pod上相关的Docker容器启动并运行。如果Pod的某个容器停止(挂掉),Kubernetes自动检测到这个问题并且重新启动这个Pod(重启Pod里的所有容器),如果Pod所在的Node宕机,就会将这个Node上的所有Pod重新调度到其他节点上
  • 静态Pod(Static Pod): Static Pod并没有被存放在etcd中,而是被放在某个具体的Node上的一个具体文件中,且只在这个Node上启动、运行

Label

label就是标签标签的作用显而易见就是为了筛选区分,标签一个Key,Value键值对。标签可以附加到各种资源对象上比如:

  1. Nodo
  2. Pod
  3. Service
  4. RC(Replication Controller)

Replication Controller

RC是Kubernetes系统中的核心概念之一。简单来说就是定义了某个Pod的期望副本数。
最简单的比如我们一个Pod部署了一个Spring Boot应用,我们希望部署三个节点,所以我们期望的副本数量就是3,在我们定义完成后。Master上的Controller Manager组件收到了我们的期望通知,会去定期巡检系统中当前存活的目标Pod,并确保目标Pod实例的数量刚好等于此RC的期望值,如果有过多的Pod副本在运行,系统就会停掉一些Pod,否则系统会再自动创建一些Pod。通过RC我们可以很方便的实现自动故障恢复,动态扩容

这里总结下RC的作用

  1. 创建Pod并自动控制Pod的数量
  2. 调整Pod中的镜像版本,实现版本回退,滚动更新
  3. RC通过Label Selector实现对Pod副本的自动控制

不过Replication Controller后续由Replica SetDeployment代替RC的作用

Replica Set

Replica Set 官方解释是下一代RC(Replication Controller)
不过目前Replica Set与RC唯一的区别就是
replicaset 可以使用标签选择器进行单选复合选择
而 ReplicationController只支持单选操作
简单解释就是一个Pod有两个标签

  1. app = web
  2. label = dev

Replication Controller只能选择app = web标签的pod,而Replica Set则可以选择包含app = weblabel = dev这个两个标签的pod

Deployment

DeploymentKubernetes在1.2版本中引入的新概念,用于更好地解决Pod的编排问题.Deployment在内部使用了Replica Set来实现目的。总的来说关系如下

在这里插入图片描述


我们这里可以看一个简单的Deployment定义

apiVersion: apps/v1
kind: Deployment
Metadata:
  name: Nginx-deployment
  labels:
    app: Nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: Nginx
  template:
    Metadata:
      labels:
        app: Nginx
    spec:
      containers:
      - name: Nginx
        image: Nginx:1.14.2
        ports:
        - containerPort: 80

在改实例中定义如下

  1. 创建名为 Nginx-deployment(由 .Metadata.name 字段标明)的 Deployment
  2. 该 Deployment 创建三个(由 replicas 字段标明)Pod 副本
  3. selector 字段定义 Deployment 如何查找要管理的 Pods。 在这里,你选择在 Pod 模板中定义的标签(app: Nginx)。 不过,更复杂的选择规则是也可能的,只要 Pod 模板本身满足所给规则即可

StatefulSet

在Kubernetes系统中,Pod的管理对象RCDeploymentDaemonSet和Job都面向无状态的服务。但现实中有很多服务是有状态的,特别是一些复杂的中间件集群,例如MysqL集群、MongoDB集群、Reids集群、ZooKeeper集群等,这些应用集群有4个共同点

  1. 每个节点都有固定的身份ID,通过这个ID,集群中的成员可以相互发现并通信
  2. 集群的规模是比较固定的,集群规模不能随意变动
  3. 集群中的每个节点都是有状态的,通常会持久化数据到永久存储中
  4. 如果磁盘损坏,则集群里的某个节点无法正常运行,集群功能受损

如果通过RC或者Deployment控制的Pod的名称和IP都是随机变换的,无法实现上面的部署
为此Kubernetes在1.4版本引入了StatefulSet,StatefulSet可以看成特殊的Deployment/RC
它有如下特性:

  1. StatefulSet里的每个Pod都有稳定、唯一的网络标识,可以用来发现集群内的其他成员
  2. StatefulSet控制的Pod副本的启停顺序是受控的,操作第n个Pod时,前n-1个Pod已经是运行且准备好的状态
  3. StatefulSet里的Pod采用稳定的持久化存储卷,通过PVPVC来实现,删除Pod时认不会删除StatefulSet相关的存储卷(为了保证数据的安全)

在这里插入图片描述

Service

Service和微服务中的服务差不多类似。
我们在部署多节点的时候,会部署多个Pod,每个Pod都会有独立的IP地址,也提供一个独立的Endpoint(Pod IP+ContainerPort)以被客户端访问。并且Pod的每次重新部署IP都会变换,那么一个多Pod的集群要如何提供服务负载均衡,选用哪个Pod去服务呢?正常我们会有一个负载均衡器去处理这个事情。
Service就是干这个的,Service的访问地址一旦确认就不会再变

在这里插入图片描述

Job

Job可以理解为定时任务,和我们常用的xxl-job类似
Job和RC、Deployment、replicaset、DaemonSet类似,也是控制Pod容器的
Job的特点

  1. 控制的Pod是短暂的,每个Docker容器仅运行一次
  2. Job所控制的Pod运行完成,Job结束
  3. 可通过CronJob设置反复定时执行的定时任务

Volume

  • Volume: 存储卷,能被Pod中多个容器共享访问的共享目录
    特点:
  1. Volume定义在Pod上的,而不是某个容器
  2. Volume生命周期与Pod相关,与当个容器无关

Persistent Volume

Volume是定义在Pod上的,而Persistent Volume是独立于Pod之外的定义。Persistent Volume 只是网络存储,不属于任何Node,但可以再任何Node上访问

Namespace

  • Namespace: 命名空间
    Namespace主要用于多租户之间的资源隔离,类似多个集群。

ConfigMap

Kubernetes中的配置中心,主要用于配置文件参数在运行期的设置修改。ConfigMap提供一个Key、Value的方式配置,存储在Etcd中

参考

原文地址:https://www.jb51.cc/wenti/3283966.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐