快速掌握 Kubernetes 中的核心概念
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 层级的虚拟转发网络。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/da551c6cc1c89c6d03d1b151c】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论