Master
k8s里的master指的是集群控制节点,每个k8s集群里需要有一个Master节点来负责整个集群的管理和控制,基本k8s所有控制命令都发给它,它负责整个具体的执行过程,后面执行操作基本都是在master节点上运行的,master通常会占据一个独立的服务器(高可用建议3台至少),主要原因它太重要,是整个集群的首脑,如果宕机不可用,那么对集群内容器应用管理都将失效
Master节点上运行的程序
kubernetes API Server (kube-apiserver):提供了HTTP Rest接口的关键服务进程,是kubernetes里所有资源的增删改查等操作唯一入口,也是集群控制入口进程
Kubernetes Controller Manager (kube-controller-manager):Kubernetes里所有资源对象的自动化控制中心,可以理解资源对象的“大总管”。
Kubernetes Schedule (kube-scheduler):负责资源调度(pod调度)的进程,相当于公交公司的“调度室”
另外,在Master节点上还需要启动一个etcd,因为Kubernetes里的所有资源对象的数据全部保存etcd中的
Node
除了master,kubernetes集群的其他机器被称为node节点,在较早的版本中也称为Minion节点。与master一样,node节点可以是一台物理主机,也可以是台虚拟机。node节点才是kubernetes集群中的工作负载节点,每个node都会被maste分配一些工作负载,当某个node宕机时,其上的工作负载会被master自动转移到其他节点。
每个Node有核心程序kubelet、容器运行时环境和kube-proxy
来自k8s中文社区
Kubernetes特性
Kubernetes 是一种用于在一组主机上运行核协同容器化应用程序的系统,指在提供可预测性、可扩展性与高可用性的方式来完全管理容器化应用和生命周期的平台。用户可以定义应用程序的运行方式,以及与其他应用程序或者外界交互的途径,并能实现服务的扩容和缩容,执行平滑滚动更新。以及在不同版本之间调度流量以测试功能或回滚有问题的部署,Kubernetes提供了接口和和组合的平台原语,使得用户能够以高度的灵活性和可靠性定义管理应用程序。简单总结起来,它具有以下几个重要特性
(1) 自动封装:构建与容器之上基于资源依赖以及其他约束自我完成容器的部署且不影响可以性,并通过调度机制混合关键型应用和非关键型应用的工作负载与同一个节点以提高资源的利用率。
(2)自我修复(自愈):支持容器故障后自动重启、节点故障后重新调度容器,以及其他可以节点的健康状态监测失败后关闭容器并重新创建等自我修复机制
(3)水平扩展:支持通过简单的命令或者UI手动水平扩展,以及基于CPU等资源负载率的自动水平扩展机制。
(4)服务发现和负载均衡:Kubernetes通过其附加组件之一的KubeDNS(或CoreDNS)为系统内置了服务发现功能,他为每个server配置DNS名称,并允许集群内部的客户端直接使用此名称发出请求,而server则通过iptables或者ipvs内建了负载均衡机制
(5)自动发布和回滚:Kubernetes支持“灰度”更新应用程序或其他配置信息,它会监控更新过程中应用程序的健康状态,以确保它不会再同一时刻杀掉所有实例,而此过程中一旦发生故障,就会立即执行回滚操作
(6)密钥和配置管理:Kubernetes的ConfigMap实现了配置数据与Docker镜像的解耦,需要时,仅对配置做出更新而无需重构Docker镜像,这为开发应用部署带来了很大的灵活性。此外,对于应用所依赖的一些敏感信息,如用户名、密码、令牌、密钥等信息,Kubernetes专门提供了secret对象为其解耦,及便利; 应用的快速开发和交付,有提供了一定程度上的安全保障。
(7)存储编排:Kubernetes支持pod对象按需自动挂载不同类型的存储系统,这包括本地存储、公有云服务商的云存储(如AWS和GCP等),以及网络存储系统(如,NFS、iscsi、GlusterFS、Ceph、Cinder和Flocker等)
(8)批量处理执行操作:除了服务型应用、Kubernetes还支持批量处理作业及CI(持续集成),如果需要,一样可是实现容器故障后恢复
Kubernetes概念及术语
Kubernetes使用共享网络将多个主机或虚拟机汇集到一个集群里,在各个服务器之间进行通信,该集群是配置Kubernetes的所有组件、功能和负载均衡的物理平台,集群中一台服务器(或者高可用部署中的一组服务器)用于Master,负载管理整个集群,余下的其他机器作为Node,它们是使用本地和外部资源接收和运行工作负载的服务器。机器中这些服务器可以是物理主机,也可以是虚拟机。
(1) Master是集群的网关和中枢,负载诸如为用户和客户端暴露API、跟踪其他服务的健康状态,以最优方式调度工作负载、以及编排其他组件之间的通信等任务,它是用户或客户端与集群之间的核心联络点,并负载Kubernetes系统的大多数集中式管控逻辑。但Master节点即可完成所有的功能,但出于冗余及负载均衡等目的,生产环境中通常需要协同部署多个此类主机,Master节点类似于集群中的蜂王
(2)Node 是Kubernetes集群中的工作节点,负载接收master的工作指令并根据指令响应地创建或销毁pod对象,以及调整网络规则以合理地路由和转发流量等。理论上讲Node节点可以是任何形式的计算设备,不过Master会同一将其抽象为Node对象进行管理,Node类似于封群中的工蜂,生产环境中他们数量众多;Kubernetes将所有Node节点资源集结一处形成一台更加强大的“服务器”,用户将所有应用程序部署其上式,Master会使用调度算法将其自动指派到某个特定的Node节点上运行,在Node加入集群或者从集群移除是,Master也会按需重新编排影响到的Pod。于是,用户无需关心其应用究竟运行与何处。从抽象的角度讲,Kubernetes还有众多组件来支持其内部的业务逻辑,包括运行应用、应用编排、服务暴露、应用恢复等,它们在Kubernetes中抽象为pod、service、Controller等资源类型。几个常用的资源抽象
pod:Kubernetes中的最小调度单位。同一个Pod中容器共享网络名称空间和存储资源,这些容器可经过本地回环接口lo直接通信,但彼此直接有在mount、User及PID等名称空间上保持隔离。尽管pod里可以包含多个容器,但作为最小调度单元,它应该尽可能保持少数的容器,即通常只包含一个主容器,以及必要的辅助容器
资源标签:标签(Label)是将资源进行分类的标识符,资源标签其实是键值型(key/values)数据。标签只在指定的对象(pod)等辨识性的属性,这些属性仅对用户存在特定意义,对Kubernetes集群来说并不直接表达系统语义。标签可以在创建对象时附加其上,并能在创建后人以时间修改。一个对象可以拥有多个标签,一个标签也可以附加与多个对象(通常是同一类对象)之上
标签选择器:标签选择器(selector)全称为“Lable selector”,它是一种根据Lable 过滤符合条件的资源过滤机制;例如,将来附有标签“role:backend”的所有pod对象挑选出来归为一组就是标签选择器的一种应用场景。用户通常使用标签对资源对象进行分类,而后使用标签选择器选择他们。
pod控制器:尽管pod是Kubernetes中最小调度单元,但用户通常不会直接部署及管理pod对象,而是借助于pod控制器Controller对其进行管理,用于负载的控制器是一种管理pod生命周期的资源抽象,他们可以是Kubernetes上的一类对象而非单个资源对象,包括ReplicationController、ReplicaSet、Deployment、StatefulSet、job等,它负责确保pod对象的副本数量精确符合定义,否则“多退少补”。使用控制器之后就不需要手动管理pod对象了,用户只需要声明应用的期望状态,控制器就会自动对其进行进程管理。
服务资源(service):service是建立在一组pod对象上的资源抽象,它通过标签选择器选定一组pod对象,并为这组对象定义同一访问入口(通常一个IP地址),若Kubernetes集群存在DNS组件,他会在service创建时为其自动分配一个DNS名称,以便客户端进行服务发现。到达service IP 后的请求将会负载均衡至其后端各个pod对象上,因此service从本质上讲是一个四层代理服务,另外service还可以将集群外部流量引入集群中来。
存储卷:存储卷(volume)是独立于容器文件系统之外的存储空间,常用于扩展容器存储空间并为它提供持久存储能力。Kubernetes集群的存储卷大体分为临时卷、本地卷和网络卷。临时卷和本地卷位于Node本地,一旦pod被调度至其他Node,此种类的存储卷将无法访问到,因为临时卷和本地卷通常用于数据缓存,持久化数据则要放在持久卷之上
name和namespace:名称(name)是Kubernetes集群资源中资源对象标识符,他们的作用域通常是名称空间(namespace),因此名称空间是名称的额外限制,同一个名称空间中,同一类资源对象名称必须具有唯一性,名称空间通常用于租户和项目资源隔离,从而形成逻辑分组。创建pod和server等资源对象都属于名称空间级别定义,未指定时,他们都属于默认的名称空间“defalt”
Annotation:Annotation(注解):是另一种附加在对象之上的键值类型的数据,但他拥有更大的数据容量。Annotation常用于将各种非标识型元数据附加到对象上,但不能用于标识和选择对象,通常也不会被Kubernetes直接使用,其主要目的是方便工具或用户的阅读及查找等。
Ingress:Kubernetes将pod对象和外部网络进行了隔离,pod和service等对象间的通信都使用其内部专用地址进行,若放开某些pod对象供外部用户访问,则需要将请求流量打开一个通往Kubernetes集群内部的通道,除了service之外,Ingress也是这类通道得出实现方法之一