随笔- 501  评论- 394  文章- 4 

Kubernetes(k8s)入门学习

1、Kubernetes(k8s)是舵手的含义,Kubernetes(k8s)是什么?

  答:Kubernetes(k8s)是一个开源的系统,让应用、部署、扩缩容自动化,管理容器化的应用。

 

2、Kubernetes(k8s)的主要特征?

  答:1)、一切以服务为中心,围绕着服务转,使用者不用关心服务运行的环境和运行的细节,构建在Kubernetes(k8s)的系统不仅可以独立运行在物理机、虚拟机、私有云、公有云等等。
    2)、自动化,在Kubernetes(k8s)的服务可以自动扩缩容,自动升级、更新、部署。

    3)、Kubernetes的特点:轻量级,消耗资源小、开源、弹性伸缩、负载均衡。

 

3、Kubernetes(k8s)和Docker的关系。

  答:Kubernetes(k8s)可以看作是Docker的上层架构,就像是Java与JavaEE的关系,Kubernetes(k8s)以Docker为基础,准确的说是以Docker技术的标准为基础,去打造一个全新的分布式架构系统,Kubernetes(k8s)并不一定要依赖于Docker,Docker是一个产品,Docker技术是一系列的标准,所以说只要实现了这个标准的产品都可以替代Docker,所以说,Kubernetes(k8s)在底层可以支持自己的容器技术。

 

4、kubernetes的核心概念,如下所示:

  1)、Container容器:一个容器都是由一个镜像起来的,通过这个镜像运行了一个容器。
  2)、POD:Container容器外面的一层就是POD。POD里面可以有一个或者多个容器。POD的特征,POD里面的所有容器都是运行在一台机器上的,POD里面的容器共享网络,POD里面有一个唯一的ip,每一个POD里面都会有一个容器叫做Pause容器(Pause容器非常简单,里面会有一个特定的镜像)。
  3)、Pause容器:Pause容器就是作为一个根容器,把其他容器都Link到一起,Pause容器把容器关联到一起。Pause容器负责整个POD的健康检查,然后汇报给k8s。当业务里面有两个容器或者多个容器的时候,他们的关系非常的紧密,此时,就可以考虑将他们放到同一个POD里面。
  4)、ReplicaSet(RS):POD的上一层是RS,叫做副本集。同一个应用下,要运行几个实例呢,ReplicaSet(RS)负责管理这个的。ReplicaSet(RS)可以管理多个POD的。运行过程中,如果某一个POD出现异常或者异常退出,ReplicaSet(RS)会保证副本始终为2,在另外一台机器重新调度起来一个。
  5)、Deployment:叫做部署,ReplicaSet(RS)的上一层是Deployment。

      如果一个旧的应用运行了两个实例,如果此时想更新该应用,比如,此时旧的应用就是左边的两个POD,如果更新这个应用的时候,一般我们更新的就是Deployment,Deployment会自动的帮我们再创建一个ReplicaSet(RS),创建一个副本集,会滚动先启动一个新版本的POD,例如升级了镜像的版本,副本集先启动了一个实例,此时Deployment管理的是三个实例,对外提供服务的是三个实例,新的实例启动完成以后,健康检查通过以后,Deployment会控制旧的ReplicaSet(RS)去先停止一个旧的POD,将这个旧的POD删除掉,此时,提供服务的是一个新版本,一个旧版本哦,旧版本的POD下掉以后,新的ReplicaSet(RS)会通过新的POD再创建一个新的POD实例,新启动的POD实例也会被ReplicaSet(RS)管理起来,新启动的第二个POD通过健康检查以后,会让旧的ReplicaSet(RS)将剩下的这一个POD停止掉,停掉以后,将旧的ReplicaSet(RS)清理掉,此时整个服务更新的过程就完成了,就进行了滚动部署。

  注意:ReplicaSet(RS)、POD的创建,删除都不需要手动管理的,需要手动管理的层面都是Deployment,Deployment会自动的帮我们创建和销毁ReplicaSet(RS),以及整个POD的创建和销毁过程。
  6)、Service:叫做服务。举例说明,Selector(app=login)这个Selector表示这个Service负责管理的POD需要有这个标签app=login,会自动去找到有对应标签的POD。Service对外会有一个ClusterIP,其他服务或者客户端就可以通过ClusterIP去访问到Service服务,然后访问到底层的POD服务。
  7)、Label:叫做标签。标签是k8s里面非常多的一个东西,很多组件都可以进行打标签,起到一个标识作用。Deployment,POD都进行打标签。

 

5、如果一个旧的应用运行了两个实例,如果此时想更新该应用。

  比如,此时旧的应用就是左边的两个POD,如果更新这个应用的时候,一般我们更新的就是Deployment,Deployment会自动的帮我们再创建一个ReplicaSet(RS),创建一个副本集,会滚动先启动一个新版本的POD,例如升级了镜像的版本,副本集先启动了一个实例,此时Deployment管理的是三个实例,对外提供服务的是三个实例。

  新的实例启动完成以后,健康检查通过以后,Deployment会控制旧的ReplicaSet(RS)去先停止一个旧的POD,将这个旧的POD删除掉,此时,提供服务的是一个新版本,一个旧版本哦,旧版本的POD下掉以后。

  新的ReplicaSet(RS)会通过新的POD再创建一个新的POD实例,新启动的POD实例也会被ReplicaSet(RS)管理起来,新启动的第二个POD通过健康检查以后,会让旧的ReplicaSet(RS)将剩下的这一个POD停止掉,停掉以后,将旧的ReplicaSet(RS)清理掉,此时整个服务更新的过程就完成了,就进行了滚动部署。

 

