Kubernetes 概念

发布时间:2022-02-27 14:46:43 作者:yexindonglai@163.com 阅读(1310)

什么是Kubernetes

因为第一个字母k和最后一个字母s之间有8个英文字母,所以也称为k8s,

k8s的主要作用是对docker容器的编排管理,如果我们的docker容器只有几个的情况下,开发或者运维人员完全可以轻松管理这些容器,但是像一些大公司里面,它们的服务有几百上千个,如果单靠运维人员去管理的话,付出的人力成本是极其昂贵的,所以这时候就需要一个可以对大量容器的管理系统,k8s的出现解决了这个问题,k8s也称为容器编排系统;可以管理大规模的容器,

总的来说,k8s就是提供了一个分布式系统管理的框架,相信如果学过springcloud或者dubbo的童鞋能更容易理解这个概念!本质就是一组服务器集群;

kubernetes 概念

master

集群控制节点,每个集群至少需要一个master节点负责集群的管控,主要负责安排工作

Node

工作负载节点,由master分配容器到这些工作节点上,然后node节点上的docker负责容器的运行;主要负责干活

pod

pob是k8s的最小操作单元,容器必须抛在pod中;一个Pod可以承载一个或者多个相关的容器(==建议一个pod只承载一个容器==),在后边的案例中,同一个Pod中的容器会部署在同一个物理机器上并且能够共享资源。一个Pod也可以包含O个或者多个磁盘卷组(volumes),这些卷组将会以目录的形式提供给一个容器,或者被所有Pod中的容器共享,对于用户创建的每个Pod,系统会自动选择那个健康并且有足够容量的机器,然后创建类似容器的容器

==程序在容器里面,容器在pod里面,pod在docker里面==

Controller

控制器,通过它来实现对pod的管理,比如 启动pod、停止pod、伸缩pod的数量等等,控制器有多种,每种控制器都有 他自己的使用场景,常用的控制器有deployment、

Service

pod对外服务的统一入口,也就是说, 当你的web服务器部署到容器中后,它的ip只是集群内可访问的,并且它的IP是随机生成,外部并不知道它的ip是多少,service就可以打通外部和内部的通讯,它充当了网关的功能,可实现负载均衡,只要service的ip不变,外部就可以访问到内部的集群节点中的web应用,

Label

标签,在资源上 添加一个标识,用于对pod、Node、Service进行分类,同一类pod、Node、Service会有相同的标签;

NameSpace

命名空间,用来隔离pod的运行环境,相当于给容器分组,一个组内的所有容器可以互相访问,组外和组内是隔离的,不可访问;常见的pods, services, replication controllers和deployments等都是属于某一个namespace的(不指定-n的情况下默认是default)。Namespace常用来隔离不同的用户

deployment

Controller的其中一种,在k8s中,Pod是最小控制单元,但是k8s很少直接控制Pod,一般都㐊通过pod控制器来完成的,Pod控制器顾名思义就是用来控制Pod的,确保Pod资源符合预期状态,当Pod资源发生故障时,会自动尝试进行重启或者重建pod(先删除在新建Pod);

什么是编排

编排指的就是可以自动化处理成百上千个容器的技术,可以管理这些容器的部署、管理、弹性伸缩、容器网络管理,而最重要的就是2个字:“编”和“排”

将众多容器进行分组,比如有100个容器,将1~10的容器编成一个组,代表它们是同一个应用的容器,将21~30又遍成另一个组,进行分组管理,可以保证容器之间更容易区分,就像分类一样

将容器分组后,在将这个组排列起来,可以根据应用的大小或流量情况进行扩充或减少容器数量;Kubernetes编排允许跨多个容器构建应用程序服务、跨集群调度容器、扩展这些容器以及管理它们的运行状况。

市面上的容器编排工具

  1. Swarm : docker自己的容器编排工具
  2. Mesos:Apache的一个开源同意管控工具,需要和Marathon结合使用
  3. Kubernetes : Google开源的容器编排工具

k8s特点

  1. 服务发现和负载均衡: 这不就是分布式系统的解决方案吗?了解springcloud的都知道;
  2. 自动部署和回滚:不需要运维人员天天加班来部署上线应用,设定好规则即可自动部署,且支持容器的回滚功能;可动态回滚到某一个版本
  3. 自动完成装箱计算 : 运行用户指定每个容器所需的cpu数量和内存大小,当应用运行时资源不足时可以做出策略来保证容器运行
  4. 自我修复:当某个容器因为一些原因无法运行时,k8s会将这个容器放到别的机器上运行,从而保证了容器内的应用持续运行;不宕机
  5. 监控:k8s会对编排的容器进行实时监控,如果某个容器发生故障时可根据规则做其他处理;
  6. 秘钥与配置管理:类似于springcloud的配置中心

