[TOC] 自动扩缩容 https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale # Lifecycle(生命周期) > 官网:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/ > 官网:https://kubernetes.io/docs/concepts/workloads/pods/pod/ # 介绍 * Pod是K8s集群中运行部署应用或服务的最小单元 * Pod用于存放一组 container(包含一个或多个 container 容器),以及这些 container (容器)的一些共享资源。这些资源包括: * 共享存储(Volumes) * 网络,每个Pod在集群中有唯一的IP,Pod中容器共享该IP地址 * 容器基本信息 * 支持多容器。Pod支持多个容器在一个Pod中共享网络地址和文件系统,可以通过进程间通信和文件共享方式组合完成服务。 * Pod是K8s集群中所有业务类型的基础,主要业务类型如下 | 类型 | 说明 | Pod | | --- | --- | --- | | long-running |长期伺服型 | Deployment | | batch | 批处理型 | Job | | node-daemon | 节点后台支撑型 | DaemonSet | | stateful application |有状态应用型 | PetSet | :-: ![](https://img.kancloud.cn/62/df/62df08a9be324689a1380a3c23d749b7_353x353.png) # Pod使用 Pod主要支持位于同一位置的、共同管理的工具程序: * 内容管理系统、文件和数据加载器、本地缓存管理器等。 * 日志和检查点备份、压缩、旋转、快照等。 * 数据更改监视器、日志跟踪器、日志和监视适配器、事件发布器等。 * 代理、桥接器和适配器 * 控制器、管理器、配置器和更新器 # Labels标签和选择器 > Label官网:https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ * 标签是附加到Kubernetes对象上的键值对 * 标签用于用户指定对象的标识属性 * 标签可以在创建是附加到对象,也可以随时添加和修改 * 每个对象都一个定义***一组*键/值标签** * 每个键对应给定对象必须唯一 * 将标签索引和反向索引,用于高效查询和监视 ```json "metadata": { "labels": { "key1" : "value1", "key2" : "value2" } } ``` ## 示例标签 * `"release" : "stable"`,`"release" : "canary"` * `"environment" : "dev"`,`"environment" : "qa"`,`"environment" : "production"` * `"tier" : "frontend"`,`"tier" : "backend"`,`"tier" : "cache"` * `"partition" : "customerA"`,`"partition" : "customerB"` * `"track" : "daily"`,`"track" : "weekly"` ## 语法和字符集 * 标签 * *标签*是键值对。有效的标签键有两个段: * 可选的前缀和名称,用斜杠(`/`)分隔。 * 名称段是必需的,必须小于等于 63 个字符,以字母数字字符(`[a-z0-9A-Z]`)开头和结尾,带有破折号(`-`),下划线(`_`),点(`.`)和之间的字母数字。 * 前缀是可选的。如果指定,前缀必须是 DNS 子域:由点(`.`)分隔的一系列 DNS 标签,总共不超过 253 个字符,后跟斜杠(`/`)。 * 如果省略前缀,则假定标签键对用户是私有的。 * 向最终用户对象添加标签的自动系统组件(例如`kube-scheduler`,`kube-controller-manager`,`kube-apiserver`,`kubectl`或其他第三方自动化)必须指定前缀。 * `kubernetes.io/`前缀是为 Kubernetes 核心组件保留的。 * 标签值 * 有效标签值必须为 63 个字符或更少 * 必须为空或以字母数字字符(`[a-z0-9A-Z]`)开头和结尾,中间可以包含破折号(`-`)、下划线(`_`)、点(`.`)和字母或数字。 ## 标签选择器 * 标签不提供唯一性 * 多个对象会携带相同标签 * 通过 _标签选择器_,客户端/用户可以识别一组对象。标签选择器是 Kubernetes 中的核心分组原语 * API 目前支持两种类型的选择器:*基于相等性的*和 _基于集合的_ * 标签选择器可以由逗号分隔的多个*需求*组成。在多个需求的情况下,必须满足所有要求,因此逗号分隔符充当逻辑 _与_(`&&`)运算符 * **空标签选择器**(即,需求为零的选择器)选择集合中的每个对象 * null 值的标签选择器(仅可用于可选选择器字段)不选择任何对象 > 两个控制器的标签选择器不得在**命名空间内重叠**,否则它们将互相冲突 ### 基于相等性的需求 * *基于相等性*或*不相等*的需求允许按标签**键和值**进行过滤 * 匹配对象必须满足所有指定的标签约束 * 运算符有`=`(相等)、`==`(相等)和`!=`(不相等)三种 * 支持 *基于相等性*需求的选择器的对象有`Service`和`ReplicationController` * 基于相等性的标签要求的使用场景如Pods要指定节点选择标准 ```yaml # Pod选择带有标签accelerator: nvidia-tesla-p100的节点 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 ``` #### 举例 ``` environment = production tier != frontend ``` * `environment = production`选择所有资源,其键名等于`enviromment`,值等于`production` * `tier != frontend`选择键名等于`tier`,值不等于`frontend`的所有资源 * 使用逗号运算符过滤`production`环境中的非`frontend`层资源`environment=production,tier!=frontend` ### 基于集合的需求 * *基于集合*的标签需求允许您通过一组值来过滤键 * 支持三种操作符:`in`,`notin`,`exists`(只能用于建标识符上) * *基于集合*的要求可以与基于*相等*的要求混合使用,如`partition in (customerA, customerB),environment!=qa` * 支持 *基于集合的*需求的对象有`Job`、`Deployment`、`Replica Set`、`Daemon Set` #### 举例 ``` environment in (production, qa) tier notin (frontend, backend) partition !partition ``` * `environment in (production, qa)`选择所有键等于 `environment`并且值等于`production`或`qa`的资源 * `tier notin (frontend, backend)`选择所有键等于`tier`并且值不等于`frontend`或`backend`的资源,**以及所有没有`tier`键标签的资源** * `partition`选择所有包含`partition`标签的资源,对值未校验 * `!partition`选择所有没有`partition`标签的资源,对值未校验 ### Label API `kubectl get pods -l environment=production,tier=frontend`等同于`kubectl get pods -l 'environment in (production),tier in (frontend)'` `kubectl get pods -l 'environment in (production, qa)'` ### 在API对象上设置引用 #### 基于相等性需求的资源 * 支持的对象`Service`、`ReplicationController` * 两个对象的标签选择器都是在`json`或者`yaml`文件中使用映射定义 ```json "selector": { "component" : "redis", } ``` 或者 ```yaml selector: component: redis ``` #### 基于集合需求的资源 * 支持的对象,`Job`、`Deployment`、`Replica Set`、`Daemon Set` ```yaml selector: matchLabels: component: redis matchExpressions: - {key: tier, operator: In, values: [cache]} - {key: environment, operator: NotIn, values: [dev]} ``` * `matchLabels`是由`{key,value}`对组成的映射 * `matchLabels`映射中的单个`{key,value }`等同于`matchExpressions`的元素,其`key`字段为 “key”,`operator`为 “In”,而`values`数组仅包含 “value” * `matchExpressions`是 pod 选择器要求的列表 * 有效的运算符包括 In,NotIn,Exists 和 DoesNotExist。**在 In 和 NotIn 的情况下,设置的值必须是非空的** * 来自`matchLabels`和`matchExpressions`的所有要求都是合在一起 – 它们必须都满足才能匹配 # Pod归类 Pod通过Label将相同或者有关联的Pod归为一类 :-: ![](https://img.kancloud.cn/92/d6/92d61fa92a78aac0b8806979945aea89_824x409.png)