天下武功,为快不破。 我是Go 写的!
K8S 的架构设计
- C-S架构
- 说明
K8S 使用的是Master —Worker 这种方式,Master 节点负责调度控制,Worker负责干活,也就是说Master 是地主老财,天天只会别人干着干那,Worker 就是农民,埋头耕种即可。
那么,Worker 是怎么向Master 通信及报告状态,Master实时怎么管理Worker的工作情况,怎么规划资源调度的呢?
K8S 基础组件的说明
重点
组件化,各个部门各司其职,分为master 组件和节点(Node)组件。不过还有个公用的都需要的组件,那就是网络组件,用来node 之间通信的。
master 组件
Master 组件既认为是k8s 的大脑,是控制核心组件,主要对于整个集群做决策,调度,检测,事件控制。
一般情况,我们至少有3个master 节点作高可用的k8s 集群。master 节点不做工作任务,只负责集群的控制。
- Kube-apiserver
k8s 是有http api接口的,一般,我们操作集群会安装一个kubeClient 客户端,其实,这个客户端发出的命令既是调用了apiServer, 主要是方便用户通信。
- ETCD
etcd 负责保存 Kubernetes Cluster 的配置信息和各种资源的状态信息。当数据发生变化时,etcd 会快速地通知 Kubernetes 相关组件。 比如pod 的状态,deploy 的状态等。
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性
- Kube-controller-manager
运行控制器,它们是处理集群中常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成独立的可执行文件,并在单个进程中运行。
这些控制器包括:
- 节点控制器: 当节点移除时,负责注意和响应。
- 副本控制器: 负责维护系统中每个副本控制器对象正确数量的 Pod。
- 端点控制器: 填充 端点(Endpoints) 对象(即连接 Services & Pods)。
- 服务帐户和令牌控制器: 为新的命名空间创建默认帐户和 API 访问令牌.
说白了就是,控制pod 的个数,存活周期,秘钥,账户权限,令牌,pod 访问控制等。
- Cloud-controller-manager
cloud-controller-manager 是用于与底层云提供商交互的控制器。云控制器管理器可执行组件是 Kubernetes v1.6 版本中引入的 Alpha 功能。像阿里云和华为云,其实都有一个pod 作为基础其他服务的控制。说白了,既是给其他云服务商提供的一个功能组件,结合他们的服务使用的。
以下控制器具有云提供商依赖关系:
节点控制器: 用于检查云提供商以确定节点是否在云中停止响应后被删除
路由控制器: 用于在底层云基础架构中设置路由
服务控制器: 用于创建,更新和删除云提供商负载平衡器
数据卷控制器: 用于创建,附加和装载卷,并与云提供商进行交互以协调卷
- Kube-scheduler
kube-scheduler 监视新创建没有分配到Node的Pod,为Pod选择一个Node。
- 插件addons
插件(addon)是实现集群pod和Services功能的 。Pod由Deployments,ReplicationController等进行管理。Namespace 插件对象是在kube-system Namespace中创建。
- DNS
虽然其他插件并不是必需的,但所有 Kubernetes 集群都应该具有Cluster DNS,许多示例依赖于它。
Cluster DNS 是一个 DNS 服务器,和您部署环境中的其他 DNS 服务器一起工作,为 Kubernetes 服务提供DNS记录。
Kubernetes 启动的容器自动将 DNS 服务器包含在 DNS 搜索中。这里插一嘴,目前一般集群用的是CoreDns 组件。
node 组件
- Kubelet
kubelet是主要的节点代理,它监测已分配给其节点的 Pod(通过 apiserver 或通过本地配置文件),提供如下功能:
- 挂载 Pod 所需要的数据卷(Volume)。
- 下载 Pod 的 secrets。
- 通过 Docker 运行(或通过 rkt)运行 Pod 的容器。
- 周期性的对容器生命周期进行探测。
- 如果需要,通过创建 镜像 Pod(Mirror Pod) 将 Pod 的状态报告回系统的其余部分。
- 将节点的状态报告回系统的其余部分。
- Kube-Proxy
kube-proxy通过维护主机上的网络规则并执行连接转发,实现了Kubernetes服务抽象。
就是前面一章说的service 概念的抽象基础。
Docker
所有的POD都是在docker 引擎中允许的。master的组件也是可以容器化运行的,不过一般的云服务上都是通过二进制安装的master,因为master 太重要了,稳定性需要是第一位的。RKT
支持 rkt 运行容器作为 Docker 的试验性替代方案 。 不常见。
- supervisord
supervisord 是一个轻量级的进程监控系统,可以用来保证 kubelet 和 docker 运行。
- fluentd
fluentd 是一个守护进程,它有助于提供集群层面日志 集群层面的日志。
网络组件
官方集群网络说明
如何安装网络插件看这里
网络组件解决的是各种通信的问题,如容器到容器,容器到service,容器到外部,外部到容器的问题。
各个厂家的选择不一样,我们一般使用Flannel 或者Weave 作为网络组件。后面我们以Flannel 为例,因为他是最简单的~。 OK , 下一层我们主要说明网络,学习好了网络知识才能更好的掌握k8s 。