共计 4403 个字符,预计需要花费 12 分钟才能阅读完成。
这篇文章给大家介绍的 12 大关键特性分别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
导读:
Kubernetes 如今风靡一时,所有主要的云服务提供商都将其作为部署云原生应用的解决方案。Kubernetes 有哪些显著的特性和工具优势,让企业开始接受它?本文作者给出了系统的梳理。
“Action without orchestration is burn out; orchestration w/o action is management.”
没有编排的行动是完蛋的,没有行动的编排是管理,行动加上编排是领导。
― Orrin Woodward”
Kubernetes 是一种优化资源利用率的抽象概念,它允许跨节点集群高效地进行应用程序分发。
Kubernetes,舵手 !
Kubernetes 是一个希腊语单词,意思是“舵手”。
它是一个由谷歌开始的开源项目,从 Borg 衍生而来,在谷歌内部使用了好几年,现在用于容器管理。目前由 CNCF 托管。
Kubernetes(缩写为 K8S)是一种抽象,它通过容器来优化 CPU 和内存等资源的利用率,从而可以跨多个节点高效地进行应用程序分发。K8S 可以在裸金属或任何云基础设施提供商的任何地方运行。这个新工具是云无关的,聚焦于在基础设施内部部署和调度容器,而不是直接利用节点 / 主机。
K8S 提供的一些平台特性是:
使用 pod 进行容器分组自愈自动伸缩 DNS 管理负载均衡滚动更新或回滚资源监控和日志记录
Kubernetes 架构
Kubernetes 集群由主节点和一组 worker/ 从属节点组成。
Kubernetes 的主节点组成部分是:
API 服务器(API Server):用户通过 Rest 操作或 kubectl cli 与 manifestyaml 交互。它用于所有与 API 对象相关的操作,如 pod 创建,它是在 etcd 中存储所需状态的唯一组件。
调度器(Scheduler):用户使用 kubectl cli 向 API 服务器发出一个命令来创建 pod。在执行此操作之后,调度程序根据资源需求将 pods 分配给可用节点。
控制器管理器(Controller Manager):控制器管理器基于集群状态对资源进行操作,并根据清单 yaml 进行更改,将当前状态应用程序达到所需状态。换句话说,控制器管理器可以将实际状态与所需的状态进行协调。在控制器管理器中有多个专用的控制器,以便简化集群管理。例如,节点控制器检查是否有当前正在运行的节点停机,并采取纠正措施,而复制控制器确保在节点中实际运行所需的 pod 数量。
etcd:所有关于集群状态的配置信息都以 key/value 对的形式存储在 etcd 中,这个组件由 CoreOS 实现。这些状态显示了集群中包含的节点和需要在其中运行的 pods。
插件(Addons):为了将服务器 DNS 记录添加到 Kubernetes,我们需要一个集群 DNS 插件。该插件有助于扩展与 Kubernetes 集群或节点相关的功能。还有许多其他的插件,比如用于日志记录的 fluntd、基于角色访问的 rbac 等等。
安装在 Kubernetes 节点中的组件是:
Docker: Docker 守护进程在每个节点中运行。如果容器镜像不存在,那么它将从 docker 注册中提取并运行。
Kubelet: Kubelet 节点代理定期检查容器内容器的健康状况。此外,它还确保按 manifest 安装卷,并下载运行容器所需的敏感信息。它还将节点链接到 API 服务器。
Kube-proxy: Kube-proxy 在每个节点上运行,以便在 pod 中进行负载分配,并为外部主机提供可用的服务。它使用 iptable 规则或轮询调度来将请求转发到正确的容器。
对于高可用和容错的 Kubernetes 生产和部署,需要多个主节点和一个单独的 etcd 集群。如果运行了三个 API 服务器,则需要一个网络负载平衡器来正确地将负载分配到服务器。唯一剩下的问题是需要三个角色来管理控制器管理器和调度器以维护集群状态和分配节点。为了更高效、更可靠地执行它,只有一个参与者应该执行实际的更改,但是在机器宕机的情况下仍然需要其他实例。为了解决这个问题,我们可以在 API 中使用 lease-lock 来执行主选,而使用它的标志是 leader- elect。
Kubernetes 通过以下任一种方式实现从 Pod 到 Pod 的联网:
1)第 2 层 (切换解决方案)2) 第 3 层(桥接解决方案)3) overlay 解决方案(weave andflannel)
它们允许在集群中进行 Pod 和 Pod 之间的通信,并为每个 Pod 提供唯一的 IP 地址。
Kubernetes 关键特性
Pod: Collection of Containers 容器集
pod 是 K8S 中的一个部署单元,它有一个单独的 IP 地址。在它内部,Pause 容器通过持有一个网络的名称空间、端口和 ip 地址来处理网络,而这个地址又被 pod 中的所有容器使用。
ReplicationController
ReplicationController 确保在给定的时间内启动和运行所需的容器数量。Pod 模板用于定义容器镜像标识符、端口和标签。使用 liveness probes,它可以自动治愈 pods,并按照期望的状态维持 pods 数量。也可以通过使用 kubectl 来手动控制副本计数。
存储管理
Pods 本质是短暂的——任何储存在 pod 或容器中的信息都会丢失。为了存储数据,一个持久的系统是必需的,即使在一个 pod 被杀死或重新调度之后,如 Amazon Elastic Block Storage (EBS),谷歌 GCE PD,或一个分布式文件系统,如网络文件系统 (NFS) 或 Gluster 文件系统(GFS)。
资源监控
监控是成功运行基础设施的关键之一,它是可靠性等级的基础。Heapster 是一个从 kubelet 收集指标的插件,与 cAdvisor 集成。cAdvisor 用于收集与运行容器的 CPU、内存、I/ O 和网络统计数据相关的指标。由 Heapster 收集的数据存储在 influx DB 中,并使用 Grafana 在 UI 中显示。还有其他可使用的接收器,如 Kafka 或 Elastic Search,可以用于存储数据并显示在用户界面中。
健康检查
kubernetes 的健康检查由 kubelet 代理完成。它分为 liveness 和 readiness probes 两种。
处理程序主要有三种类型:
ExecAction: 执行 Shell 命令,如果生成的退出代码为 0,则意味着实例是健康的。在任何其他情况下,实例不健康。TCPAction: Kubelet 将尝试连接到指定的端口,如果它建立到给定 socket 的连接,诊断成功。HTTPGetAction: 基于应用程序公开的 HTTP 端点,kubelet 对指定路径上的容器 IP 地址执行 HTTP GET 请求,如果返回 200 到 300 个响应代码,诊断就成功了。
每个 probe 通常有三个结果:
成功: 容器通过诊断。失败: 容器未通过诊断。未知: 诊断失败,不要采取任何行动。
水平自动伸缩功能
自动伸缩使用基于负载的计算资源。K8S scale pod 自动使用 Horizontal Pod Autoscaler 对象,从 Heapster 获取度量数据,并相应地减少或增加 pod 的数量。例如,如果自动伸缩是基于内存利用率,那么控制器就会开始在 pod 中观察内存使用情况,并根据容量对该副本计数进行扩展。
服务发现
Kubernetes pods 是短暂的,ReplicationController 在任何节点上动态创建它们,因此在集群中发现服务是一个挑战。服务需要发现一个 IP 地址和动态的端口,以便在集群中进行通信。
有两种主要的方法来找到它——环境变量(Environment variables)和 DNS。
更可取的是基于 DNS 的服务发现,它可以作为集群附加组件使用。跟踪集群中的新服务,并为每个服务创建一组 DNS 记录。
网络
要完全管理集群,必须正确设置网络,并解决三个网络问题:
1.容器到容器的通信:pods 通过本地主机通信,并使用 Pause 容器网络名称空间,解决这个问题。2.Pod-to-Pod 通信:由软件定义的网络解决,如上面架构图所示。3.外部到 pod 通信:由服务覆盖。
Kubernetes 提供了广泛的网络选择。现在还支持容器网络接口 (CNI) 插件,这是容器的通用插件架构。目前支持多种编排工具,如 Kubernetes、Mesos 和 CloudFoundry。
有各种覆盖插件:
1.Flannel 来自 CoreOS,是一个非常简单的 etcd 后端覆盖网络。它创建了另一个虚拟的、可路由的 IP / Pod 网络,运行在底层网络之上;ergo,称为覆盖网络。在这个覆盖网络中,每个 Pod 将被分配一个 IP 地址,并且会直接使用它们的 IP 进行通信。2.Weave 通过 CNI 插件提供与 Kubernetes 兼容的覆盖网络。
服务
Kubernetes 服务是一种抽象,它将通信路由到一组 pod,以提供一个微服务。Kube-proxy 在每个节点上运行,并通过设置一组 iptable 规则来管理服务。
设立服务的模式有三种:
1.ClusterIP(只提供内部访问)2.NodePort(需要在端口上打开防火墙; 不建议公开访问)3. 负载均衡器(由 AWS 或 GKE 等公有云供应商拥有)
ConfigMap 和 Secret
ConfigMap 使注入基于环境的配置成为可能,同时使容器镜像在多个环境中保持一致。这些可以通过安装卷或环境变量(environment variables)来注入,并将这些值存储在 key/value 格式中。
Secrets 用于存储敏感数据,如密码、OAuth 令牌等。
滚动部署和回滚
部署对象持有一个或多个副本集,以支持回滚机制。换句话说,每次更改部署配置时都会创建一个新的副本集,并保留以前的版本,以便有回滚选项。只有一个副本集将在特定时间处于活动状态。
对于滚动部署,需要的策略类型是 RollingUpdate 和 minReadySecs,它指定应用程序为服务流量所花费的时间。如果在应用程序 pod 还没有准备好时,将其保持默认状态,它将不可用。这个动作可以通过以下命令来完成:
或者,
通过替换部署 yaml 文件中的内容并运行以下命令:
如果新版本不像预期的那样,那么可以通过运行以下命令回滚到以前的版本:
如果所需版本是前一版本以外的版本,则运行:
Logging 记录
要监视应用程序的行为,必须检查日志——每个 pod 生成多个日志。要开始在仪表板 UI 中搜索日志,必须有一些机制收集并将它们聚合到一个日志查看器中。为了说明这一点,Fluentd 是一个开源工具,也是 CNCF 的一部分,与 Elastic Search 和 Kibana 完美结合。
关于的 12 大关键特性分别是什么就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。