K8S 是由 Google 公司 用go 语言开发的。google 在全球有相当多的服务器,当然需要一个管理软件。Google内部本身就有一个叫 borg 的系统云平台管理工具,已经使用了十几年。后来参照 borg 系统架构开发了 k8s,主要用它来编排、管理容器,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。

1.K8S 集群

Kubernetes 集群架构以及相关的核心组件如下图所示:一个 Kubernetes 集群一般包含一个 Master 节点和多个 Node 节点,一个节点可以看成是一台物理机或虚拟机。
在这里插入图片描述

2.Master 节点

集群的"大脑",Kubernetes里的Master指的是集群控制节点,负责整个集群的管理和控制,基本上接收Kubernetes的所有控制命令,master负责具体的执行过程。master相当于Kubernetes集群的大脑,非常重要(高可用部署建议用3台服务器)。一旦master宕机或者不可用,那么对集群内容器应用的管理都将失效。

在这里插入图片描述

  • api server:相当于 k8s 的网关,所有的指令请求都必须经过 api server
  • scheduler:调度器,使用调度算法,把请求资源调度到某个 node 节点
  • controller:控制器,维护 k8s 资源对象(CRUD:添加、删除、更新、修改)
  • etcd:存储资源对象(可以服务注册、发现等等)

3.Node 节点

具体"干活"的,工作负载节点,在Kubernetes集群中除了master节点外的机器被称为Node。每个Node都会被Master分配一些工作负载(Docker容器),当某个Node宕机时,其上的工作负载会被Master自动转移到其他Node节点上。

在这里插入图片描述

  • kubelet:是 master 在 node 节点上的 agent(代理),管理本机运行容器的生命周期,负责 pod 对应的容器的创建、启停等任务,实现集群管理的基本功能
  • kube-proxy:在 node 节点上实现 pod 网络代理,实现 service 的通信,维护网络规则和四层负载均衡工作
  • docker:容器引擎,运行容器的基础环境
  • fluentd:日志收集服务
  • pod:k8s 管理的基本单元(最小单元),pod 内部是容器。k8s 不直接管理容器,而是管理 pod

PS:master scheduler 把请求交给api ,然后 api sever 再把信息指令数据存储在 etcd 里,于是 kuberlet 会扫描 etcd 并获取指令请求,然后去执行.

4.核心概念

1)Pod

Pod 是 K8S 中最重要也是最基本的概念,Pod 是最小的部署单元,是一组容器的集合。每个 Pod 都由一个特殊的根容器 Pause 容器,以及一个或多个紧密相关的用户业务容器组成。

Pause 容器作为 Pod 的根容器,以它的状态代表整个容器组的状态。K8S 为每个 Pod 都分配了唯一的 IP 地址,称之为 Pod IP。Pod 里的多个业务容器共享 Pause 容器的IP,共享 Pause 容器挂载的 Volume。

声明一个Pod,就是写yml文件。一个Pod的yml样例,可能长得像下面这样。

apiVersion: v1           #本版号
kind: Service            #创建的资源类型
metadata:                #元数据必选
  namespace: bcmall      #绑定命名空间
  name: bcmall-srv       #Service资源名称
spec:                    #定义详细信息
  type: NodePort         #类型
  selector:              #标签选择器
    app: container-bcmall-pod 
  ports:                 #定义端口
    - port: 8080         #port 指定server端口,此端口用于集群内部访问
      targetPort: 80     #绑定pod端口
      nodePort: 14000    #将server 端口映射到Node节点的端口,用于外网访问
      protocol: TCP      #端口协议

然后通过kubctl让yml文件生效

kubectl create -f ./bcmall.yaml

PS:Pod拥有一个唯一的IP地址,在包含多个容器的时候,依然是拥有一个IP地址,它是怎么办到的呢?k8s在使用多个容器的时候,通过共享namespace,这样Pod里的容器就可以通过localhost通信了,就像两个进程一样。同理的,Pod 可以挂载多个共享的存储卷(Volume),这时内部的各个容器就可以访问共享的 Volume 进行数据的读写。

2)Label

标签,附加到某个资源上,用于关联对象、查询和筛选。一个 Label 是一个 key=value 的键值对,key 与 value 由用户自己指定。Label 可以附加到各种资源上,一个资源对象可以定义任意数量的 Label,同一个 Label 也可以被添加到任意数量的资源上。

我们可以通过给指定的资源对象捆绑一个或多个不同的 Label 来实现多维度的资源分组管理功能,以便于灵活、方便地进行资源分配、调度、配置、部署等工作。

K8S 通过 Label Selector(标签选择器)来查询和筛选拥有某些 Label 的资源对象。Label Selector 有基于等式( name=label1 )和基于集合( name in (label1, label2) )的两种方式。

3)ReplicaSet(RC)

ReplicaSet 用来确保预期的 Pod 副本数量,如果有过多的 Pod 副本在运行,系统就会停掉一些 Pod,否则系统就会再自动创建一些 Pod。

我们很少单独使用 ReplicaSet,它主要被 Deployment 这个更高层的资源对象使用,从而形成一整套 Pod 创建、删除、更新的编排机制。

4)Deployment

Deployment 用于部署无状态应用,Deployment 为 Pod 和 ReplicaSet 提供声明式更新,只需要在 Deployment 描述想要的目标状态,Deployment 就会将 Pod 和 ReplicaSet 的实际状态改变到目标状态。

5)Horizontal Pod Autoscaler(HPA)

HPA 为 Pod 横向自动扩容,也是 K8S 的一种资源对象。HPA 通过追踪分析 RC 的所有目标 Pod 的负载变化情况,来确定是否需要针对性调整目标 Pod 的副本数量。

6)Service

Service 定义了一个服务的访问入口,通过 Label Selector 与 Pod 副本集群之间“无缝对接”,定义了一组 Pod 的访问策略,防止 Pod 失联。

创建 Service 时,K8S会自动为它分配一个全局唯一的虚拟 IP 地址,即 Cluster IP。服务发现就是通过 Service 的 Name 和 Service 的 ClusterIP 地址做一个 DNS 域名映射来解决的。

7)Namespace

命名空间,Namespace 多用于实现多租户的资源隔离。Namespace 通过将集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组的不同项目、小组或用户组。

K8S 集群在启动后,会创建一个名为 default 的 Namespace,如果不特别指明 Namespace,创建的 Pod、RC、Service 都将被创建到 default 下。

当我们给每个租户创建一个 Namespace 来实现多租户的资源隔离时,还可以结合 K8S 的资源配额管理,限定不同租户能占用的资源,例如 CPU 使用量、内存使用量等。

PS:其实K8S的很多概念本质上都是在Pod之上,包了一层又一层,以实现高可用高扩展的目的,但同时,层次越高,功能越抽象,依赖的配置也越多。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