1、部署ETCD (主节点)
kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等。都需要持久化。etcd就是它的数据中心。生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点。
(1)、api server是和etcd通信的唯一组件。所有其他组件通过api server间接的读取,写入数据到etcd(增强乐观锁机制,保证集群状态的一致性,减少出错可能;把实际存储从其他组件剥离,替换容易)
(2)、通过etcdctl命令查看存储的资源可以发现:所有资源都是以JSON格式存储到etcd中的。可以想象成把资源以json格式存储到文件系统中。
(3)、确保集群一致性:一致性算法:要求集群大部分节点(一半以上)参与才能进入到下一状态:三个节点的etcd集群,必须同时有两个存活才能参与到下一状态。
2、部署 APIServer(主节点)
kube-apiserver是Kubernetes最重要的核心组件之一,主要提供以下的功能:
- 提供集群管理的REST API接口,包括认证授权(我们现在没有用到)数据校验以及集群状态变更等
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
- 生产环境为了保证apiserver的高可用一般会部署2+个节点,在上层做一个lb做负载均衡,比如haproxy
如果apiserver服务挂掉,可能会导致某个服务无法访问
(1)、kubernetes系统组件之间只能通过api server进行通信,他们之间不会直接通信。
(2)、以RESTflAPI的形式提供了查询、修改集群状态的CRUD(Create、Read、 Update、 Delete)接口。 它将状态存储到etcd中。
(3)、 API服务器的客户端之 一就是命令行工具kubectl。
(4)、api server客户端处理步骤:通过授权插件授权客户端(kubectl)、通过准入控制插件验证 AND/OR 修改资源请求(准入控制插件包括: AlwaysPullImages、ServiceAccount、NamespaceLifecycle、ResourceQuota等)、验证资源以及持久化存储
(5)、api server如何通知客户端资源变更:
当你创建一个ReplicaSet资源时,它不会去创建pod, 同时它不会去管理服务的端点。那是控制器管理器的工作。
API 服务器甚至也没有告诉这些控制器去做什么。它做的就是,启动这些控制器,以及其他一些组件来监控己部署资源的变更。
客户端通过创建到 API 服务器的 HTTP 连接来监听变更。通过此连接,客户端会接收到监听对象的 一 系列变更通知。
3、部署ControllerManager(主节点)
Controller Manager由kube-controller-manager和cloud-controller-manager组成,是Kubernetes的大脑,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。
(1)、kube-controller-manager由一系列的控制器组成,像Replication Controller、Node Controller、Deployment Controller、ReplicaSet DaemonSet Job Controller、StatefulSet Controller、Service Controller、Endpoint Controller、Namespace Controller、PersistentVolume Controller等。
(2)、controller-manager、scheduler和apiserver 三者的功能紧密相关,一般运行在同一个机器上,我们可以把它们当做一个整体来看,所以保证了apiserver的高可用即是保证了三个模块的高可用。也可以同时启动多个controller-manager进程,但只有一个会被选举为leader提供服务。
(3)、 控制器执行一个 “ 调和 “ 循环, 将实际状态调整为期望状态(在资源 spec 部分定义), 然后将新的实际状态写入资源的 status 部分。
(4)、不同控制器之间不会直接通信, 它们甚至不知道其他控制器的存在。 每个控制器都连接到 API 服务器, 通过监听机制, 请求订阅该控制器负责的一系列资源的变更。
(5)、 控制器不会直接运行 pod,而是将 pod 定义到发布 API server ,让 Kubelet 创建容器并运行 。
4、部署Scheduler(主节点)
kube-scheduler只负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点。我们前面讲到的kubernetes的各种调度策略就是它实现的。
(1)、过滤所有节点,找出能分配给pod的可用节点列表。
(2)、对可用节点按照优先级进行排序,找出最优节点。
(3)、如果多个节点有最高的优先级分数,那么则循环分配,确保平均分配给pod。
5、配置kubectl命令(任意master节点)
kubectl是Kubernetes的命令行工具,是Kubernetes用户和管理员必备的管理工具。
kubectl提供了大量的子命令,方便管理Kubernetes集群中的各种功能。
使用kubectl的第一步是配置Kubernetes集群以及认证方式,包括:
- cluster信息:api-server地址
- 用户信息:用户名、密码或密钥
- Context:cluster、用户信息以及Namespace的组合
6、配置kubelet(工作节点)
每个工作节点上都运行一个kubelet服务进程,默认监听10250端口,接收并执行master发来的指令,管理Pod及Pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点的资源使用情况,并通过cAdvisor监控节点和容器的资源。
(1)、创建Node资源并向api server注册该节点。
(2)、持续监控api server是否把该节点分配给pod,然后启动pod容器。(具体实现方式是告知配置好的容器运行时docker来从特定的容器镜像运行容器)
(3)、kubelet随后会持续监控运行的容器,并向api server报告他们的状态、事件和资源消耗。
(4)、kubelet也是容器存活探针的组件,当探针报错时会重启容器。
(5)、当pod从api server删除时,kubelet会删除容器,并通知api server pod已经被停止。
7、为集群增加service功能 – kube-proxy(工作节点)
每台工作节点上都应该运行一个kube-proxy服务,它监听API server中service和endpoint的变化情况,并通过iptables等来为服务配置负载均衡,是让我们的服务在集群外可以被访问到的重要方式。
(1)、 确保客户端可以通过Kubemetes API 连接到你定义的服务。kube-proxy 确保对服务 IP 和端口的连接最终能到达支持服务(或者其他,非 pod 服务终端)的某个 pod 处。
更多内容请关注我的知乎账号:https://www.zhihu.com/people/dengjiabo/activities
