基于云原生的周边工具
Kubernetes 还为我们提供了一个非常重要的资源对象可以用来暴露服务给外部用户,那就是 Ingress
。对于小规模的应用我们使用 NodePort 或许能够满足我们的需求,但是当你的应用越来越多的时候,你就会发现对于 NodePort 的管理就非常麻烦了,这个时候使用 Ingress 就非常方便了,可以避免管理大量的端口。
Ingress 其实就是从 Kuberenets 集群外部访问集群的一个入口,将外部的请求转发到集群内不同的 Service 上,其实就相当于 nginx、haproxy 等负载均衡代理服务器,可能你会觉得我们直接使用 nginx 就实现了,但是只使用 nginx 这种方式有很大缺陷,每次有新服务加入的时候怎么改 Nginx 配置?不可能让我们去手动更改或者滚动更新前端的 Nginx Pod 吧?那我们再加上一个服务发现的工具比如 consul 如何?貌似是可以,对吧?Ingress 实际上就是这样实现的,只是服务发现的功能自己实现了,不需要使用第三方的服务了,然后再加上一个域名规则定义,路由信息的刷新依靠 Ingress Controller 来提供。
Ingress Controller 可以理解为一个监听器,通过不断地监听 kube-apiserver,实时的感知后端 Service、Pod 的变化,当得到这些信息变化后,Ingress Controller 再结合 Ingress 的配置,更新反向代理负载均衡器,达到服务发现的作用。其实这点和服务发现工具 consul、 consul-template 非常类似。
ingress flow
现在可以供大家使用的 Ingress Controller 有很多,比如 traefik、nginx-controller、Kubernetes Ingress Controller for Kong、HAProxy Ingress controller,当然你也可以自己实现一个 Ingress Controller,现在普遍用得较多的是 traefik 和 nginx-controller,traefik 的性能较 nginx-controller 差,但是配置使用要简单许多,我们这里会重点给大家介绍 nginx-controller 的使用。
https://cloud.tencent.com/developer/article/1761376
NGINX Ingress Controller 是使用 Kubernetes Ingress 资源对象构建的,用 ConfigMap 来存储 Nginx 配置的一种 Ingress Controller 实现。
要使用 Ingress 对外暴露服务,就需要提前安装一个 Ingress Controller,我们这里就先来安装 NGINX Ingress Controller,由于 nginx-ingress 所在的节点需要能够访问外网,这样域名可以解析到这些节点上直接使用,所以需要让 nginx-ingress 绑定节点的 80 和 443 端口,所以可以使用 hostPort 来进行访问,当然对于线上环境来说为了保证高可用,一般是需要运行多个 nginx-ingress 实例的,然后可以用一个 nginx/haproxy 作为入口,通过 keepalived 来访问边缘节点的 vip 地址。
“所谓的边缘节点即集群内部用来向集群外暴露服务能力的节点,集群外部的服务通过该节点来调用集群内部的服务,边缘节点是集群内外交流的一个 Endpoint。“
URL rewrite
NGINX Ingress Controller 很多高级的用法可以通过 Ingress 对象的 annotation
进行配置,比如常用的 URL Rewrite 功能,比如我们有一个 todo 的前端应用,代码位于 https://github.com/cnych/todo-app,直接部署这个应用进行测试:
Basic Auth
同样我们还可以在 Ingress Controller 上面配置一些基本的 Auth 认证,比如 Basic Auth,可以用 htpasswd 生成一个密码文件来验证身份验证
灰度发布
在日常工作中我们经常需要对服务进行版本更新升级,所以我们经常会使用到滚动升级、蓝绿发布、灰度发布等不同的发布操作。而 ingress-nginx
支持通过 Annotations 配置来实现不同场景下的灰度发布和测试,可以满足金丝雀发布、蓝绿部署与 A/B 测试等业务场景。ingress-nginx 的 Annotations 支持以下 4 种 Canary 规则:
nginx.ingress.kubernetes.io/canary-by-header
:基于 Request Header 的流量切分,适用于灰度发布以及 A/B 测试。当 Request Header 设置为 always 时,请求将会被一直发送到 Canary 版本;当 Request Header 设置为 never时,请求不会被发送到 Canary 入口;对于任何其他 Header 值,将忽略 Header,并通过优先级将请求与其他金丝雀规则进行优先级的比较。nginx.ingress.kubernetes.io/canary-by-header-value
:要匹配的 Request Header 的值,用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务。当 Request Header 设置为此值时,它将被路由到 Canary 入口。该规则允许用户自定义 Request Header 的值,必须与上一个 annotation (即:canary-by-header) 一起使用。nginx.ingress.kubernetes.io/canary-weight
:基于服务权重的流量切分,适用于蓝绿部署,权重范围 0 - 100 按百分比将请求路由到 Canary Ingress 中指定的服务。权重为 0 意味着该金丝雀规则不会向 Canary 入口的服务发送任何请求,权重为 100 意味着所有请求都将被发送到 Canary 入口。nginx.ingress.kubernetes.io/canary-by-cookie
:基于 cookie 的流量切分,适用于灰度发布与 A/B 测试。用于通知 Ingress 将请求路由到 Canary Ingress 中指定的服务的cookie。当 cookie 值设置为 always 时,它将被路由到 Canary 入口;当 cookie 值设置为 never 时,请求不会被发送到 Canary 入口;对于任何其他值,将忽略 cookie 并将请求与其他金丝雀规则进行优先级的比较。总的来说可以把以上的四个 annotation 规则划分为以下两类:
kube-vip 是一个为 Kubernetes 集群内部和外部提供高可用和负载均衡的开源项目。
kube-vip 支持以静态 Pod 的形式运行在 Control Plane 节点上,这样就可以不需要部署 HAProxy + Keepalived 等传统的 LB 来保证高可用。
kube-vip 静态 Pod 通过 ARP 会话来识别每个节点上的其他主机,我们可以选择 BGP 或 ARP 来设置负载平衡器。在 ARP 模式下,会选出一个领导者,这个节点将继承虚拟 IP 并成为集群内负载均衡的 Leader,而在 BGP 模式下,所有节点都会通知 VIP 地址。
通过把 kube-vip 静态 Pod 的 yaml 文件配置到 cloud-init 的脚本中,当 cloud-init 命令执行的时候会把 kube-vip yaml 的相关内容写入到 control plane 节点机器上的 /etc/kubernetes/manifests/kube-vip.yaml 文件中。kubeadm 部署 control plane 节点的过程,在启动静态 Pod 的阶段,就会启动 kube-vip 服务
CAPI 通过 MHC 为集群定义节点故障替换信息,由 KCP 和 MD/MS 配合完成故障节点的替换工作
云原生可划分为容器与容器编排、应用开发与部署、服务治理、可观测性等领域,每个领域一般有多种实现方案,云原生平台可以理解为是多个领域的有机整合。与此相似,Kubernetes 也可划分多个领域,网络、存储、容器,每个领域都有标准(CNI、CSI、CRI 等)和不同的实现方案。CAPI 有多种 Provider,每种 Provider 可以有多种实现。
kubefwd 是一个用于端口转发Kubernetes中指定namespace下的全部或者部分pod的命令行工具。 kubefwd 使用本地的环回IP地址转发需要访问的service,并且使用与service相同的端口。 kubefwd 会临时将service的域条目添加到 /etc/hosts
文件中
安装
brew install txn2/tap/kubefwd
kubefwd 默认你已经安装了 kubectl 工具并且也已经设置好了访问Kubernetes集群的配置文件。kubefwd 使用 kubectl 的上下文运行环境. kubectl 工具并不会用到,但是它的配置文件会被用来访问Kubernetes集群。
使用前首先确保上下文运行环境
kubectl config current-context
启动kubefwd后,在本地就能像在Kubernetes集群中一样使用service名字与端口访问对应的应用程序。
sudo kubefwd services -n the project
转发namespace the-project
下所有的带有label为system: wx
的service\
sudo kubefwd svc -l system=wx -n the-project
Kubeshark由2021年UP9公司开源的K8s API流量查看器 Mizu 发展而来,试图成为一款K8s全过程流量监控工具
Kubeshark 也被叫做 Kubernetes 的可观测性工具,可以对微服务进行动态分析,检测异常并在运行时出现某些模式时触发功能。
Kubeshark 由三个不同的软件组成,它们可以协同工作:CLI、Hub 和 Worker。
在底层实现当中,Kubeshark主要使用到了Linux内核中的各种内置方法和API,隐藏了对流量数据的加解密实现,可以直接收集到K8s集群中的加密和未加密流量。对网络数据的收集主要使用了直接抓包法和基于拓展伯克利包过滤(eBPF)的数据包获取。直接抓包法涉及libpcap、AF_PACKET和PF_RING获取集群TCP流量,eBPF的方法主要使用到了加密流量 (TLS),并挂钩到OpenSSL库和 Go 的crypto/tls包中某些函数的入口点和出口点。
Kubeshark具体功能
网络嗅探
Kubeshark 可以使用 Linux 内核中内置的各种方法和 API 嗅探集群中的加密和未加密流量。
查询
内核跟踪
Kubeshark 使用 🐝 eBPF(扩展伯克利数据包过滤器)提供跟踪内核空间和用户空间功能。
kubeshark tap --tls -n harbor
流量校验
服务地图
部署完成后,Kubeshark CLI 将在 http://localhost:8899 打开 UI 单击右上角名为 Service Map 的按钮打开服务依赖关系图。该图根据网络流量显示 Pod 以及它们之间的关系。
数据脱敏
Kubeshark 捕获的流量包含敏感信息。用户可以配置 Kubeshark 以隐藏某些关键字或数据片段将在 UI 中显示为 [REDACTED]。
默认的脱敏字段 “token”, “authorization”, “authentication”, “cookie”, “userid”, “password”, “username”,
“user”, “key”, “passcode”, “pass”, “auth”, “authtoken”, “jwt”, “bearer”, “clientid”,
“clientsecret”, “redirecturi”, “phonenumber”, “zip”, “zipcode”, “address”, “country”,
“firstname”, “lastname”, “middlename”, “fname”, “lname”, “birthdate”
Kubeshark Cli指南
命令
kubeshark tap catalogue-b87b45784-sxc8q
: 监控指定的Pod
kubeshark tap "(catalo*|front-ent*)"
: 使用正则表达式监控一组Pod
kubeshark tap -n sock-shop
:指定监控的Namespace
kubeshark tap -A
指定所有Namespace
管理K8s集群上的虚拟化服务
K8s日志工具
安装
$ brew tap boz/repo
$ brew install boz/repo/kail
使用
# match pods belonging to a replicaset named 'workers' in any namespace.
$ kail --rs workers
# match pods belonging to the replicaset named 'workers' only in the 'staging' namespace
$ kail --rs staging/workers
# match pods belonging to both the service "frontend" and the deployment "webapp"
$ kail --svc frontend --deploy webapp
Rainbond
遵循 以应用为中心 的设计理念,统一封装容器、Kubernetes和底层基础设施相关技术,让使用者专注于业务本身, 避免在业务以外技术上花费大量学习和管理精力。同时,Rainbond 深度整合应用开发、微服务架构、应用交付、应用运维、资源管理,管理高度自动化,实现统一管理所有应用、所有基础设施和所有IT流程。
Rainbond 通过“无侵入”技术,让传统应用不需要改动或少量改动就能快速变成云原生应用。 传统应用转成成云原生应用的方式:
Rainbond能将企业内部各种数字化能力一键发布成组件,并具备组件安装使用、组件编排、组件版本管理、组件升级和持续迭代等完整的管理流程,将企业内部可复用的能力积累到组件库,既避免重复建设,还能将这些组件变成数字资产,为企业创新提供动力。
Rainbond提供企业应用的业务集成、多云交付、私有交付、SaaS交付、离线交付、个性化交付、应用市场等能力,将交付过程最大限度自动化,提高企业应用交付效率,降低交付成本
https://www.rainbond.com/docs/
rust的kubernetes客户端
https://liangyuanpeng.com/post/fundation-rust/quick-start-kubernetes-client-rust/
KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的 IT 自动化运维能力,简化企业的 DevOps 工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用 (plug-and-play) 的集成。
作为全栈的多租户容器平台,KubeSphere 提供了运维友好的向导式操作界面,帮助企业快速构建一个强大和功能丰富的容器云平台。KubeSphere 为用户提供构建企业级 Kubernetes 环境所需的多项功能,例如多云与多集群管理、Kubernetes 资源管理、DevOps、应用生命周期管理、微服务治理(服务网格)、日志查询与收集、服务与网络、多租户管理、监控告警、事件与审计查询、存储管理、访问权限控制、GPU 支持、网络策略、镜像仓库管理以及安全管理等。
KubeSphere 还开源了 KubeKey 帮助企业一键在公有云或数据中心快速搭建 Kubernetes 集群,提供单节点、多节点、集群插件安装,以及集群升级与运维。
KubeSphere 为用户屏蔽了基础设施底层复杂的技术细节,帮助企业在各类基础设施之上无缝地部署、更新、迁移和管理现有的容器化应用。通过这种方式,KubeSphere 使开发人员能够专注于应用程序开发,使运维团队能够通过企业级可观测性功能和故障排除机制、统一监控和日志查询、存储和网络管理,以及易用的 CI/CD 流水线等来加快 DevOps 自动化工作流程和交付流程等。
KubeSphere 作为开源的企业级全栈化容器平台,为用户提供了一个健壮、安全、功能丰富、具备极致体验的 Web 控制台。拥有企业级 Kubernetes 所需的最常见的功能,如工作负载管理,网络策略配置,微服务治理(基于 Istio),DevOps 项目 (CI/CD) ,安全管理,Source to Image/Binary to Image,多租户管理,多维度监控,日志查询和收集,告警通知,审计,应用程序管理和镜像管理、应用配置密钥管理等功能模块。
它还支持各种开源存储和网络解决方案以及云存储服务。例如,KubeSphere 为用户提供了功能强大的云原生工具负载均衡器插件 OpenELB,这是为 Kubernetes 集群开发的 CNCF 认证的负载均衡插件。
生态:https://kubesphere.io/zh/docs/v3.3/pluggable-components/app-store/
KubeKey 允许用户直接在基础架构上部署 Kubernetes,为 Kubernetes 集群提供高可用性。建议在生产环境至少配置三个主节点。
KubeKey 提供了一种简单的安装,管理和维护方式。它支持 Kubernetes 集群的滚动升级,以便集群服务在升级时始终可用。另外,也可以使用 KubeKey 将新节点添加到 Kubernetes 集群中以使用更多工作负载。
https://portworx.com/blog/choosing-a-kubernetes-operator-for-postgresql/
https://github.com/CrunchyData/postgres-operator/
https://github.com/zalando/postgres-operator
https://github.com/ankane/pgsync
Vault提供令牌管理,基于K8s的令牌管理系统
https://github.com/hashicorp/vault
自动构建镜像
与K8s互动的操作面板
# Via Homebrew
brew install derailed/k9s/k9s
# Via MacPort
sudo port install k9s
2014 年发布的 Kubernetes 在今天俨然已成为容器编排领域的事实标准,相信谈到 Kubernetes 的开发者都会一再复述上述现象。如下图所示,今天的大多数个人或者团队都会选择 Kubernetes 管理容器,而也有 75% 的人会在生产环境中使用 Kubernetes。
在这种全民学习和使用 Kubernetes 的大背景下,我们也应该非常清晰地知道 Kubernetes 有哪些局限性。虽然 Kubernetes 能够解决容器编排领域的大多数问题,但是仍然有一些场景是它很难处理、甚至无法处理的,只有对这些潜在的风险有清晰的认识,才能更好地驾驭这项技术,
集群是一组能够在一起协同工作的计算机,我们可以将集群中的所有计算机看成一个整体,所有资源调度系统都是以集群为维度进行管理的,集群中的所有机器构成了资源池,这个巨大的资源池会为待运行的容器提供资源执行计算任务,这里简单谈一谈 Kubernetes 集群管理面对的几个复杂问题。
水平扩展性
集群大小是我们在评估资源管理系统时需要关注的重要指标之一,然而 Kubernetes 能够管理的集群规模远远小于业界的其他资源管理系统。集群大小为什么重要呢,我们先来看另一个同样重要的指标 — 资源利用率,很多工程师可能没有在公有云平台上申请过资源,这些资源都相当昂贵,在 AWS 上申请一个与主机差不多配置的虚拟机实例(8 CPU、16 GB)每个月大概需要 150 美金,约为 1000 人民币2
大多数的集群都会使用 48 CPU 或者 64 CPU 的物理机或者虚拟机作为集群中的节点,如果我们的集群中需要包含 5,000 个节点,那么这些节点每个月大概要 8,000,000 美元,约为 50,000,000 人民币,在这样的集群中提升 1% 的资源利用率就相当于每个月节省了 500,000 的成本。
多数在线任务的资源利用率都很低,更大的集群意味着能够运行更多的工作负载,而多种高峰和低谷期不同的负载部署在一起可以实现超售,这样能够显著地提高集群的资源利用率,如果单个集群的节点数足够多,我们在部署不同类型的任务时会有更合理的组合,可以完美错开不同服务的高峰期。
Kubernetes 社区对外宣传的是单个集群最多支持 5,000 节点,Pod 总数不超过 150,000,容器总数不超过 300,000 以及单节点 Pod 数量不超过 100 个3,与几万节点的 Apache Mesos 集群、50,000 节点的微软 YARN 集群4相比,Kubernetes 的集群规模整整差了一个数量级。虽然阿里云的工程师也通过优化 Kubernetes 的各个组件实现了 5 位数的集群规模,但是与其他的资源管理方式相比却有比较大的差距
需要注意的是 Kubernetes 社区虽然对外宣称单集群可以支持 5,000 节点,同时社区也有各种各样的集成测试保证每个改动都不会影响它的伸缩性6,但是 Kubernetes 真的非常复杂,我们没有办法保证你使用的每个功能在扩容的过程中都不出问题。而在生产环境中,我们甚至可能在集群扩容到 1000 ~ 1500 节点时遇到瓶颈。
每个稍具规模的大公司都想要实现更大规模的 Kubernetes 集群,但是这不是一个改几行代码就能解决的简单问题,它可能需要我们限制 Kubernetes 中一些功能的使用,在扩容的过程中,etcd、API 服务器、调度器以及控制器都有可能出现问题。社区中已经有一些开发者注意到了其中的一些问题,例如在节点上增加缓存降低 API 服务器的负载7,但是要推动类似的改变还是很困难的,有志之士可以尝试在社区推动类似的项目。
多集群管理
单个集群的容量再大也无法解决企业面对的问题,哪怕有一天 Kubernetes 集群可以达到 50,000 节点的规模,我们仍然需要管理多个集群,多集群管理也是 Kubernetes 社区目前正在探索的方向,社区中的多集群兴趣小组(SIG Multi-Cluster)目前就在完成相关的工作8。在作者看来,Kubernetes 的多集群会带来资源不平衡、跨集群访问困难以及提高运维和管理成本三大问题,我们在这里谈一谈目前在开源社区和业界几种可供参考和选择的解决方案。
Kubefed项目是 Kubernetes 社区给出的解决方案,它同时提供了跨集群的资源和网络管理的功能,社区的多集群兴趣小组(SIG Multi-Cluster)负责了该项目的开发工作
kubefed 通过一个中心化的联邦控制面板管理多集群中的元数据,上层的控制面板会为管理器群中的资源创建对应的联邦对象
上层的控制面板会根据联邦对象 FederatedDeployment
的规格文件生成对应的 Deployment
并推送到下层的集群,下层集群可以正常根据 Deployment
中的定义创建特定数量的副本。
FederatedDeployment
只是一种最简单的分发策略,在生产环境中我们希望通过联邦的集群实现容灾等复杂功能,这时可以利用 ReplicaSchedulingPreference
在不同集群中实现更加智能的分发策略:
我们可以认为 kubefed 的主要作用是将多个松散的集群组成强耦合的联邦集群,并提供更加高级的网络和部署功能,这样我们可以更容易地解决集群之间资源不平衡和连通性的一些问题,然而该项目的关注点不包含集群生命周期的管理,
集群接口
Cluster API 也是 Kubernetes 社区中与多集群管理相关的项目,该项目由集群生命周期小组(SIG Cluster-Lifecycle)负责开发,其主要目标是通过声明式的 API 简化多集群的准备、更新和运维工作,
在该项目中最重要的资源就是 Machine
,它表示一个 Kubernetes 集群中的节点。当该资源被创建时,特定提供商的控制器会根据机器的定义初始化并将新的节点注册到集群中,在该资源被更新或者删除时,也会执行操作达到用户的状态。
这种策略与阿里的多集群管理的方式有一些相似,它们都使用声明式的 API 定义机器和集群的状态,然后使用 Kubernetes 原生的 Operator 模型在更高一层的集群中管理下层集群,这能够极大降低集群的运维成本并提高集群的运行效率10,不过类似的项目都没有考虑跨集群的资源管理和网络管理。
应用分发
Kubernetes 主项目提供了几种部署应用的最基本方式,分别是 Deployment
、StatefulSet
和 DaemonSet
,这些资源分别适用于无状态服务、有状态服务和节点上的守护进程,这些资源能够提供最基本的策略,但是它们无法处理更加复杂的应用。
随着 CRD 的引入,目前社区的应用管理小组(SIG Apps)基本不会向 Kubernetes 主仓库引入较大的改动,大多数的改动都是在现有资源上进行的修补,很多常见的场景,例如只运行一次的 DaemonSet11 以及金丝雀和蓝绿部署等功能,现在的资源也存在很多问题,例如 StatefulSet 在初始化容器中卡住无法回滚和更新12。
我们可以理解社区不想在 Kubernetes 中维护更多的基本资源,通过几个基本的资源可以覆盖 90% 的场景,剩下的各种复杂场景可以让其他社区通过 CRD 的方式实现。不过作者认为如果社区能够在上游实现更多高质量的组件,这对于整个生态都是很有价值并且很重要的工作,需要注意的是假如各位读者想要在 Kubernetes 项目中成为贡献者,SIG Apps 可能不是一个很好的选择。
批处理调度
机器学习、批处理任务和流式任务等工作负载的运行从 Kubernetes 诞生第一天起到今天都不是它的强项,大多数的公司都会使用 Kubernetes 运行在线服务处理用户请求,用 Yarn 管理的集群运行批处理的负载。
在线任务和离线任务往往是两种截然不同的作业,大多数的在线任务都是无状态的服务,它们可以在不同机器上进行迁移,彼此很难有极强的依赖关系;但是很多离线任务的拓扑结构都很复杂,有些任务需要多个作业一同执行,而有些任务需要按照依赖关系先后执行,这种复杂的调度场景在 Kubernetes 中比较难以处理。
在 Kubernetes 调度器引入调度框架之前,所有的 Pod 在调度器看来是没有任何关联的,不过有了调度框架,我们可以在调度系统中实现更加复杂的调度策略,例如保证一组 Pod 同时调度的 PodGroup13,这对于 Spark 和 TensorFlow 任务非常有用。
Volcano 也是在 Kubernetes 上构建的批处理任务管理系统14,它能够处理机器学习、深度学习以及其他大数据应用,可以支持包括 TensorFlow、Spark、PyTorch 和 MPI 在内的多个框架。
虽然 Kubernetes 能够运行一些批处理任务,但是距离在这个领域上取代 Yarn 等老牌资源管理系统上还有非常大的差距,相信在较长的一段时间内,大多数公司都会同时维护 Kubernetes 和 Yarn 两种技术栈,分别管理和运行不同类型的工作负载。
硬多租户
多租户是指同一个软件实例可以为不同的用户组提供服务,Kubernetes 的多租户是指多个用户或者用户组使用同一个 Kubernetes 集群,今天的 Kubernetes 还很难做到硬多租户支持,也就是同一个集群的多个租户不会相互影响,也感知不到彼此的存在。
硬多租户在 Kubernetes 中是一个很重要、也很困难的课题,合租公寓就是一个典型的多租户场景,多个租客共享房屋内的基础设施,硬多租户要求多个访客之间不会相互影响,你可以想象这有多么困难,Kubernetes 社区甚至有一个工作小组专门讨论和研究相关的问题15,然而虽然感兴趣的工程师很多,但是成果却非常有限。
尽管 Kubernetes 使用命名空间来划分虚拟机群,然而这也很难实现真正的多租户。多租户的支持到底有哪些作用呢,这里简单列几个多租户带来的好处:
如果 Kubernetes 能够实现硬多租户,这不仅对云服务商和小集群的使用者来说都是个福音,它还能够隔离不同容器之间的影响并防止潜在安全问题的发生,不过这在现阶段还是比较难实现的。
总结
每个技术都有自己的生命周期,越底层的技术生命周期会越长,而越上层的技术生命周期也就越短,虽然 Kubernetes 是当今容器界的扛把子,但是未来的事情没有人可以说的准。我们要时刻清楚手中工具的优点和缺点,花一些时间学习 Kubernetes 中设计的精髓,不过如果在未来的某一天 Kubernetes 也成为了过去,我们也应该感到喜悦,因为会有更好的工具取代它