前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Kubernetes(k8s)入门学习

Kubernetes(k8s)入门学习

作者头像
别先生
发布2020-06-09 10:46:27
5520
发布2020-06-09 10:46:27
举报
文章被收录于专栏:别先生别先生

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)、安装复杂,每个组件都需要自己配置。

作者:别先生

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-06-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档