6、kubernetes的架构设计,如下所示:

  1)、Master节点:称为主节点。Master节点负责管理Worker节点。
  2)、Worker节点:可以存在很多Worker节点,在Worker节点上负责运行我们的服务。
  3)、ETCD集群:Kubernetes(k8s)有自己的存储,需要管理自己的机器,节点,管理我们的服务,持久化存储管理。
  4)、APIServer:Master节点上面的服务,通过APIServer去访问ETCD集群,比如说需要创建一个服务,就需要和k8s集群进行交互。APIServer用来操作k8s的唯一入口,对外提供基于http或者https的api。当ApiServer接收到客户端的请求以后,比如说是创建Deployment的请求,首选,选择一个Worker节点,将POD调度到Worker节点上,如何调度呢,使用的是Scheduler调度器组件。
  5)、Scheduler调度器:会收集每一个Worker节点的详细信息,包括他们的资源,内存,CPU,包括他们节点运行什么服务,等等各种各样的信息。通过预算策略算法或者优选算法策略最终会选择出一个最优的节点,将这个节点和POD建立起一个关系,然后告诉APIServer这个POD可以运行在某一个节点上,APIServer会将这个消息存储到ETCD集群做持久化。POD和Node节点之间的关系做了绑定以后,接下来,需要把真正的POD启动起来了,启动的话需要另外一个模块,称为ControllerManager模块。
  6)、ControllerManager模块:集群内部的控制中心,负责维护各种各样的k8s对象,比如,Service Controller负责管理服务的,Endpoint Controller负责管理Pod列表的,Replication Controller负责管理副本的,ResourceQuota Controller负责管理资源的配额的。ControllerManager会通过APIServer获取ETCD集群里面的持久化信息,比如节点的变化,POD和节点的绑定关系,会被ControllerManager监听到,会通过一些目录去发现这个POD当前处于等待调度的状态,它就会去完成这个调度,然后让POD运行起来。那么POD是如何在Worker节点上运行起来的呢。
  7)、Kubelet服务:完成POD在Worker节点上运行起来,在每一个Worker节点上安装Kubelet服务,主要负责维护POD的生命周期,包括容器的网络等等管理。最终会调用起本地的Docker,实现运行起容器,运行起各个的POD。

 

7、kubernetes的认证与授权。

  1)、客户端证书认证(TLS双向认证,TLS是一种协议)。kubectl去访问ApiServer的时候,第一步就是进行认证,k8s需要知道访问它的人是谁。kubectl一般使用的是客户端证书认证的方式去和ApiServer进行认证,TLS双向认证,TLS是一种协议,为什么需要双向认证呢,kubectl去访问ApiServer的时候,要验证ApiServer的证书是不是合法的,同样,kubectl去访问ApiServer的时候,要验证ApiServer是不是我真正要访问的ApiServer,同样,ApiServer在被kubectl访问的时候,也要去验证kubectl客户端是不是一个合法的客户端。所以说,他们之间的认证是一个双向的认证。kubectl需要有一个CA,用来判断和保证每个证书的合法性的,k8s使用自己的认证机构,认证中心,在自定义的CA里面给每一个组件颁发证书,比如Controller Manager组件、Scheduler组件、ApiServer、etcd组件等等。比如kubectl将自己的证书发给ApiServer,ApiServer将自己的证书发给kubectl,他们之间互相验证对方的证书是不是CA颁发的证书,如果是就进行通过认证加密的通讯了,这个通讯过程就是客户端证书认证。

  2)、BearerToken的认证方式。是一种简单的方式,可以理解为,有一个复杂的密码,预先在ApiServer中定义一个复杂的密码,把这个密码告诉指定的客户端,kubectl去访问ApiServer的时候,就将BearerToken带上,然后ApiServer验证一下,如果没有问题,就可以进行通讯了。

  3)、ServiceAccount认证方式。以上两种都是在集群的外部去访问ApiServer的时候进行认证。ServiceAccount认证方式是在k8s内部,运行的POD,运行的容器要和ApiServer交互的时候,使用的就是ServiceAccount认证方式,ServiceAccount和k8s的其他资源都是一样的,用户也可以创建自己的ServiceAccount。ServiceAccount主要包含了三个内容,namespace命名空间、token密码、ca验证ApiServer的证书,通过目录挂载的方式挂载到POD的文件系统里面,然后应用就可以读取指定目录的文件去获取到这些信息,然后拿到这些信息以后就可以和ApiServer进行交互了。

 

