常见概念

常见概念



Master 负责管理集群负责协调集群中的所有活动,例如调度应用程序,维护应用程序的状态,扩展 和更新应用程序。 Worker节点(即图中的Node)是VM(虚拟机)或物理计算机,充当k8s集群中的工作计算机。每个 Worker节点都有一个Kubelet,它管理该Worker节点并负责与Master节点通信。该Worker节点还应具 有用于处理容器操作的工具,例如Docker。 kubectl 是 k8s 的客户端工具,可以使用命令行管理集群。负责 master 节点和 worker 节点之间通信 的进程;管理 Pod(容器组)和 Pod(容器组)内运行的 Container(容器)。 Deployment 译名为部署。在k8s中,通过发布 Deployment,可以创建应用程序 (docker image) 的 实例 (docker container),这个实例会被包含在称为 Pod 的概念中,Pod 是 k8s 中最小可管理单元。 在 k8s 集群中发布 Deployment 后,Deployment 将指示 k8s 如何创建和更新应用程序的实例, master 节点将应用程序实例调度到集群中的具体的节点上。Deployment 处于 master 节点上,通过 发布 Deployment,master 节点会选择合适的 worker 节点创建 Container(即图中的正方体), Container 会被包含在 Pod (即蓝色圆圈)里。 Pod 容器组是一个k8s中一个抽象的概念,用于存放一组 container(可包含一个或多个 container 容 器),以及这些 container (容器)的一些共享资源。这些资源包括: 共享存储,称为卷(Volumes) 网络,每个 Pod(容器组)在集群中有个唯一的 IP,pod(容器组)中的 container(容器)共享 该IP地址 container(容器)的基本信息,例如容器的镜像版本,对外暴露的端口等 Pod(容器组)是 k8s 集群上的最基本的单元。当我们在 k8s 上创建 Deployment 时,会在集群上创 建包含容器的 Pod (而不是直接创建容器)。每个Pod都与运行它的 worker 节点(Node)绑定,并保 持在那里直到终止或被删除。如果节点(Node)发生故障,则会在群集中的其他可用节点(Node) 上运行相同的 Pod(从同样的镜像创建 Container,使用同样的配置,IP 地址不同,Pod 名字不

同)。Pod(容器组)有自己的生命周期 (opens new window)。当 worker node(节点)故障时, 节点上运行的 Pod(容器组)也会消失。然后,Deployment (opens new window)可以通过创建新的 Pod(容器组)来动态地将群集调整回原来的状态,以使应用程序保持运行。 Node(节点)是 kubernetes 集群中的计算机,可以是虚拟机或物理机。每个 Node(节点)都由 master 管理。一个 Node(节点)可以有多个Pod(容器组),kubernetes master 会根据每个 Node (节点)上可用资源的情况,自动调度 Pod(容器组)到最佳的 Node(节点)上。Pod(容器组) 总是在 Node(节点)上运行。 Service(服务)提供了这样的一个抽象层,它选择具备某些特征的 Pod(容器组)并为它们定义一 个访问方式。Service(服务)使 Pod(容器组)之间的相互依赖解耦(原本从一个 Pod 中访问另外 一个 Pod,需要知道对方的 IP 地址)。一个 Service(服务)选定哪些 Pod(容器组)通常 由 LabelSelector(标签选择器) 来决定。 在创建Service的时候,通过设置配置文件中的 spec.type 字段的值,可以以不同方式向外部暴露应 用程序: ClusterIP(默认): 在群集中的内部IP上公布服务,这种方式的 Service(服务)只在集群内部可 以访问到 NodePort : 使用 NAT 在集群中每个的同一端口上公布服务。这种方式下,可以通过访问集群中 任意节点+端口号的方式访问服务 :。此时 ClusterIP 的访问方式仍然可 用。 LoadBalancer:在云环境中(需要云供应商可以支持)创建一个集群外部的负载均衡器,并为使用 该负载均衡器的 IP 地址作为服务的访问地址。此时 ClusterIP 和 NodePort 的访问方式仍然可 用。 Service通过 LabelSelector 选择了一组 Pod(容器组),把这些 Pod 的指定端口公布到到集群外 部,并支持负载均衡和服务发现。 公布 Pod 的端口以使其可访问 在多个 Pod 间实现负载均衡 使用 Label 和 LabelSelector Labels、LabelSelector(标签和选择器) 共同匹配一组 Pod。Labels(标签)是附加到 Kubernetes 对象的键/值对,Labels(标签)可以在创建 Kubernetes 对象时附加上去,也可以在创建之后再附加 上去。任何时候都可以修改一个 Kubernetes 对象的 Labels(标签),其意图是按照对用户有意义的 方式来标识Kubernetes对象,同时,又不对Kubernetes的核心逻辑产生影响。标签可以用来组织和 选择一组Kubernetes对象。您可以在创建Kubernetes对象时为其添加标签,也可以在创建以后再为 其添加标签。每个Kubernetes对象可以有多个标签,同一个对象的标签的 Key 必须唯一,使用标 签,用户可以按照自己期望的形式组织 Kubernetes 对象之间的结构,而无需对 Kubernetes 有任何 修改。 LabelSelector: 多个Kubernetes对象包含相同的标签。通过使用标签选择器(label selector),用 户/客户端可以选择一组对象。标签选择器(label selector)是 Kubernetes 中最主要的分类和筛选手 段,Kubernetes api server支持两种形式的标签选择器,equality-based 基于等式的和 set-based 基于 集合的。标签选择器可以包含多个条件,并使用逗号分隔,此时只有满足所有条件的 Kubernetes 对 象才会被选中。

