k8s资源对象可以用yaml或者json格式声明。每个资源对象都有自己的特定结构定义,并统一保存在etcd这种非关系型数据库中。资源对象可以通过k8s提供的工具kubectl工具进行增删改。
1、主要资源
- Pod:Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。
- ReplicaSet:它的主要作用是确保Pod以用户指定的副本数运行,即如果有容器异常退出,会自动创建新的Pod来替代;而异常多出来的容器也会自动回收。
- Deployment:Deployment定义了一组Pod的信息。Deployment的主要职责与RC相似,同样是为了保证pod的数量和健康。此外还支持滚动升级、回滚等多种升级方案。
- DaemonSet:DaemonSet确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。
- Job:批处理任务通常并行(或串行)启动多个计算进程去处理一批工作项(work item),处理完成后,整个批处理任务结束。
- CronJob:CronJob即定时任务,类似于Linux系统的crontab,在指定的时间周期运行指定的任务
- StatefulSet:StatefulSet里的每个Pod都有稳定、唯一的网络标识,可以用来发现集群内的其他成员。
2、Pod配置
- ConfigMap:ConfigMap存储Pod的配置文件。
- Secret:加密数据存储。
3、存储类
- PersistentVolume:声明容器中可以访问的文件目录,被挂载到一个或多个Pod上。并且支持多样的存储类型。
- PersistentVolumeClaim:处理集群中的存储请求,绑定特定的pv,将请求进行存储
- StorageClass:StorageClass对象会定义下面两部分内容:
- PV的属性,如存储类型、Volume的大小等。
- 创建这种PV需要用到的存储插件。有了这两个信息后,Kubernetes就能够根据用户提交的PVC找到一个对应的StorageClass,之后Kubernetes就会调用该StorageClass声明的存储插件,进而创建出需要的PV。但是其实使用起来是一件很简单的事情,只需要根据自己的需求编写YAML文件,然后使用kubectl create命令执行即可。
4、网络资源类
- Ingress:Ingress对象其实就是对“反向代理”的一种抽象,简单的说就是一个全局的负载均衡器,可以通过访问URL定位到后端的Service。有了Ingress这个抽象,k8s就不需要关心Ingress的细节了,实际使用时,只需要选择一个具体的Ingress Controller部署即可,业界常用的反向代理项目有Nginx、HAProxy、Envoy和Traefik,都已经成为了k8s专门维护的Ingress Controller。
- Service:Service是一种抽象概念,它定义了一个Pod逻辑集合及访问它们的方式。支持ClusterIp、NodePort和LoadBalancer。
- Endpoint:Endpoint是k8s集群中的一个资源对象,存储在etcd中,用来记录一个Service对应的所有Pod的访问地址。
- NetworkPolicy:Network Policy提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制它们之间的流量及来自外部的流量。
5、集群
- Cluster:k8s集群。
- Master:k8s控制面板,主服务。
- Node:k8s集群里的worker节点。
- ETCD:k8s数据库。
- Service Account:service account是k8s为Pod内部的进程访问apiserver创建的一种用户。其实在Pod外部也可以通过sa的token和证书访问apiserver,不过在Pod外部一般都是采用client证书的方式
- User:k8s集群的用户。
- Group:用户组。
- Role:Role是一组权限的集合,如Role可以包含列出Pod权限及列出Deployment权限,Role用于给某个NameSpace中的资源进行鉴权。
- ClusterRole:ClusterRole是一组权限的集合,但与Role不同的是,ClusterRole可以在包括所有NameSpce和集群级别的资源或非资源类型进行鉴权。
- ClusterRoleBinding:可以使用ClusterRoleBinding在集群级别和所有命名空间中授予权限。
- RoleBinding:RoleBinding将Role中定义的权限分配给用户和用户组。RoleBinding包含主题(users、groups或service accounts)和授予角色的引用。对于namespace内的授权使用RoleBinding,集群范围内使用ClusterRoleBinding。
- Namespace:Kubernetes支持多个虚拟集群,它们底层依赖于同一个物理集群。这些虚拟集群被称为命名空间。
6、集群配置
- LimitRange:资源配额是对整个名称空间的资源的总限制,是从整体上来限制的,而LimitRange则是对Pod和Container级别来做限制的。
- Quota:其中ResourceQuota是针对namespace做的资源限制,而LimitRange是针对namespace中的每个组件做的资源限制。
- HorizontalPodAutoscaler:Horizontal Pod Autoscaling可以根据CPU使用率或应用自定义metrics自动扩展Pod数量(支持replication controller、deployment和replica set)。
7、Master组件
- k8s API Server:k8s API Server提供了k8s各类资源对象(如Pod、RC、Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。
- Controller Manager:Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(Service Account)、资源定额(ResourceQuota)的管理。
- Scheduler:管家的角色遵从一套机制为Pod提供调度服务,如基于资源的公平调度、调度Pod到指定节点,或者将通信频繁的Pod调度到同一节点等。
- Cloud Controller Manager:Cloud Controller Manager提供Kubernetes与阿里云基础产品的对接能力,如CLB、VPC等。目前,CCM的功能包括管理负载均衡、跨节点通信等。
- Kubelet:Kubelet组件运行在Node节点上,维持运行中的Pods提供kubernetes运行时环境。
- Kube-proxy:kube-proxy是Kubernetes的核心组件,部署在每个Node节点上,它是实现Kubernetes Service的通信与负载均衡机制的重要组件;kube-proxy负责为Pod创建代理服务,从apiserver获取所有Server信息,并根据Server信息创建代理服务,实现Server到Pod的请求路由和转发,从而实现k8s层级的虚拟转发网络。