k8s 的介绍

k8s 的介绍
容器化相对于传统虚拟化优势
选择docker容器部署要使用k8s的原因
k8s Master节点和Node节点各个节点组件间的关系
​Master节点组件介绍
Node节点组件介绍
k8s 核心概念
    1. Deployment :
    2. Service:
    3. Namespace:
    4. Label:
    5. Label选择器:
    6. Annotation:
    7. Ingress:


容器化相对于传统虚拟化优势

如果要选择Kubernetes ,首先就需要知道为什么会选择容器化。

    传统方式是将所有应用直接部署在同一个物理机器节点上,这样每个App的依赖都是完全相同的,无法做到App之间隔离,当然,为了隔离,我们也可以通过创建虚拟机的方式来将App部署到其中,但这样太过繁重,移植性太差,故比虚拟机更轻便的Docker技术出现,现在我们通过部署Container容器的技术来部署应用,全部Container运行在容器引擎上即可。
    既然嫌弃虚拟机繁重,移植性太差,想用Docker,那好,你用吧,怎么用呢?手动一个一个创建?当然不,故ks8技术便出现了,以Kubernetes 为代表的容器集群管理系统,这时候就该上场表演了。

选择docker容器部署要使用k8s的原因

k8s 全称Kubernetes(以下简称k8s,k和s之间有8个字母),是Google 开源的容器管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

k8s作为容器编排调度引擎 ,能够相比没有这个一个平台有如下好处:

(1) 简化应用部署
(2)提高硬件资源利用率
(3)健康检查和自修复
(4)自动扩容缩容
(5)服务发现和负载均衡

Kubernetes Master节点和Node节点各个节点组件间的关系

 

Master节点组件介绍

Kubernetes 中Master指的是集群控制节点,每个Kubernetes 集群中有一个master节点负载整个集群的管理和和控制,基本Kubernetes 的所有控制命令都发给它,它负责具体执行过程,我们命令都是在master节点上运行的。

**api server:**负责对外提供restful的Kubernetes API服务,提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制。我们操作kubectl 和其他Master组件都通过调用api server提供的rest接口实现各自的功能,如controller就是通过api server来实时监控各个资源的状态的。

**etcd:**是 Kubernetes 提供的一个高可用的键值数据库,用于保存集群所有的网络配置和资源对象的状态信息,也就是保存了整个集群的状态。数据变更都是通过api server进行的。整个kubernetes系统中一共有两个服务需要用到etcd用来协同和存储配置,分别是:
1)网络插件flannel,其它网络插件也需要用到etcd存储网络的配置信息;
2)kubernetes本身,包括各种资源对象的状态和元信息配置。

**scheduler:**监听新建pod副本信息,并通过调度算法为该pod选择一个最合适的Node节点。会检索到所有符合该pod要求的Node节点,执行pod调度逻辑。调度成功之后,会将pod信息绑定到目标节点上,同时将信息写入到etcd中。一旦绑定,就由Node上的kubelet接手pod的接下来的生命周期管理。Kubernetes目前提供了调度算法,但是同样也保留了接口,用户可以根据自己的需求定义自己的调度算法。

**controller manager:**负责维护集群的状态,比如故障检测、自动扩展、滚动更新等。每个资源一般都对应有一个控制器,这些controller通过api server实时监控各个资源的状态,controller manager就是负责管理这些控制器的。当有资源因为故障导致状态变化,controller就会尝试将系统由“现有状态”恢复到“期待状态”,保证其下每一个controller所对应的资源始终处于期望状态。比如我们通过api server创建一个pod,当这个pod创建成功后,api server的任务就算完成了。其中一个pod出现问题,controller会自动恢复创建新的pod。

Node节点组件介绍

除了Master,k8s 集群中其他机器被称为node节点,node节点才是k8s集群中中工作负载节点,每个node节点都会被Master节点分配工作负载。当某个node宕机是,其上工作被Master分配到其他节点上去。

 

kubelet: 会监视已分配给节点的pod,负责pod的生命周期管理,同时与Master密切协作,维护和管理该Node上面的所有容器,实现集群管理的基本功能。即Node节点通过kubelet与master组件交互,可以理解为kubelet是Master在每个Node节点上面的agent。本质上,它负责使Pod的运行状态与期望的状态一致。

kube-proxy: 是实现service的通信与负载均衡机制的重要组件,将到service的请求转发到后端的pod上。

docker-engine(docker): 是负责容器的创建和管理工作。

