Kubernetes的那些事

一、Kubernetes简称K8S

   是一个基于容器技术的分布式架构解决方案,提供了完善的管理工具,涵盖了开发、部署、动态扩容、滚动升级、运维监控等多个方面。相比于Docker,K8S是容器的管理者,协调者,监控者(一个全局把控的角色),而Docker则在这个平台中充当运行时。(Docker生态也有类似于K8S概念的东西-Docker Swarm,但功能上并没有K8S强大,毕竟K8S是Google在多年实践的产物。目前主流的还是K8S+Docker运行时)

二、Kubernetes几个重要概念术语

    在kubernetes中Node、Pod、RC、Service等都被看作是一种 资源对象 ,几乎所有的资源对象都由K8S提供的 kubectl 工具(或者通过API调用),执行增删该查的操作,并将其保存到 etcd 中持久存储。通常使用 yamljson 文件来声明一个 资源对象 (每个资源对象都有自己特定的属性和语法结构),需要重点注意的是 apiVersion 属性。K8S平台采用了“核心+外围扩展”的设计思路(在保持平台核心稳定的同时持续推进升级优势),大部分的 资源对象 都是属于 v1 这个 核心API(apiVersion: v1)。K8S升级过程中,这些资源对象会有一些新的属性,K8S的处理方式是,一开始,将它存储到一个很长的备注字段里面(作为一种扩展属性),等到成熟后,修改数据库结构(增改表列)形成正式版。

(1)Master

      集群控制节点(通常单独占据一台服务器,高可用建议部署3台)。K8S集群都需要一个Master来负责管理和控制,基本上K8S伤感所有控制命令都发给它,它负责具体的执行过程。如果Master炸了,那集群内容器应用管理也都会失效。另外,Master上通常还需要部署etcd服务,因为K8S所有的资源对象的数据都存储在etcd中

关键进程:

  • Kubernetes API Server(kube-apiserver):提供HTTP Rest接口,能力就是对所有资源进行过增、删、改、查。
  • Kubernetes Controller Manager(kube-controller-manager):Kubernetes里所有资源对象的自动化控制中心,理解成资源对象的“大主管”。
  • Kubernetes Scheduler(kube-scheduler):负责资源调度(Pod调度)的进程,相当于公交公司“调度室”。
(2)Node

      除Master之外,其他的机器被称为Node(较早版本为Minion),是K8S集群中工作负载节点,每个Node节点会被Master分配一些工作负载(其实就是Docker容器)。当Node宕机时,它的工作负载会被Master指派给其他的Node。

关键进程:

  • kubelet:负责Pod对应容器的创建,启停等任务,同时和Master密切协作,实现集群的管理。
  • kube-proxy:实现Kubernetes Service的通信和负载均衡机制的重要组件。
  • Docker Engine:Docker引擎,负责提供容器创建和管理工作。
(3)Label

       标签,一个Label是一个key=value的键值对,其中key与value由用户自己指定,Lable可以附加到各种资源对象上(Node,Pod,Service,RC)。Lable和资源对象是多对多关系,通常在定义资源对象时确定,也可以在创建后进行动态的添加或者删除。通过Label我们可以很方便对资源进行过筛选,以便进行资源分配,调度,配置,部署管理。

常用Label:

  • 版本标签:"release":"stable","release":"canary"
  • 环境标签:"environment":"dev","environment":"qa","environment":"production"
  • 架构标签:"tier":"frontend","tier":"backend","tier":"middleware"
  • 分区标签:"partition":"customerA"
  • 质量管控标签:"track":"daily","track":"weeklyss"
(4)Pod

      Pod是k8s系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型,也是在k8s上运行容器化应用的资源对象,其他的资源对象都是用来支撑或者扩展Pod对象功能的,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等等,k8s不会直接处理容器,而是Pod,Pod是由一个或者多个container组成的。

    特性:

    1、资源共享

     一个Pod里的多个容器可以共享存储和网络,可以看作一个逻辑的主机。共享的如 namespace,cgroups或者其他的隔离资源。

     多个容器共享同一个network namespace,由此在一个Pod里的多个容器共享Pod的IP和端口namespace,所以一个Pod内的多个容器之间可以通过localhost来进行通信,所需要注意的是不同容器要注意不要有端口冲突即可。不同的Pod有不同的IP,不同Pod内的多个容器之前通信,不可以使用IPC(如果没有特殊指定的话)通信,通常情况下使用Pod的IP进行通信。

     一个Pod里的多个容器可以共享存储卷,这个存储卷会被定义为Pod的一部分,并且可以挂载到该Pod里的所有容器的文件系统上。

     2、生命周期短

       Pod属于生命周期比较短暂的组件,比如,当Pod所在节点发生故障,那么该节点上的Pod会被调度到其他节点,但需要注意的是,被重新调度的Pod是一个全新的Pod,跟之前的Pod没有关系。

     3、共享网络

      K8s集群中的所有Pod都在同一个共享网络地址空间中,也就是说每个Pod都可以通过其他Pod的IP地址来实现访问。

     4、使用原则

核心原则是:将多个应用分散到多个Pod中

原因:基于资源的合理应用;扩缩容,不同应用应该有不同的扩缩容策略等。

如果容器之间不是必须运行在一起的话,那么就放到不同的Pod里

如果容器之前是相互独立的组件,那么就放到不同的Pod里

如果容器之前扩缩容策略不一样,那么就放到不同的Pod里

总之:单Pod单容器应用,除非特殊原因

 

 

posted @ 2022-01-13 15:31  xuzhujack  阅读(49)  评论(0编辑  收藏  举报
;