基本概念
1. 硬件
Node
Cluster
很多Node拼接成一个Cluster,就好比很多小单元组成蜂巢。
Persistent Volumes
Cluster只是计算型资源,存储型资源是外置的,可以是云存储或者真硬盘,靠「电线」插拔上去。
2. 软件
Containers
Pods
一组高内聚的应用进一步打包成Pod,Pod是K8S里面最基础的部署单元,一个Pod配置一个IP。
Ingress
K8S Cluster是被防火墙保护的,Ingress就是城门。
3. 实际形态
总体图
- Cluster中有一个master。
- 每个Node上都运行着K8S的client-kubelet。
-
局部图
-
4. 提供服务
以上所述之「硬件」「软件」只是应用在K8S中的部署,是对内的,只有发布成Service,才可以对外提供服务。服务与部署是应用的不同切面,部署是把能力生产出来,服务是把能力提供出去,通过 Label 可以把「部署」以松耦合的方式组合成一个「服务」对外发布。
对象类型
| 类别 | 名称 | | —- | —- | | 资源对象 | Pod、ReplicaSet、ReplicationController、Deployment、StatefulSet、DaemonSet、Job CronJob、HorizontalPodAutoscaling | | 配置对象 | Node、Namespace、Service、Secret、ConfigMap、Ingress、Label、ThirdPartyResource、 ServiceAccount | | 存储对象 | Volume、Persistent Volume | | 策略对象 | SecurityContext、ResourceQuota、LimitRange |
资源对象
Kubernetes的核心技术概念和API对象
基本对象
API对象 | 描述 |
---|---|
Pod | Pod是最小部署单元,一个Pod由一个或多个容器组成,Pod中容器共享存储和网络,在同一台Docker主机上运行。 |
Service | Service一个应用服务抽象,定义了Pod逻辑集合和访问这个Pod集合的策略。Service代理Pod集合对外表现是为一个访问入口,分配一个集群IP地址,来自这个IP的请求将负载均衡转发后端Pod中的容器。Service通过Lable Selector选择一组Pod提供服务。 |
Volume | 数据卷,共享Pod中容器使用的数据。 |
Namespace | 命名空间将对象逻辑上分配到不同Namespace,可以使不同的项目、用户等区分管理,并设定控制策略,从而实现多租户。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。 命名空间也称为虚拟集群。 |
Label | 标签用于区分对象(比如Pod、Service),键/值对存在;每个对象可以有多个标签,通过标签关联对象。 |
Pod
字面含义是如图所示的豌豆,在 k8s 中用这个名字形象的表示若干个关系紧密的、共享一定资源的容器集合(1个或者多个)。
关于pod有如下理解:
- pod是k8s项目的原子调度单位,也就是说k8s的调度器是按照pod而不是容器的资源需求来进行调度的。
- pod只是一个逻辑概念,并不存在所谓的pod的边界或者隔离环境(虽然在概念上我们可以认为存在)。
- k8s 引入pod的概念目的是:
- 通过成“组”的概念能比较好的表达真实世界里的进程之间的亲密关系,并且在这种情况下资源调度也会成“组”调度。
- 容器设计模式,典型的比如 sidecar 模式(可以在一个 Pod 中,启动一个辅助容器,来完成一些独立于主进程(主容器)之外的工作)。
- pod里的所有容器,共享同一个Network Namespace,并且可以共享同一个Volume。
- 在k8s中,pod中会先创建一个Infra容器,而用户定义的其他的容器Join到Infra容器的Network Namepace。
- pod里的容器可直接使用 localhost 通信。
- 一个pod只有一个 IP地址。
- pod的生命周期只和Infra容器一致,与用户容器无关。
- 某种角度看,pod实际是类似传统基础设施里“虚拟机”的角色;而容器则是这个虚拟机里运行的用户程序(这种理解对于迁移基于传统虚拟机的应用非常重要,要摒弃同一个容器里放多个进程,仔细分析应用程序的关系,来决定是否/哪些容器放到哪些 pod 里)。
- pod中的所有Init Container定义的容器会按顺序逐一启动,而直到它们都启动并且退出了,用户容器才会启动。
高阶对象
控制器(Controller)
| API对象 | 描述 | | —- | —- | | Replication Controller | | | ReplicaSet | 下一代Replication Controller。确保任何给定时间指定的Pod副本数量,并提供声明式更新等功能。RC与RS唯一区别就是lable selectore支持不同,RS支持新的基于集合的标签,RC仅支持基于等式的标签。 | | Deployment | Deployment是一个更高层次的API对象,他管理ReplicaSets和Pod,并提供声明式更新等功能。官方建议使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,这就意味着可能永远不需要直接操作ReplicaSet对象。 | | StatefulSet | StatefulSet适合持久性的应用程序,有唯一的网络标识符(IP),持久存储,有序的部署、扩展、删除和滚动更新。 | | DaemonSet | DaemonSet确保所有(或一些)节点运行同一个Pod。当节点加入kubernetes集群中,Pod会被调度到该节点上运行,当节点从集群中移除时,DaemonSet的Pod会被删除。删除DaemonSet会清理它所有创建的Pod。 | | Job | 一次性任务,运行完成后Pod销毁,不再重新启动新容器。还可以任务定时运行。 | | CronJob | | | RBAC | | | HPA | | | PodDisruptionBudget | | | PodSecurityPolicy | | | limitRange | | | startupProbe | |
Deployment
持久化存储(PV、PVC)
网络
API对象 | 描述 |
---|---|
Flannel | |
Calico | |
NetworkPolicy |
参考
运维之美:图解Kubernetes架构
https://www.hi-linux.com/posts/48037.html