什么是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编排允许跨多个容器构建应用程序服务、跨集群调度容器、扩展这些容器以及管理它们的运行状况。
市面上的容器编排工具
- Swarm : docker自己的容器编排工具
- Mesos:Apache的一个开源同意管控工具,需要和Marathon结合使用
- Kubernetes : Google开源的容器编排工具
k8s特点
- 服务发现和负载均衡: 这不就是分布式系统的解决方案吗?了解springcloud的都知道;
- 自动部署和回滚:不需要运维人员天天加班来部署上线应用,设定好规则即可自动部署,且支持容器的回滚功能;可动态回滚到某一个版本
- 自动完成装箱计算 : 运行用户指定每个容器所需的cpu数量和内存大小,当应用运行时资源不足时可以做出策略来保证容器运行
- 自我修复:当某个容器因为一些原因无法运行时,k8s会将这个容器放到别的机器上运行,从而保证了容器内的应用持续运行;不宕机
- 监控:k8s会对编排的容器进行实时监控,如果某个容器发生故障时可根据规则做其他处理;
- 秘钥与配置管理:类似于springcloud的配置中心
k8s能解决哪些问题
- 自我修复:一个容器故障停机了,可让另外一个容器立刻启动去替补停机的容器;
- 弹性伸缩:当并发访问量变大的时候,可以做到横向扩展容器数量,当并发量小的时候,可以做到缩减容器数量以减少资源占用;
- 服务发现:服务可以通过自动发现的形式找到它所以来的服务;就跟springcloudeureka注册中心一样的功能
- 负载均衡:如果一个服务启动了多个容器,能够自动实现亲求的负载均衡,且能自定义负载均衡算法;
- 版本回退: 若发现新版本有问题,可以回退到原来的版本
- 存储编排:类似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数据库中
- 一个nginx服务的安装请求会首先被发现到master节点的apiServer组件
- apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上。 在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
- apiServer调用controller-manager去调度Node节点安装nginx服务
- kubelet接受到指令后,会通知docker,然后由docker来启动一个nginx的pod, pod是kubernetes的最小操作单元,容器必须跑在pod中
- 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理,这样,外界用户就可以访问集群中的nginx服务了
k8s集群类型
- 一主多从:一台master节点和多台node节点,搭建简单,但是有单机故障风险,适合测试环境
- 多主多从:多台master和多台node节点,搭建麻烦,安全性高,适合生产环境;
kubectl 是什么
kubectl是k8s集群的命令行工具,通过kubect能够实现对集群本身进行管理维护。在使用k8s功能时会在命令行加上kubectl
关键字,比如
# 获取所有节点
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 系统创建的对象的命名空间