Pod: 最小部署单元,一个Pod 有一个或多个容器组成,容器中共享存储和网络,在同一台docker主机上运行。

之所以采用pod作为k8s的最小部署单元是:

原因一:在一组容器相互关联的情况下,我们难以对整体进行检点判断及恢复等操作。比如一个容器死亡了,不知道是否影响整体的运行。如果引入pod引入业务无关的Pause容器作为pod的根容器,以他的状态代表容器组的状态。

原因二:pod里面多个容器共享pause的容器IP,共享容器挂接的volume,简化了管理密切业务容器直接的通信和文件共享问题。

K8S 核心概念

1. Deployment :

定义:
      Deployment 的主要功能是保证Pod的数量、健康,弹性收缩等、回滚功能(当升级 pod 镜像或者相关参数的时候,如果有错误,可以回滚到上一个稳定版本),版本记录(每一次对 Deployment 的操作都能保存下来)。暂停和启动(升级的时候,能随时暂停和启动)。
场景:

  • 使用Deployment来创建ReplicaSet。ReplicaSet在后台创建pod。检查启动状态,看它是成功还是失败。
  • 然后,通过更新Deployment的PodTemplateSpec字段来声明Pod的新状态。这会创建一个新的ReplicaSet,Deployment会按照控制的速率将pod从旧的ReplicaSet移动到新的ReplicaSet中。
  • 如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
  • 扩容Deployment以满足更高的负载。
  • 暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
  • 根据Deployment 的状态判断上线是否hang住了。
  • 清除旧的不必要的 ReplicaSet。

2. Service:

定义:
      Pod存在生命周期,有销毁,有重建,无法提供一个固定的访问接口给客户端,存在生命周期,属于不可再生类组件。而在动态和弹性的管理模式下,Service为该类Pod对象提供了一个固定、统一的访问接口和负载均衡能力。

3. Namespace:

定义:
      Kubernetes可以使用Namespaces(命名空间)创建多个虚拟集群。
说明:
     用于实现多租户的资源隔离。Namespace通过集群内部的资源对象“分配”到不同的Namespace中,形成逻辑上分组不同的项目、小组或用户组,从而使不同的分组在共享整个集群的资源,同时还能被k8s分别管理。
场景:
      当团队或项目中具有许多用户时,可以考虑使用Namespace来区分,a如果是少量用户集群,可以不需要考虑使用Namespace,如果需要它们提供特殊性质时,可以开始使用Namespace。

4. Label:

定义:
     Labels其实就一对 key/value ,被关联到对象上,标签的使用我们倾向于能够标示对象的特殊特点,并且对用户而言是有意义的(就是一眼就看出了这个Pod是尼玛数据库),但是标签对内核系统是没有直接意义的。标签可以用来划分特定组的对象(比如,所有女的),标签可以在创建一个对象的时候直接给与,也可以在后期随时修改,每一个对象可以拥有多个标签,但是,key值必须是唯一的
说明:
      通过Label进行对象弱关联,灵活地分类和选择不同服务或业务,让用户根据自己特定的组织结构以松耦合方式进行服务部署。Label是一对KV,对用户而言非常有意义的,但对K8S本身而言没有直接意义的。Label可以在创建对象时指定,也可以在后期修改,每个对象可以拥有多个标签,但key值必须是唯一的。

5. Label选择器:

定义:

      与Name和UID 不同,标签不需要有唯一性。一般来说,我们期望许多对象具有相同的标签。

通过标签选择器(Labels Selectors),客户端/用户 能方便辨识出一组对象。标签选择器是kubernetes中核心的组成部分。

6. Annotation:

定义:

      可以使用Kubernetes Annotations将任何非标识metadata附加到对象。客户端(如工具和库)可以检索此metadata。

说明:
      Annotation与Label类似,也使用key/value键值对的形式进行定义。

     Label具有严格的命名规则,它定义的是Kubernetes对象的元数据(Metadata),并且用于Label Selector。

      Annotation 则是用户任意定义的“附加”信息,以便于外部工具进行查找。

      可以使用Labels或Annotations将元数据附加到Kubernetes对象。Labels 可用于选择对象并查找满足某些条件的对象集合。相比之下,Annotations不用于标识和选择对象。

场景:

      日志库、监控库、分析库等资源库的地址信息;

      程序调试工具信息,例如工具名称、版本号等;

      团队的联系信息,例如电话号码、负责人名称、网址等。

7. Ingress:

    可以给Ingress配置提供外部可访问的URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过POST Ingress资源到API server的方式来请求ingress

Logo

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

更多推荐