Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展。如果你曾经用过Docker容器技术部署容器,那么可以将Docker看成Kubernetes内部使用的低级别组件。Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。 使用Kubernetes可以:
- 自动化容器的部署和复制
- 随时扩展或收缩容器规模
- 将容器组织成组,并且提供容器间的负载均衡
- 很容易地升级应用程序容器的新版本
- 提供容器弹性,如果容器失效就替换它,等等.
Master组件
Master组件是集群的控制平台
- master负责进群中的全局决策(调度)
- master组件探测并响应集群使劲按,例如,当Deployment的实际Pod副本数量未达到replicas字段的规定的时候,启动一个新的pod
master组件可以运行于集群的任何机器上,但是为了简洁性,通常在同一台机器上运行所有的master组件,且不在此机器上运行用户的容器。
kube-apiserver
此组件提供k8s API,这是kubernetes控制平台的前端,可以水平扩展,通过部署更多的实例达到性能要求。kubectl/kubernetes dashboard /kuboard等k8s管理工具就是通过api实现对集群的管理。
etcd
支持一致性和高可用的键值对存储组件,集群的所有配置都存储在etcd中。
kube-scheduler
此组件监控所有的新创建尚未的分配到节点上的Pod,并且自动为pod选择一个核实的节点区运行。
影响调度的因素有:
- 单个或者多个pod资源要求
- 硬件、软件、策略的限制
- 亲和与反亲和的预定
- 数据本地化的要求
- 工作负载间的相互作用
kube-controller-manager
此组件运行了所有的控制器。
逻辑上来说,每一个控制器都是一个独立的进程,但是为了降低复杂度,这些控制器都被合并运行到一个进程里面。
其中包含的控制器有;
- 节点控制器:负责监听节点停机的事件并作出对应响应
- 副本控制器,负责为集群中的每一个副本控制器对象(Replication Conroller Object)维护期望的POD副本数
- 端点(Endpoints)控制器,负责为端点对象(Endponts Object,连接service和pod)赋值
- Service Account & Token 控制器:负责为新的名称空间创建default Service Account以及API Access Token
cloud-controller-manager
此组件中运行了与具体云基础设施供应商互动的控制器,它只运行特定于云基础设施供应商的控制器,默认k8s集群不安装cloud-controller-manager
Node组件
node组件运行在每一个节点上,包括master和worker节点,负责运维运行中pod并负责提供k8s运行环境。
kubelet
此组件是运行在每一个集群节点上的代理程序,它确保pod 中的容器处于运行状态。kubelet通过多种途径获取PodSpec定义,并确保PodSpec定义中所描述的容器处于运行和监控的状态。
kube-proxy
kube-proxy 是一个网络代理程序,运行在集群的每一个节点上,是实现kubernets Service概念的重要部分。
kube-proxy在节点上维护网络规则,这些规则可以在集群内外正确的于Pod进行网络通信。如果操作系统中存在packet filtering layer,kube-porxy将使用这一特性,(iptabes代理模式),否则,kube-proxy将自行转发网络请求(User space代理模式)
容器引擎
容器引擎负责运行容器,支持多种容器,包括docker,containderd,cri-o,rktlet以及任何实现的k8s容器引擎接口的容器引擎。
Addons
Addons使用k8s资源( DaemonSet,Deployment等)实现进群的功能特性。由于提供集群级别的功能特性,addons使用到的kubernetes 资源都放在kube-system名称空间下。
以下为常用的Addons
DNS
除了DNS Addon以外,其他的addon都不是必须的,所有的kubernetes 集群都应该有Cluster DNS
Cluster DNS 是一个 DNS 服务器,是对您已有环境中其他 DNS 服务器的一个补充,存放了 Kubernetes Service 的 DNS 记录。
Kubernetes 启动容器时,自动将该 DNS 服务器加入到容器的 DNS 搜索列表中。
Web UI (Dashboard)
Dashboard (opens new window)是一个Kubernetes集群的 Web 管理界面。用户可以通过该界面管理集群。
集群
集群是一组节点,这些节点可以是物理服务器或者虚拟机,之上安装了Kubernetes平台
以下是k8s典型架构图
Pod
安排在节点上,包含一组容器和卷。同一个Pod里的容器共享同一个网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。
Label
一些pod有Lable,一个label 是attach到pod的一堆键值对,用来传递用户定义的属性。比如通过label来标记前端pod容器,使用label标记后端pod容器。然后使用selectors选择带有特定label的pod。
Replication Controller
Replication Controller确保任意时间都有指定数量的Pod“副本”在运行。如果为某个Pod创建了Replication Controller并且指定3个副本,它会创建3个Pod,并且持续监控它们。如果某个Pod不响应,那么Replication Controller会替换它,
如果之前不响应的Pod恢复了,现在就有4个Pod了,那么Replication Controller会将其中一个终止保持总数为3。如果在运行中将副本总数改为5,Replication Controller会立刻启动2个新Pod,保证总数为5。还可以按照这样的方式缩小Pod。
Service
pods是短暂的,重启的时候ip可能会改变,可以通过service来保证。
- 会为Service创建一个本地集群的DNS入口,因此前端Pod只需要DNS查找主机名为 ‘backend-service’,就能够解析出前端应用程序可用的IP地址。
- 现在前端已经得到了后台服务的IP地址,Service在这2个后台Pod之间提供透明的负载均衡,会将请求分发给其中的任意一个()。通过每个Node上运行的代理(kube-proxy)完成。
每个节点都运行如下Kubernetes关键组件:
- Kubelet:是主节点代理。
- Kube-proxy:Service使用其将链接路由到Pod,如上文所述。
- Docker或Rocket:Kubernetes使用的容器技术来创建容器。