正文
apiVersion: V1
kind: ReplicationController
metadata:
name: mysql
spec:
replicas:1
selector :
app: mysql
template:
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。