专栏名称: 马哥Linux运维
马哥linux致力于linux运维培训,连续多年排名第一,订阅者可免费获得学习机会和相关Linux独家实战资料!
目录
相关文章推荐
51好读  ›  专栏  ›  马哥Linux运维

我花了10个小时,写出了这篇K8S架构解析

马哥Linux运维  · 公众号  · 运维  · 2019-12-11 21:01

正文

请到「今天看啥」查看全文


apiVersion: V1
kind: ReplicationController
metadata:
 name: mysql#RC的名称,全局唯一
spec:
 replicas:1 #Pod 副本的期待数量
selector :
app: mysql
 template: #Pod模版,用这个模版来创建Pod
metadata:
 labels:
app:mysql#Pod副本的标签
spec:
 containers:#容器定义部分
     -name:mysql
Image:mysql#容器对应的DockerImage
      Ports:
      -containerPort:3306#容器应用监听的端口号
      Env:#注入容器的环境变量
      -name:MYSQL_ROOT_PASSWORD
      Value:”123456”

从上面的配置文件可以看出,需要对这个 RC 定义一个名字,以及期望的副本数,以及容器中的镜像文件。然后通过 kubectl 作为客户端的 cli 工具,执行这个配置文件。

通过 kubectl 执行 RC 配置文件


执行了上面的命令以后,Kubernetes 会帮助我们部署副本 MySQL 的 Pod 到 Node。


此时先不着急看结果,回到最开始的架构图,可以看到 kubectl 会向 Master 中的 APIServer 发起命令,看看 APIServer 的结构和信息的传递吧。

Kubernetes API Server 通过一个名为 kube-apiserver 的进程提供服务,该进程运行在 Master 上。


可以通过 Master 的 8080 端口访问 kube-apiserver 进程,它提供 REST 服务。


因此可以通过命令行工具 kubectl 来与 Kubernetes APIServer 交互,它们之间的接口是 RESTful API。


APIServer 的架构从上到下分为四层:

  • API 层: 主要以 REST 方式提供各种 API 接口,针对 Kubernetes 资源对象的 CRUD 和 Watch 等主要 API,还有健康检查、UI、日志、性能指标等运维监控相关的 API。

  • 访问控制层: 负责身份鉴权,核准用户对资源的访问权限,设置访问逻辑(Admission Control)。

  • 注册表层: 选择要访问的资源对象。PS:Kubernetes 把所有资源对象都保存在注册表(Registry)中,例如:Pod,Service,Deployment 等等。

  • etcd 数据库: 保存创建副本的信息。用来持久化 Kubernetes 资源对象的 Key-Value 数据库。

APIServer 分层架构图


当 kubectl 用 Create 命令建立 Pod 时,是通过 APIServer 中的 API 层调用对应的 RESTAPI 方法。


之后会进入权限控制层,通过 Authentication 获取调用者身份,Authorization 获取权限信息。


AdmissionControl 中可配置权限认证插件,通过插件来检查请求约束。例如:启动容器之前需要下载镜像,或者检查具备某命名空间的资源。


还记得 mysql-rc.yaml 中配置需要生成的 Pod 的个数为 1。到了 Registry 层会从 CoreRegistry 资源中取出 1 个 Pod 作为要创建的 Kubernetes 资源对象。


然后将 Node,Pod 和 Container 信息保存在 etcd 中去。这里的 etcd 可以是一个集群,由于里面保存集群中各个 Node/Pod/Container 的信息,所以必要时需要备份,或者保证其可靠性。


Controller Manager,Scheduler 和 kubelet


前面通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 上面建立 Pod 和 Container。


在 APIServer,经过 API 调用,权限控制,调用资源和存储资源的过程。实际上还没有真正开始部署应用。


这里需要 Controller Manager,Scheduler 和 kubelet 的协助才能完成整个部署过程。


在介绍他们协同工作之前,要介绍一下在 Kubernetes 中的监听接口。从上面的操作知道,所有部署的信息都会写到 etcd 中保存。


实际上 etcd 在存储部署信息的时候,会发送 Create 事件给 APIServer,而 APIServer 会通过监听(Watch)etcd 发过来的事件。其他组件也会监听(Watch)APIServer 发出来的事件。

Kubernetes 就是用这种 List-Watch 的机制保持数据同步的,如上图:

  • 这里有三个 List-Watch,分别是 kube-controller-manager(运行在Master),kube-scheduler(运行在 Master),kublete(运行在 Node)。 他们在进程已启动就会监听(Watch)APIServer 发出来的事件。

  • kubectl 通过命令行,在 APIServer 上建立一个 Pod 副本。

  • 这个部署请求被记录到 etcd 中,存储起来。

  • 当 etcd 接受创建 Pod 信息以后,会发送一个 Create 事件给 APIServer。







请到「今天看啥」查看全文


推荐文章
营销兵法  ·  销售终结者!(绝版干货)
8 年前
i黑马  ·  《 赵 薇 列 传 》
8 年前
来自星星  ·  亲热时你做过的最大尺度的事?
8 年前
影像视觉  ·  如何拍出一张获得WPPI青睐的照片?
8 年前