k8s能解决哪些问题

  1. 自我修复:一个容器故障停机了,可让另外一个容器立刻启动去替补停机的容器;
  2. 弹性伸缩:当并发访问量变大的时候,可以做到横向扩展容器数量,当并发量小的时候,可以做到缩减容器数量以减少资源占用;
  3. 服务发现:服务可以通过自动发现的形式找到它所以来的服务;就跟springcloudeureka注册中心一样的功能
  4. 负载均衡:如果一个服务启动了多个容器,能够自动实现亲求的负载均衡,且能自定义负载均衡算法;
  5. 版本回退: 若发现新版本有问题,可以回退到原来的版本
  6. 存储编排:类似docker的-v挂载功能,但是k8s支持使用内部存储和外部存储,或者云存储都可以;

组件

主节点的组件

一个k8s由控制节点(master)和工作节点(work)组成,每个节点上都会安装不同的组件来相互配合完成工作;

  • kubectl: 是一个客户端的管理工具,直接管理API server,提供一个请求到一个api server,中间有一个auth认证(判断是否有权限访问)

    控制节点

    负责集群的决策和管理工作,就像一个领导,关于控制节点包含以下几个组件
    • APIServer : 资源操作的唯一入口,所有对集群的操作都是从这个入口进来的,比如服务注册和发现、接受用户输入的命令、认证、授权等等
    • Scheduler :负责集群资源的调度,按照预定的调度策略将pod调度到相应的node节点上(只负责计算)
    • ControllerManager :负责维护集群的状态,比如程序部署安排、请求调度、故障检测、自动扩展、滚动更新等等(Scheduler负责计算,ControllerManager 负责干活,比如客户端kubectl发起了一起创建容器的请求,Scheduler算好了请求到A节点,那么ControllerManager就会将请求打到A节点上,在A节点进行创建容器)
    • Etcd:一个类似redis的数据库,存储集群中各种资源对象的信息,比如你请求调用了哪个节点,这些记录信息会存储到Etcd里面,Etcd是k8s的默认的存储数据库,当然你也可以使用外部存储,比如mysql、oracle等等

工作节点的组件

  • kubelet:负责维护容器的生命周期,在集群中就是由kubelet发命令给docker来进行创建、更新、销毁容器;同时也负责监控容器的状态;
  • kubeProxy:负责集群内的服务发现和负责均衡;负责网路代理(处理用户怎么访问container?),维护网络规则和四层的负载均衡,怎样才能让下面的Pod(一个或者多个容器)能对外提供服务
  • docker :容器的操作

组件之间的调用关系

下面以部署一个nginx服务来说明kubernetes系统各个组件调用关系,
,首先要明确,一旦kubernetes环境启动后,master和node都会讲自身的信息存储到etcd数据库中

  1. 一个nginx服务的安装请求会首先被发现到master节点的apiServer组件
  2. apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上。 在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
  3. apiServer调用controller-manager去调度Node节点安装nginx服务
  4. kubelet接受到指令后,会通知docker,然后由docker来启动一个nginx的pod, pod是kubernetes的最小操作单元,容器必须跑在pod中
  5. 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理,这样,外界用户就可以访问集群中的nginx服务了
    在这里插入图片描述

k8s集群类型

  • 一主多从:一台master节点和多台node节点,搭建简单,但是有单机故障风险,适合测试环境
  • 多主多从:多台master和多台node节点,搭建麻烦,安全性高,适合生产环境;

kubectl 是什么

kubectl是k8s集群的命令行工具,通过kubect能够实现对集群本身进行管理维护。在使用k8s功能时会在命令行加上kubectl关键字,比如

  1. # 获取所有节点
  2. kubectl get nodes

namespace

namespace 是命名空间,也叫名称空间,主要用来资源隔离,默认只隔离资源,不隔离网络,默认的名称空间有以下几个

  • default:默认命名空间
  • kube-node-lease:对于提升 Kubernetes 集群规模来说,NodeLease 是一个非常重要的 Feature 。在没有开启 NodeLease 之前,Kubelet 会使用 Update Node Status 的方式更新节点心跳,而一次这样的心跳会向 API Server 发送大约10 KB数据量。
  • kube-public:可被所有用户访问的命名空间,包括未认证的用户;
  • kube-system:由 Kubernetes 系统创建的对象的命名空间

关键字Kubernetes