基于等式的选择方式 apiVersion: v1 kind: Pod metadata: name: cuda-test spec: containers:

  • name: cuda-test image: “k8s.gcr.io/cuda-vector-add:v0.1” resources: limits: nvidia.com/gpu: 1 nodeSelector: #基于等式 accelerator: nvidia-tesla-p100 基于集合的选择方式 selector: matchLabels: component: redis matchExpressions:
  • {key: tier, operator: In, values: [cache]}
  • {key: environment, operator: NotIn, values: [dev]} *** matchLabels 是一个 {key,value} 组成的 map。map 中的一个 {key,value} 条目相当 于 matchExpressions 中的一个元素, 其 key 为 map 的 key,operator 为 In, values 数组则只包含 value 一个元素。 matchExpression 等价于基于集合的选择方式, 支持的 operator 有 In、NotIn、Exists 和 DoesNotExist。当 operator 为 In 或 NotIn 时, values 数组不能为空。 所有的选择条件都以 AND 的形式合并计算,即所有的条件都满足才可以算是匹配。 port:服务(service)端口,k8s服务之间访问端口 nodePort:节点端口,k8s节点所在服务器上的端口 targetPort:容器端口,docker容器端口 namespaces:名称空间的用途是,为不同团队的用户(或项目)提供虚拟的集群空间,也可以用来 区分开发环境/测试环境、准上线环境/生产环境。 名称空间为名称提供了作用域。名称空间内部的同类型对象不能重名,但是跨名称空间可以有同名同类 型对象。名称空间不可以嵌套,任何一个Kubernetes对象只能在一个名称空间中。大部分的 Kubernetes

对象(例如,Pod、Service、Deployment、StatefulSet等)都必须在名称空间里。但是某些更低层级的 对象,是不在任何名称空间中的,例如nodes、persistentVolumes、storageClass等 annotation: 息。Kubernetes 的客户端或者自动化工具可以存取这些信息以实现其自定义的逻辑。 metadata: annotations: deployment.kubernetes.io/revision: 7 # 由Deployment控制器添加,用于记录当前发布的修改次 数 k8s.eip.work/displayName: busybox # Kuboard添加,Deployment显示在Kuboard界面上的名字 k8s.eip.work/ingress: false # Kuboard添加,根据此参数显示Deployment是否配置了 Ingress k8s.eip.work/service: none # Kuboard添加,根据此参数显示Deployment是否配置了 Service 0.5 代表请求半个 CPU 资源。表达式 0.1 等价于表达式 100m,容器的 cpu 限制将也将转换成 millicore 表达式并乘以 100。结果数字是每 100ms 的周期内,该容器可以使用的 CPU 份额 将容器组调度到指定的节点:在 Kubernetes,您可以限定 Pod 只能在特定的节点上运行,或者优先选 择在特定的节点上运行。通常您并不需要这样做,而应该交由 kubernetes 调度程序根据资源使用情 况自动地为 Pod 分配节点。但是少数情况下,这种限定仍然是必要的,例如: 确保某些 Pod 被分配到具有固态硬盘的节点 将相互通信频繁的两个 Pod 分配到同一个高可用区的节点 Kubernetes 一共提供了四种方法,可以将 Pod 调度到指定的节点上,这些方法从简便到复杂的顺序 如下: 指定节点 nodeName 节点选择器 nodeSelector ( Kubernetes 推荐用法 ) Node isolation/restriction Affinity and anti-affinity

page1