Kubernetes 是一个基于容器技术的分布式系统支撑平台。是谷歌开源的容器集群管理系统。在 Docker 技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性。并且具有完备的集群管理能力,多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制以及多粒度的资源配额管理能力。
Kubeadm是一个快捷搭建 k8s 集群的安装工具,它提供了kubeadm init 以及 kubeadm join这两个命令。
minikube 是一个可以在本地运行一个单节点 k8s 集群的工具。
kubeadm、二进制、minikube
优势:容器编排、轻量级、开源、弹性伸缩、负载均衡
常见场景:快速部署应用、快速扩展应用、无缝对接新的应用功能、节省优化硬件资源使用
特点:可移植(支持公有云、私有云、混合云、多重云)、可扩展(模块化、插件化、可挂载、可组合)、自动化(自动部署、自动重启、自动复制、自动扩展)。
缺点:安装过程和配置相对困难复杂、管理服务相对繁琐、运行和编译需要很多时间、比其他替代品更昂贵、对于简单应用程序来说可能不需要使用 k8s 即可满足。
k8s 集群的管理节点,负责管理集群,提供集群的资源数据访问入口。拥有 etcd 存储服务,运行 kube-apiserver、kube-controller-manager 和 kube-scheduler 进程。
k8s 集群中运行 Pod 的服务节点,用来承载被分配的 Pod 的运行,是 Pod 运行的宿主机。运行容器运行时、kubelet 和 负载均衡器 kube-proxy。
操作 k8s 集群的命令行工具。
作为 k8s 系统的入口,封装了核心对象的增删改查操作,以 RESTful API 接口方式提供给外部客户和内部组件调用,集群内各个功能模块之间数据交互和通信的中心枢纽。
是一个守护进程,包括一系列控制 k8s 集群的控制器:
负责监视新创建的、未指定 Node 节点的 Pod,并选择节点来让 Pod 在上面运行。
是兼顾一致性与高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。
在 k8s 集群中的每个 Node 节点上运行,它保证容器都运行在 Pod 中。
kube-proxy 维护节点上的一些网络规则, 这些网络规则会允许从集群内部或外部的网络会话与 Pod 进行网络通信。如果操作系统提供了可用的数据包过滤层,则 kube-proxy 会通过它来实现网络规则。 否则,kube-proxy 仅做流量转发。
在 Kubernetes 上运行的应用程序。包括 Pod、Deployment、ReplicaSet、StatefulSet、DaemonSet、Job、CronJob。
Pod是在K8s集群中运行部署应用或服务的最小单元。表示集群上一组正在运行的容器。
可能处于的状态(phase)有:
Pending:API Server 已经创建该 Pod,且 Pod 内还有一个或多个容器的镜像没有创建。
Running:Pod 内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态。
Succeeded:Pod 内所有容器均成功执行退出,且不会重启。
Failed:Pod 内所有容器均已退出,但至少有一个容器为退出失败状态。
Unknown:由于某种原因无法获取该 Pod 状态。
Pod 状况(PodConditions):
PodScheduled:Pod 已经被调度到某节点
ContainersReady:Pod 中所有容器都已就绪
Initialized:所有 Init 容器都已成功完成
Ready:Pod 可以为请求提供服务,并且应该被添加到对应服务的负载均衡池中
创建流程:
1. 用户提交创建 Pod 的请求。
2. kube-apiserver 处理用户请求并存储 Pod 数据到 etcd(create Pod)。
3. kube-scheduler 通过 watch 机制从 kube-apiserver 获取到新 Pod 的信息。通过调度算法为 Pod 绑定 Node,调度算法包括 Predicate(过滤)、Priority(打分),把结果存到 etcd(bind Pod)。
4. 选定好的 Node 节点的 kubelet 通过 watch 获取到了 Pod 数据,并开始调用 CNI 接口创建容器网络、调用 CRI 接口部署容器、调用 CSI 接口挂载存储卷,存储 update pod status。
重启策略(Restart Policy):
Always(默认):当容器失效时,由 kubelet 自动重启该容器
OnFailure:当容器终止运行且退出码不为 0 时,由 kubelet 自动重启该容器
Never:不论容器运行状态如何,kubelet 都不会重启该容器
健康检查探针:
livenessProbe:
指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器,并且容器将根据其 restartPolicy 决定接下来的操作。如果容器不提供存活探针,则默认状态为 Success。
readinessProbe:
指示容器是否准备好为请求提供服务。如果就绪态探测失败,端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。初始延迟之前的就绪态的状态值默认为 Failure。如果容器不提供 readinessProbe,则默认状态为 Success。
startupProbe:
指示容器中的应用是否已经启动。如果提供了 startupProbe,则所有其他探针都会被禁用,直到此探针成功为止。如果启动探测失败,kubelet
将杀死容器,而容器依其 restartPolicy 进行重启。如果容器没有提供 startupProbe,则默认状态为 Success。
检查机制:
exec:
在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
gRPC:
使用 gRPC 执行一个远程过程调用。 目标应该实现 gRPC 健康检查。如果响应的状态是 "SERVING",则认为诊断成功。gRPC 探针是一个 alpha 特性,只有在你启用了 "GRPCContainerProbe" 特性门控时才能使用。
httpGET:
对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。
TCP Socket:
对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。 如果远程系统(容器)在打开连接后立即将其关闭,这算作是健康的。
Pod 调度方式:
NodeSelector:定向调度,当需要手动指定将 Pod 调度到特定的 Node 上时,可以通过 Node 的标签(label)和 Pod 的 nodeSelector 属性相匹配。
NodeAffinity:亲和性调度,有两种方式,第一种是 requiredDuringSchedulingIgnoredDuringExecution: 必须满足指定的规则,才能调度成功。第二种是 preferredDuringSchedulingIgnoredDuringExecution:优先调度至满足的 Node,但不强求,多个优先级规则还可以设置权重值。
Taint:使 Node 拒绝特定 Pod 运行
Toleration:Pod 的属性,表示 Pod 能容忍标注了 Taint 的 Node。
ReplicaSet 是 Replication Controller 的替代者。ReplicaSet 就像 ReplicationController 那样,确保一次运行指定数量的 Pod 副本。ReplicaSet 支持新的基于集合的选择器需求,而 ReplicationController 只支持基于权限的选择器需求。
Deployment 是管理 Pod 副本的 API 对象,通常通过运行没有本地状态的 Pod 来实现。在内部使用 ReplicaSet 来实现管理 Pod 的目的。
更新过程:
系统创建一个新的 ReplicaSet,将其 Pod 副本数量扩展到 1 ,然后将旧的 ReplicaSet 的副本数量缩减为 2。之后对新旧两个 ReplicaSet 的 Pod 副本数进行逐个调整。最后,新的 ReplicaSet 运行了符合用户需求的数量的 Pod 副本,旧的 ReplicaSet 中的副本数量缩减为 0。
更新策略(spec.stradegy.type):
RollingUpdate(默认值):以滚动更新的方式来逐个更新 Pod,可以设置 spec.stradegy.rollingUpdate 的两个参数(maxUnavailable、maxSurge)来控制过程。
maxUnavailable(最大不可用):更新过程中不可用的 Pod 数量上限,可以是绝对数字也可以是百分比。
maxSurge(最大峰值):可以创建的超出期望 Pod 个数的 Pod 数量,可以是绝对数字也可以是百分比。
StatefulSet 用来管理某 Pod 集合的部署和扩缩, 并为这些 Pod 提供持久存储和持久标识符。
和 Deployment 类似, StatefulSet 管理基于相同容器规约的一组 Pod。但和 Deployment 不同的是,StatefulSet 为它们的每个 Pod 维护了一个有粘性的 ID。这些 Pod 是基于相同的规约来创建的,但是不能相互替换:无论怎么调度,每个 Pod 都有一个永久不变的 ID。
如果希望使用存储卷为工作负载提供持久存储,可以使用 StatefulSet 作为解决方案的一部分。 尽管 StatefulSet 中的单个 Pod 仍可能出现故障, 但持久的 Pod 标识符使得将现有卷与替换已失败 Pod 的新 Pod 相匹配变得更加容易。
StatefulSet 用于支持部署有状态服务。
用来部署系统守护进程,例如日志搜集和监控代理,这些进程通常必须运行在每个节点上。
Job 是需要运行完成的确定性的或批量的任务。Job 创建一个或多个 Pod 对象,并确保指定数量的 Pod 成功终止。随着各 Pod 成功结束,Job 会跟踪记录成功完成的个数。
管理定期运行的任务。
将运行在一组 Pod 上的应用程序暴露为网络服务的抽象方法。Pod 通常由 selector 决定。
类型:
ClusterIP(默认):通过集群的内部 IP 暴露服务,选择该值时服务只能够在集群内部访问。
NodePort:通过每个节点的 IP 和静态端口(NodePort)暴露服务,可以从集群外部访问。
LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。
ExternalName:通过返回 CNAME 和对应值,可以将服务映射到 externalName 字段的内容(例如,foo.bar.example.com
)。 无需创建任何类型代理。
包含可被 Pod 中容器访问的数据的目录。每个 Kubernetes 卷在所处的 Pod 存在期间保持存在状态。 因此,卷的生命期会超出 Pod 中运行的容器,并且保证容器重启之后仍保留数据。
代表集群中一块存储空间的 API 对象。它是通用的、可插拔的、并且不受单个 Pod 生命周期约束的持久化资源。持久卷(PersistentVolumes,PV)提供了一个 API,该 API 对存储的供应方式细节进行抽象,令其与使用方式相分离。在提前创建存储(静态供应)的场景中,PV 可以直接使用。在按需提供存储(动态供应)的场景中,需要使用 PersistentVolumeClaim (PVC)。
阶段:
Available:空闲资源,尚未绑定任何 PVC
Bound:已绑定到某 PVC
Released:PVC 已删除,但 PV 尚未被集群回收
Failed:自动回收操作失败
申领 PV 中定义的存储资源,以便可以将其挂载为容器中的卷。指定存储的数量,确定如何访问存储(只读、读写或独占)以及如何回收存储(保留、回收或删除)。存储本身的详细信息在 PV 对象中。
对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
Always:镜像标签为 latest 时,总是从指定的仓库中获取镜像
Never:禁止从仓库中下载镜像,只能使用本地镜像
IfNotPresent:仅当本地没有对应镜像时,才从目标仓库中下载。
为在 Pod 中运行的进程提供标识。当 Pod 中的进程访问集群时,API 服务器将它们作为特定的服务帐户进行身份验证,创建 Pod 时,如果你没有指定服务帐户,它将自动被赋予同一个 namespace 中的 default 账户。
管理授权决策,允许管理员通过 kube-apiserver 动态配置访问策略。RBAC 使用角色 (包含权限规则)和角色绑定 (将角色中定义的权限授予一组用户)。
Secret 用于存储敏感信息,如密码、 OAuth 令牌和 SSH 密钥。Secret 允许用户对如何使用敏感信息进行更多的控制,并减少信息意外暴露的风险。默认情况下,Secret 值被编码为 base64 字符串并以非加密的形式存储,但可以配置为静态加密。Pod 通过挂载卷中的文件的方式引用 Secret,或者通过 kubelet 为 Pod 拉取镜像时引用。Secret 非常适合机密数据使用,而 ConfigMap 适用于非机密数据。
ConfigMap 是一种 API 对象,用来将非机密性的数据保存到键值对中。使用时,Pod 可以将其用作环境变量、命令行参数或者存储卷中的配置文件。
Pod 水平自动扩缩器是一种 API 资源,它根据目标 CPU 利用率或自定义度量目标扩缩 Pod 副本的数量。HPA 通常用于 Replication Controller 、Deployment 或者 ReplicaSet 上。HPA 不能用于不支持扩缩的对象,例如 DeamonSet。
负责运行容器的软件。
容器运行时接口 (CRI) 是一组与节点上 kubelet 集成的容器运行时 API。
容器网络接口 (CNI) 插件是遵循 appc/CNI 协议的一类网络插件。
容器存储接口 (CSI) 定义了存储系统暴露给容器的标准接口。
cAdvisor (Container Advisor) 为容器用户提供对其运行中的容器的资源用量和性能特征的知识。cAdvisor 是一个守护进程,负责收集、聚合、处理并输出运行中容器的信息。具体而言,针对每个容器,该进程记录容器的资源隔离参数、历史资源用量、完整历史资源用量和网络统计的直方图。这些数据可以按容器或按机器层面输出。