8、认证是访问ApiServer的第一关,授权是访问ApiServer的第二关。认证是认证了身份,身份没有了问题,就需要这个身份的人能够干什么事情,k8s里面有一系列的鉴权机制。

 

9、授权,ABAC、WebHook、RBAC。RBAC是k8s1.6版本引入的,也是最新的授权策略,k8s对RBAC投入最大,所以是更好的选择,RBAC的全称是Role Based Access Control,基于角色的访问控制。

  1)、用户层面:两种User用户,一种是普通的User用户,比如kubectl去访问ApiServer的时候,都属于普通的user用户。另外一种用户是ServerAccount,专门用于在集群内部去访问ApiServer的。
  2)、权限层面:k8s里面有很多类型的对象,资源,比如POD、Deployment、Service等等各种各样的资源。需要考虑将权限需要区分开,什么样的资源是可以访问的,什么样的资源是不可以访问的。一种是资源的维度Resource,另外一种是对资源控制的方式,比如说常见的增删改查CURD操作(List列表、Create新增、Update更新、Delete删除),叫做Verbs动词,动作的含义。
  3)、角色层面:需要有一种最基本的角色,该角色一般包含了名字Name,权限Resouce,操作Verbs。
  4)、用户和角色之间的关系,k8s里面使用RoleBinding描述这种用户和角色之间对应关系。
  5)、Nameplace命名空间,对k8s里面的资源起到进行隔离的作用,如果某个人需要访问某一个或者某几个命名空间下面的资源,需要加上Nameplace命名空间,将Role角色放到Nameplace命名空间下面,如果拥有了该角色,也就只能拥有当前命名空间下的这个角色对应的权限。如果某个人需要某一个或者某几个Namespace命名空间下面的权限,就可以给他定义对应的Role角色,再把它对应的RoleBinding关联起来。
  6)、ClusterRole:跨Nameplace命名空间,如果一个人拥有所有的权限呢,k8s提出了ClusterRole,集群的角色,对应的是ClusterRoleBinding,集群的角色绑定。集群的角色除了可以定义和普通的角色一样的Resource、Verbs以外呢,还可以定义集群范围内的资源,并不是所有资源都属于Namespace命名空间的,比如Node节点资源就不属于任何Namespace的,如果需要给一个人定义Node节点资源的操作权限,就需要定义一个ClusterRole集群角色,然后把Node资源加到该角色里面,这样的话,角色的控制就比较灵活了,可以满足各种各样的需求了。如果用户需要整个集群的POD Service的访问权限,可以定义一个ClusterRole,在这个Role的Resouce里面可以自定义POD Service,然后再建立一个ClusterRoleBinding绑定用户,绑定到这个ClusterRole上面,然后就可以访问集群范围内的POD和Service了,不受命名空间的制约了。需要注意的是,所有的RoleBinding、ClusterRoleBinding,都是同时支持普通的User和ServiceAccount的,这两种用户在权限设计里面是对等的概念。
至此,授权就完毕了。

 

10、 AdmisionControl,准入控制,一个个的小插件,小代码,它们之间独立存在,并没有之间的联系。请求会一个一个从AdmisionControl准入控制的代码段里面,执行一遍,一个一个的执行。可以类比于Java里面的Filter过滤器。k8提供的准入控制大概有一二十种。AlwaysAdmit总是运行所有请求通过、AlwaysDeny拒绝所有请求、ServiceAccount提供自动化,辅助ServiceAccount、DenyEscolatingExec拒绝所有的Exec,等等。


11、k8s的安装部署。

方式一,使用Kubeadm的优点。

  1)、优雅,几乎所有组件都是运行在容器中的,并且都是运行在k8s的POD里面的,这是非常优雅的地方。
  2)、简单,安装过程非常简单,配置好一个配置文件,运行一个命令。
  3)、支持高可用,支持高可用和非高可用的安装。
  4)、升级方便,升级随时随地,只要拿到Kubeadm命令,肯定可以拿到最新的k8s集群,因为它是官方出的,肯定会和k8s同步更新。
使用Kubeadm的缺点。
  1)、不易维护,对容器不熟悉或者对k8s机制不熟悉,维护起来很困难。
  2)、文档不够细致,文档简陋。

方式二,Binary,二进制安装方式优点,也是官方的安装方式。

  1)、易于维护,和Kubeadm是相反的,因为都是通过进程直接运行的,都是需要配置好的,并且手动运行起来的,就会清楚组件如何运行,组件之间的调用关系,方便理解。
  2)、非常灵活,搭建单机还是高可用,都是一个模块一个模块运行起来的,想怎么配置就怎么配置,非常灵活。
  3)、升级方便,和Kubeadm是一样的,可以一点点去升级,b不会对整个集群造成太大影响。
Binary,二进制安装方式缺点。
  1)、没有安装文档,官方没有提供安装文档。
  2)、安装复杂,每个组件都需要自己配置。

 

作者:别先生

博客园:https://www.cnblogs.com/biehongli/

如果您想及时得到个人撰写文章以及著作的消息推送,可以扫描上方二维码,关注个人公众号哦。

 

posted on 2020-06-05 15:25  别先生  阅读(154)  评论(0编辑  收藏