官方文档
后台数据库
从逻辑上讲,每个控制器都是一个单独的进程, 但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。
云控制器
在每个节点上运行
代理,保证容器应用都运行在pod中,确保容器运行状态健康。
网络代理,与service相关。允许从集群内部或外部的网络会话与 Pod 进行网络通信
容器运行环境,例如docker。
DNS
和Dashboard
以及Weave Scope
Dashboard 是一个 Kubernetes 的 Web 控制台界面。
Dashboard详细技巧参见这篇博客
Weave Scope
是一个图形化工具, 用于查看你的容器、Pod、服务等。请和一个 Weave Cloud
账号 一起使用, 或者自己运行 UI。
imagePullPolicy:
IfNotPresent
只有当镜像在本地不存在时才会拉取。
Always
每当 kubelet 启动一个容器时,kubelet 会查询容器的镜像仓库, 将名称解析为一个镜像摘要。 如果 kubelet 有一个容器镜像,并且对应的摘要已在本地缓存,kubelet 就会使用其缓存的镜像; 否则,kubelet 就会使用解析后的摘要拉取镜像,并使用该镜像来启动容器。
Never
Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。 更多细节见提前拉取镜像。
如果想强制拉取镜像,可设为Always
策略。
之前测试的时候需要把镜像资源预先拉取到本地才行,可能是因为私有仓库读取镜像时可能需要密钥
,可以通过配置节点向私有仓库进行身份验证解决。
之前一直把容器和镜像等同,但其实容器包含镜像,还包括卷
。
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
Pod (就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个) 容器; 这些容器共享存储
、网络
、以及怎样运行这些容器的声明。
一个pod中的多个镜像组成一个较为完整的项目服务,而不是之前混淆理解的几个pods组成一个完整服务。
Pod 在其生命周期
中只会被调度一次。 一旦 Pod 被调度(分派)到某个节点,Pod 会一直在该节点运行,直到 Pod 停止或者被终止。
容器重启策略
Pod 的 spec 中包含一个 restartPolicy
字段,其可能取值包括 Always
、OnFailure
和 Never
。默认值是 Always
。
restartPolicy 适用于 Pod 中的所有容器。restartPolicy 仅针对同一节点上 kubelet 的容器重启动作。当 Pod 中的容器退出时,kubelet 会按指数回退 方式计算重启的延迟(10s、20s、40s、…),其最长延迟为 5 分钟。 一旦某容器执行了 10 分钟并且没有出现问题,kubelet 对该容器的重启回退计时器执行 重置操作。
Deployment为Pod
和ReplicaSet
提供了一个声明式定义(declarative)方法。典型的应用场景包括:
无状态服务
。
ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。即之前理解的自愈能力
,水平伸缩
。
通过Deployment来管理,不单独直接自定义。
StatefulSet是为了解决有状态服务
的问题(对应Deployments和ReplicaSets
是为无状态服务而设计),其应用场景
包括:
从上面的应用场景可以发现,StatefulSet由以下几个部分组成
:
注意事项
:
更新策略
:
OnDelete
当 StatefulSet 的 .spec.updateStrategy.type
设置为 OnDelete
时, 它的控制器将不会自动更新 StatefulSet 中的 Pod。 用户必须手动删除 Pod 以便让控制器创建新的 Pod,以此来对 StatefulSet 的 .spec.template
的变动作出反应。
RollingUpdate
RollingUpdate
更新策略对 StatefulSet 中的 Pod 执行自动的滚动更新。这是默认的更新策略。
DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:
日志收集,比如fluentd,logstash等
系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond等
系统程序,比如kube-proxy, kube-dns, glusterd, ceph等
Note:被 DaemonSet 控制器创建的 Pod 能够容忍节点的不可调度属性。 DaemonSet 通常提供节点本地的服务,即使节点上的负载应用已经被腾空, 这些服务也仍需运行在节点之上。
Job 会创建一个或者多个 Pods,并将继续重试 Pods 的执行,直到指定数量的 Pods 成功终止。 随着 Pods 成功结束,Job 跟踪记录成功完成的 Pods 个数。 当数量达到指定的成功个数阈值时,任务(即 Job)结束。
分布式训练好像比较适合这种形式,因为之前也看到很多这样处理的。
是 kubelet 和容器运行时之间通信的主要协议,通信相关。
不同的 API 版本代表着不同的稳定性和支持级别。
下面是每个级别的摘要:
Alpha:
Beta:
版本名称包含 beta (例如, v2beta3)。
软件被很好的测试过。启用某个特性被认为是安全的。 特性默认开启。
尽管一些特性会发生细节上的变化,但它们将会被长期支持。
在随后的 Beta 版或稳定版中,对象的模式和(或)语义可能以不兼容的方式改变。 当这种情况发生时,将提供迁移说明。 模式更改可能需要删除、编辑和重建 API 对象。 编辑过程可能并不简单。 对于依赖此功能的应用程序,可能需要停机迁移。
该版本的软件不建议生产使用。 后续发布版本可能会有不兼容的变动。 如果你有多个集群可以独立升级,可以放宽这一限制。
Note: 请试用测试版特性时并提供反馈。特性完成 Beta 阶段测试后, 就可能不会有太多的变更了。
Stable:
Container 中的文件在磁盘上是临时存放的,这给 Container 中运行的较重要的应用程序带来一些问题。
Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题。
相关知识:
持久卷(Persistent Volume),简称PV,是集群中的资源
持久卷请求(PersistentVolumeClaim),简称PVC,是对PV资源的请求。
有些应用程序需要额外的存储,但并不关心数据在重启后仍然可用。 例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢、但对总体性能的影响很小的存储中。
另有些应用程序需要以文件形式注入的只读数据,比如配置数据或密钥。
临时卷就是为此类用例设计的。因为卷会遵从 Pod 的生命周期,与 Pod 一起创建和删除, 所以停止和重新启动 Pod 时,不会受持久卷在何处可用的限制。
临时卷的类型
:
好像挺关键的,但暂不了解。
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。
Pods 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
ConfigMap 将您的环境配置信息和 容器镜像 解耦,便于应用配置的修改。
Caution:
ConfigMap 并不提供保密或者加密功能。 如果你想存储的数据是机密的,请使用 Secret, 或者使用其他第三方工具来保证你的数据的私密性,而不是用 ConfigMap。
Secret 是一种包含少量敏感信息例如密码、令牌或密钥的对象。
Secret 类似于 ConfigMap 但专门用于保存机密数据。
CPU
和内存(RAM)
CPU 资源的约束和请求以 “cpu” 为单位。 在 Kubernetes 中,一个 CPU 等于1 个物理 CPU 核 或者 一个虚拟核, 取决于节点是一台物理主机还是运行在某物理主机上的虚拟机。
你也可以表达带小数 CPU 的请求。 当你定义一个容器,将其 spec.containers[].resources.requests.cpu
设置为 0.5 时, 你所请求的 CPU 是你请求 1.0 CPU 时的一半。 对于 CPU 资源单位,数量 表达式 0.1 等价于表达式 100m,可以看作 “100 millicpu”。 有些人说成是“一百毫核”,其实说的是同样的事情。
memory 的约束和请求以字节为单位。
E、P、T、G、M、k
在 Kubernetes 中,调度 是指将 Pod 放置到合适的 Node 上,然后对应 Node 上的 Kubelet 才能够运行这些 pod。
kube-scheduler
调度流程