整体架构
Kubernetes的整体架构如下图。
Kubernetes属于主从分布式架构,主要由Master节点和Node节点组成,另外还包括客户端命令行工具kubectl和一些其它附加项(Add-on)。
Master节点:作为控制节点,对集群进行调度管理。它是集群的领导者和大脑。
Master节点由API Server、Scheduler、Cluster State Store和Controller-Manger Server所组成。Node节点:作为真正的工作节点,运行业务应用的容器。它是集群中具体干活的。
Node节点包含kubelet、kube proxy和Container Runtime。kubectl:用于通过命令行与API Server进行交互,而对Kubernetes进行操作,实现在集群中进行各种资源的增删改查等操作。
Add-on:是对Kubernetes核心功能的扩展,例如增加网络和网络策略等能力。
value)存储系统。它能够为整个K8s集群存储一些关键的数据,比如Pod、Service等对象的信息。
组件
Master节点
etcd
Kubernetes默认使用etcd作为集群整体的存储系统,当然也可以使用其它的技术。etcd是Coreos开源的(Apache 2.0协议)一个分布式键值(key/value)存储数据库,它具有高可用性和高一致性。
K8s集群的所有数据都存储在etcd中,并具有监控的能力,因此当etcd中的信息发生变化时,就能够快速的通知集群中相关的组件。
API Server(API)
API Server是K8s系统操作集群中资源对象的唯一操作入口。封装了资源对象的增删改查操作,以RESTFul接口方式提供给外部客户端(比如kubectl命令行或web UI)和内部组件(比如scheduler和controller manager)调用。和外部客户端交互时,还可以提供认证、授权、访问控制等机制。
Api Server是唯一可以操作etcd数据库的组件。
Api Server能够水平扩展,可以通过部署多个实例来达到高可用的目的。
Controller-Manager(控制器管理)
Controller-Manager是用来管理集群中的各种资源的控制器。针对于每一种具体的资源,都有相应的Controller,Controller-Manager就是用来管理这些controller,是这些controller所对应的资源始终处于“期望的状态”。
Kubernetes会默认提供Replication Controller、Node Controller、Namespace Controller、Service Controller、Endpoints Controller、Persistent Controller、DaemonSet Controller等控制器。
Scheduler(调度器)
Scheduler是根据调度算法,监控新建的pod,并为其选择一个合适的Node节点。
Kubernetes也支持用户自己提供的调度器,Scheduler负责根据调度策略自动将Pod部署到合适Node中,调度策略分为预选策略和优选策略两步:
- 预选Node:遍历集群中所有的Node,按照具体的预选策略筛选出符合要求的Node列表。如没有Node符合预选策略规则,该Pod就会被挂起,直到集群中出现符合要求的Node。
- 优选Node:预选Node列表的基础上,按照优选策略为待选的Node进行打分和排序,从中获取最优Node。
Node节点
Node是K8s集群中真正的工作负载节点,K8s集群由多个Node共同承担工作负载,pod被分配到某个具体的node上执行。
K8s通过node controller对node资源进行管理。支持动态在集群中添加或删除node。
kubelet
它是位于集群中每个Node上非容器形式的服务进程组件,是Master和Node之间的桥梁。具体的工作有:
- 处理Master下发到本Node上的pod创建、修改、监控、删除等全生命周期管理任务。
- 向Master API server注册Node信息。
- 监控本Node上容器和节点资源情况,并定期向Master汇报节点资源占用情况。
- 向Master汇报容器运行的健康情况。
Kube-proxy
Kube-proxy是Service抽象概念的实现,解决了集群的路由访问和负载均衡问题。
每一个Node都会运行一个kube-proxy,当外部需要访问集群中的指定服务时,Proxy会根据Load Balancer将请求分发到后端正确的容器去处理。
kubectl
kubectl是Kubernetes集群的命令行接口。通过客户端的kubectl命令集操作,API Server响应对应的命令结果,从而可以实现对kubernetes集群的管理。
运行kubectl命令的语法如下所示1
$ kubectl [command] [TYPE] [NAME] [flags]
这里的command,TYPE、NAME和flags为:
- comand:指定要对资源执行的操作,例如create、get、describe和delete
TYPE:指定资源类型,资源类型是大小写敏感的,开发者能够以单数、复数和缩略的形式。例如:
1
2
3$ kubectl get pod pod1
$ kubectl get pods pod1
$ kubectl get po pod1NAME:指定资源的名称,名称也大小写敏感的。如果省略名称,则会显示所有的资源,例如:
1
$kubectl get pods
flags:指定可选的参数。例如,可以使用
-s
或者-server
参数指定Kubernetes API server的地址和端口。
另外,可以通过运行kubectl help命令获取更多的信息。
add-on
kube-dns:是一个灵活的,可扩展的DNS服务器。负责为整个集群提供DNS服务。
Ingress:提供基于Http协议的路由转发机制。为服务提供外网入口。
Dashboard:提供Kubernetes的web用户界面。
Fluentd-elasticsearch:提供集群日志采集、存储与查询