在 Kubernetes 系统中, Pod 的管理对象 RC、Deployment、DaemonSet 和 Job 都面向 无状态的服务。但现实中很多服务是有状态的,特别是一些复杂的中间件集群,例如 MySQL 集群、MongoDB 集群、Akka 集群、ZooKeeper 集群等,这些 应用集群 有 4 个共同点:每个节点都有固定的身份 ID,通过这个 ID,集群中的成员可以相互发现并通信;集群的规模是比较固定的,集群规模不能随意变动集群中的每个节点都是有状态的,通常会持久化数据到永久存储中如果磁盘损坏,则集群里的某个节点无法正常运行,集群功能受损。Pod 命名规则注意,通过 RC 或者 Deployment 创建的 Pod 不是完全固定的:通过 RC 创建的 Pod命名为:<rc-name>-xxxxRC 名称是固定部分xxxx 是随机生成的字符串当 Pod 被删除重建时,随机字符串会改变通过 Deployment 创建的 Pod命名为:<deployment-name>-<replicaset-hash>-xxxxdeployment-name
分布式系统要能够根据当前负载的变化 自动 触发水平扩容或缩容,因为这一过程可能是频繁发生的、不可预料的,所以手动控制的方式是不现实的。HPA 与 RC、Deployment 一样,也属于一种 Kubernetes 资源对象。HPA 实现原理通过追踪分析指定 RC 控制的所有目标 Pod 的负载变化情况,来确定是否需要有针对性地调整目标 Pod 的副本数量。HPA 有以下两种方式作为 Pod 负载的度量指标:CPUUtilizationPercentage一个算术平均值,即 目标 Pod 所有副本自身的 CPU 利用率的平均值。一个 Pod 自身的 CPU 利用率是该 Pod 当前 CPU 的使用量 除以 它的 Pod Request 的值eg. 定义一个 Pod 的 Pod Request = 0.4,当前 Pod 的 CPU 使用量为 0.2,那么它的 CPU 使用率是 50%这样可以算出一个 RC 控制的所有 Pod 副本的 CPU 利用率的算术平均值了如果某一时刻 CPUUtilizationPercentage 的值超过 80%,则意味着 当前 Pod 副本数很可能不足以支撑接
Deployment 配置定义文件内容spec 是 Kubernetes YAML 文件中最重要的字段之一,它定义了资源的期望状态(desired state)。对于 Deployment 来说,spec 包含了以下关键配置:apiVersion: apps/v1 # 更新到当前推荐的 API 版本 kind: Deployment metadata: name: frontend spec: # 定义了资源的期望状态 replicas: 1 # Pod 副本数量 selector: # 选择器,用于识别哪些 Pod 是属于这个 Deployment 的 matchLabels: # 简化选择器配置 tier: frontend template: # Pod 模板,定义 Pod 的配置 metadata: labels: # Pod 的标签 app: app-demo tier: frontend spec: # Pod 的详细规格 containers: #
Label一个 Label 是一个 key=value 的键值对,key value 用户自己制定Label 可以背附加到各种资源对象上,如 Node、Pod、Service、RC 等。资源对象和 Label 是多对多的关系通过给指定的资源对象捆绑一个或多个的 Label 实现多维度的资源分组管理功能,以便灵活、方便地进行资源分配、调度、配置、部署等管理工作。常见的 Label:版本标签:"release": "stable"、"release": "canary"环境标签:"environment":"dev"、"environment":"qa"、"environment":"production"架构标签:"tier":"frontend"、"tier":"backend"、"tier"
资源对象Node、Pod、Replication Controller、Service 等都可以被看做一种资源对象,几乎所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具 (或 API 变成调用)执行增删改查等操作,并将其保存在 etcd 中持久化存储。所以,Kubernetes 其实是一个高度自动化的资源控制系统,他通过跟踪对比 etcd 库里保存的 “资源期望状态” 与 当前环境中的 “实际资源状态” 的差异来实现自动控制盒自动纠错的高级功能。在声明一个 Kubernetes 资源对象的时候,有一个关键属性 apiVersion ,以下面的 Pod 声明为例:apiVersion: v1 kind: Pod metadata: name: myweb labels: name: myweb spec: containers: - name: myweb image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080Kubernete
糖呀糖 xyz
我们谈论生活,讨论技术,借由文字,抵达心灵。