Kubernetes进阶:高级特性、社区生态与替代方案
1. Kubernetes在GCP上的应用
在Google Cloud Platform(GCP)上使用Kubernetes有诸多便利。例如,更新Ingress可以使用如下命令:
$ kubectl apply -f nginx-tomcat-static-ip-ingress.yaml
查看与静态IP关联的Ingress地址:
$ kubectl get ing
NAME HOSTS ADDRESS PORTS AGE
nginx-tomcat-ingress * 35.186.227.252 80 48m
这样就可以通过静态IP地址访问Ingress,如 http://35.186.227.252/ (nginx)和 http://35.186.227.252/examples/ (Tomcat)。
GCP的基本概念与AWS类似,但部分策略和概念有所不同。Google Container Engine是一个强大的服务,可将Kubernetes用于生产环境。Kubernetes集群和节点管理非常容易,不仅安装简单,升级也很方便。云提供商与GCP完全集成,特别是Ingress,只需一个命令就能配置L7负载均衡器。因此,如果计划在公共云上使用Kubernetes,强烈建议尝试Google Kubernetes Engine(GKE)。
2. Kubernetes的API版本
Kubernetes的对象和资源分为三个API轨道,即alpha、beta和稳定版,以表示其成熟度。每个资源头部的 apiVersion 字段指示其级别。
| API级别 | 特点 |
| ---- | ---- |
| alpha | 默认禁用,可能会在无通知的情况下更改 |
| beta | 默认启用,经过充分测试,被认为是稳定的,但架构或对象语义仍可能更改 |
| 稳定版 | 一旦进入稳定阶段,不太可能再更改 |
3. 高级Kubernetes特性
3.1 Job和CronJob
Job和CronJob是高级Pod控制器,允许运行最终会终止的容器。Job确保一定数量的Pod成功运行完成;CronJob确保在给定时间调用Job。如果需要运行批处理工作负载或计划任务,可以使用这些内置控制器。相关信息可参考: https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/
3.2 Pod和节点之间的亲和性和反亲和性
虽然可以使用节点选择器手动将Pod分配给某些节点,节点也可以使用污点拒绝Pod,但在更灵活的情况下,如希望某些Pod共置或在可用区之间均匀分布Pod,使用节点选择器或污点可能会很麻烦。亲和性就是为解决此类问题而设计的,相关信息可参考: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
3.3 Pod的自动扩展
几乎所有现代基础设施都支持自动扩展运行应用程序的实例组,Kubernetes也不例外。Pod水平扩展器(PodHorizontalScaler)可以根据CPU/内存指标在控制器(如Deployment)中扩展Pod副本。从Kubernetes 1.6开始,扩展器正式支持基于自定义指标(如每秒事务数)进行扩展。更多信息可参考: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
3.4 Pod中断的预防和缓解
Pod是易变的,随着集群的伸缩,它们会在节点之间终止和重新启动。如果一个应用程序的太多Pod同时被销毁,可能会导致服务级别下降甚至应用程序失败。特别是对于有状态或基于仲裁的应用程序,可能几乎无法容忍Pod中断。为了缓解这种中断,可以使用PodDisruptionBudget告知Kubernetes应用程序在任何给定时间可以容忍多少不可用的Pod,以便Kubernetes能够根据应用程序的情况采取适当的行动。更多信息可参考: https://kubernetes.io/docs/concepts/workloads/pods/disruptions/
另一方面,由于PodDisruptionBudget是一个受管理的对象,它仍然无法排除Kubernetes外部因素(如节点硬件故障或系统因内存不足而杀死节点组件)导致的中断。因此,可以将 node-problem-detector 等工具集成到监控堆栈中,并适当配置节点资源的阈值,以通知Kubernetes开始排空节点或驱逐过多的Pod,防止情况恶化。有关 node-problem-detector 和资源阈值的更详细指南,请参考以下主题:
- https://kubernetes.io/docs/tasks/debug-application-cluster/monitor-node-health/
- https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/
3.5 Kubernetes联邦
联邦是集群的集群,由多个Kubernetes集群组成,可从单个控制平面访问。在联邦上创建的资源将在所有连接的集群中同步。截至Kubernetes 1.7,可联合的资源包括Namespace、ConfigMap、Secret、Deployment、DaemonSet、Service和Ingress。
联邦构建混合平台的能力在架构软件时带来了更高的灵活性。例如,可以将部署在本地数据中心和各种公共云的集群联合起来,按成本分配工作负载,并利用特定平台的功能,同时保持迁移的弹性。另一个典型用例是联合分散在不同地理位置的集群,以降低全球客户的边缘延迟。此外,由etcd3支持的单个Kubernetes集群在版本1.6时支持5000个节点,同时保持API响应时间的p99小于1秒。如果需要拥有数千个节点或更多的集群,可以通过联合集群来实现。联邦的指南可参考: https://kubernetes.io/docs/tasks/federation/set-up-cluster-federation-kubefed/
3.6 集群附加组件
集群附加组件是为增强Kubernetes集群而设计或配置的程序,被视为Kubernetes的固有部分。例如,在监控和日志记录中使用的Heapster,以及前面提到的 node-problem-detector 都是附加组件。
一些托管的Kubernetes服务(如GKE)部署附加组件管理器,以保护附加组件的状态不被修改或删除。托管的附加组件将在Pod控制器上使用标签 addonmanager.kubernetes.io/mode 进行部署。如果模式为 Reconcile ,对规范的任何修改都将回滚到其初始状态; EnsureExists 模式仅检查控制器是否存在,但不检查其规范是否被修改。例如,在1.7.3 GKE集群上默认部署的以下Deployments都在 Reconcile 模式下受到保护。
如果想在自己的集群中部署附加组件,可以在 https://github.com/kubernetes/kubernetes/tree/master/cluster/addons 找到它们。
4. Kubernetes社区与生态
4.1 Kubernetes的起源与支持
Kubernetes起源于Google,现在由云原生计算基金会(CNCF, https://www.cncf.io )支持。在Kubernetes 1.0发布时,Google与Linux基金会合作成立了CNCF,并将Kubernetes作为种子项目捐赠。CNCF旨在促进容器化、动态编排和面向微服务的应用程序的开发。
由于CNCF下的所有项目都是基于容器的,它们肯定可以与Kubernetes流畅协作。例如,在监控和日志记录中演示和提到的Prometheus、Fluentd和OpenTracing都是CNCF的成员项目。
4.2 Kubernetes孵化器
Kubernetes孵化器是支持Kubernetes项目的过程,相关信息可参考: https://github.com/kubernetes/community/blob/master/incubator.md
毕业项目可能成为Kubernetes的核心功能、集群附加组件或独立工具。在使用Kubernetes的过程中,我们已经看到并使用了许多这样的项目,包括Heapster、cAdvisor、dashboard、minikube、kops、kube-state-metrics和kube-problem-detector等,它们让Kubernetes变得越来越好。可以在 https://github.com/kubernetes 或 https://github.com/kubernetes-incubator 探索这些项目。
4.3 Helm和图表
Helm( https://github.com/kubernetes/helm )是一个包管理器,简化了在Kubernetes上运行软件的日常操作。它也是从孵化器毕业的项目。
在Kubernetes上部署容器化软件基本上是编写清单。然而,一个应用程序可能由数十个Kubernetes资源组成。如果要多次部署这样的应用程序,重命名冲突部分的任务可能会很繁琐。引入模板引擎的想法来解决重命名问题后,会发现还需要一个地方来存储模板和渲染后的清单。因此,Helm就是为解决这些烦人的琐事而设计的。
Helm中的包称为图表,它是运行应用程序的配置、定义和清单的集合。社区贡献的图表发布在 https://github.com/kubernetes/charts 。即使不打算使用它,也可以在那里找到某个包的经过验证的清单。
使用Helm非常简单:
1. 运行官方安装脚本获取Helm: https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get
2. 获取Helm二进制文件并使其工作后,它会获取 kubectl 配置以连接到集群。需要在Kubernetes集群中安装一个管理器Tiller来管理Helm的每个部署任务:
$ helm init
$HELM_HOME has been configured at /Users/myuser/.helm.
Tiller (the Helm server-side component) has been installed into your
Kubernetes Cluster.
Happy Helming!
如果想在不将Tiller安装到Kubernetes集群的情况下初始化Helm客户端,可以在 helm init 命令中添加 --client-only 标志。此外,同时使用 --skip-refresh 标志可以离线初始化客户端。
- Helm客户端可以从命令行搜索可用的图表:
$ helm search
NAME VERSION DESCRIPTION
stable/aws-cluster-autoscaler 0.2.1 Scales worker nodes within
autoscaling groups.
stable/chaoskube 0.5.0 Chaoskube periodically kills
random pods in you...
...
stable/uchiwa 0.2.1 Dashboard for the Sensu
monitoring framework
stable/wordpress 0.6.3 Web publishing platform for
building blogs and ...
- 从仓库安装一个图表,例如安装WordPress:
$ helm install stable/wordpress
NAME: plinking-billygoat
LAST DEPLOYED: Wed Sep 6 01:09:20 2017
NAMESPACE: default
STATUS: DEPLOYED
...
在Helm中部署的图表是一个版本。这里安装了一个版本 plinking-billygoat 。一旦Pod和服务准备好,就可以连接到网站并检查结果。
- 拆除一个版本也只需要一行命令:
$ helm delete plinking-billygoat
release "plinking-billygoat" deleted
Helm利用ConfigMap存储版本的元数据,但使用 helm delete 删除版本不会删除其元数据。要完全清除这些元数据,可以手动删除这些ConfigMaps,或者在执行 helm delete 时添加 --purge 标志。
除了管理集群中的包,Helm还建立了一个共享包的标准,允许直接安装流行的软件,而无需为使用的每个软件重写清单。
5. 其他容器编排框架
5.1 Docker Swarm模式
Swarm模式是Docker自1.12版本起集成在Docker引擎中的原生编排器。它与Docker本身共享相同的API和用户界面,包括使用Docker Compose文件。这种集成程度根据用户对同一供应商组件的接受程度,既可以被视为优势,也可以被视为劣势。
一个Swarm集群由管理器和工作节点组成,管理器是共识组的一部分,用于维护集群状态并保持高可用性。启用Swarm模式非常简单,大致分为两步:
1. 使用 docker swarm init 创建集群
2. 使用 docker swarm join 加入其他管理器和工作节点
此外,Docker提供的Docker Cloud( https://cloud.docker.com/swarm )帮助我们在各种云提供商上引导Swarm集群。
Swarm模式的功能是容器平台所期望的,即容器生命周期管理、两种调度策略(复制和全局,分别类似于Kubernetes中的Deployment和DaemonSet)、服务发现、秘密管理等。还有一个入口网络,其工作方式类似于Kubernetes中的NodePort类型服务,但如果需要L7层负载均衡器,则需要引入如nginx或Traefik等工具。
总的来说,Swarm模式为编排容器化应用程序提供了一个开箱即用的选项。由于它与Docker使用相同的语言且架构简单,被认为是所有选择中最容易上手的平台。因此,选择Swarm模式快速完成某些任务是合理的。然而,其简单性有时会导致缺乏灵活性。例如,在Kubernetes中可以通过操纵选择器和标签轻松采用蓝绿部署策略,但在Swarm模式中没有简单的方法实现。由于Swarm模式仍在积极开发中,如在17.06版本中引入了类似于Kubernetes中ConfigMap的存储配置数据的功能,我们有理由期待它在未来变得更强大,同时保持其简单性。
5.2 Amazon EC2容器服务(ECS)
ECS是AWS对Docker热潮的回应。与提供Kubernetes、Docker Swarm和DC/OS等开源集群管理器的Google Cloud Platform和Microsoft Azure不同,AWS采用自己的方式来满足容器服务的需求。
ECS使用Docker作为容器运行时,也接受语法版本2的Docker Compose文件。此外,ECS和Docker Swarm模式的术语有很多相似之处,如任务和服务的概念。然而,相似之处仅此而已。虽然ECS的核心功能简单甚至基础,但作为AWS的一部分,ECS充分利用其他AWS产品来增强自身,例如:
- VPC用于容器网络
- CloudWatch和CloudWatch Logs用于监控和日志记录
- 应用程序负载均衡器和网络负载均衡器与目标组用于服务发现
- Lambda与Route 53用于基于DNS的服务发现
- CloudWatch Events用于CronJob
- EBS和EFS用于数据持久化
- ECR用于Docker注册表
- 参数存储和KMS用于存储配置文件和秘密
- CodePipeline用于CI/CD等
还有一个基于ECS构建的AWS产品AWS Batch( https://aws.amazon.com/batch/ ),用于处理批处理工作负载。此外,AWS ECS团队的开源工具Blox( https://blox.github.io )通过连接多个AWS产品,增强了ECS未提供的自定义调度功能,如类似于DaemonSet的策略。从另一个角度看,如果将AWS视为一个整体来评估ECS,它确实非常强大。
设置ECS集群很容易:通过AWS控制台或API创建ECS集群,并将EC2节点与ECS代理连接到集群。好处是主节点由AWS管理,我们无需密切关注主节点。
总体而言,ECS易于上手,特别是对于熟悉Docker和AWS产品的人来说。另一方面,如果对当前提供的基本功能不满意,可能需要使用前面提到的其他AWS服务或第三方解决方案进行一些手动操作来完成任务,这可能会导致这些服务的不必要成本,以及配置和维护方面的努力,以确保每个组件正常协作。此外,ECS仅在AWS上可用,这也可能是人们需要认真考虑的一个因素。
5.3 Apache Mesos
Mesos在Docker引发容器潮流之前就已经创建,其目标是解决由通用硬件组成的集群中资源管理的困难,同时支持多样化的工作负载。为了构建这样一个通用平台,Mesos采用两层架构来划分资源分配和任务执行。因此,执行部分理论上可以扩展到任何类型的任务,包括编排Docker容器。
实际上,这里提到的Mesos主要负责一层工作,执行部分由其他称为Mesos框架的组件完成。例如,Marathon( https://mesosphere.github.io/marathon/ )和Chronos( https://mesos.github.io/chronos/ )是分别用于部署长期运行和批处理作业任务的流行框架,它们都支持Docker容器。因此,当提到Mesos时,通常指的是如Mesos/Marathon/Chronos或Mesos/Aurora这样的堆栈。实际上,在Mesos的两层架构下,也可以将Kubernetes作为Mesos框架运行。
坦率地说,一个组织良好的Mesos堆栈和Kubernetes在功能上非常相似,除了Kubernetes要求在其上运行的所有内容都必须容器化,无论使用Docker、rkt还是虚拟机容器。另一方面,由于Mesos专注于通用调度并倾向于保持其核心小巧,一些基本功能需要单独安装、测试和操作,这可能会带来额外的努力。
Mesosphere发布的DC/OS( https://dcos.io )利用Mesos构建了一个全栈集群管理平台,在功能上更可与Kubernetes相媲美。作为基于Mesos构建的一站式解决方案,它捆绑了多个组件来驱动整个系统,如用于常见工作负载的Marathon、用于计划作业的Metronome、用于服务发现的Mesos-DNS等。尽管这些构建块看起来很复杂,但DC/OS通过CloudFormation/Terraform模板及其包管理系统Mesosphere Universe大大简化了安装和配置工作。自DC/OS 1.10起,Kubernetes正式集成到DC/OS中,可以通过Universe进行安装。一些云提供商(如Microsoft Azure)也提供托管的DC/OS服务。
综上所述,在选择容器编排框架时,需要综合考虑性能、稳定性、可用性、可扩展性、易用性等客观因素,以及实际应用场景和团队技术栈等实际情况,以找到最适合的解决方案。
Kubernetes进阶:高级特性、社区生态与替代方案
6. 各容器编排框架对比
为了更清晰地了解不同容器编排框架的特点,下面对Kubernetes、Docker Swarm模式、Amazon ECS和Apache Mesos(以DC/OS为例)进行对比:
| 特性 | Kubernetes | Docker Swarm模式 | Amazon ECS | Apache Mesos(DC/OS) |
| ---- | ---- | ---- | ---- | ---- |
| 起源 | Google | Docker | AWS | Apache |
| 架构复杂度 | 较高 | 较低 | 中等(依赖AWS服务) | 中等(组件较多) |
| 功能丰富度 | 高 | 中等 | 中等(结合AWS服务强大) | 高 |
| 学习曲线 | 较陡 | 较缓 | 有AWS基础较易 | 中等 |
| 社区支持 | 强 | 中等 | 强(AWS支持) | 中等 |
| 云集成 | 多云支持 | 多云支持(借助Docker Cloud) | 仅支持AWS | 部分云支持(如Azure) |
| 调度策略 | 灵活多样 | 复制和全局 | 基本调度结合AWS服务扩展 | 通用调度结合框架扩展 |
| 负载均衡 | 支持L7(Ingress) | 需要额外工具 | 结合AWS负载均衡器 | 有内置和可扩展方案 |
从这个对比表格可以看出,不同的容器编排框架各有优缺点,适用于不同的场景和需求。例如,对于追求功能全面、灵活性高且有一定技术实力的团队,Kubernetes是一个很好的选择;而对于熟悉Docker且希望快速上手的用户,Docker Swarm模式可能更合适;对于已经深度使用AWS服务的用户,Amazon ECS能很好地与现有架构集成;对于需要通用资源管理和多样化工作负载支持的场景,Apache Mesos(DC/OS)是一个有力的竞争者。
7. 选择合适的容器编排框架的决策流程
在选择合适的容器编排框架时,可以参考以下mermaid流程图:
graph TD;
A[开始] --> B{是否熟悉Kubernetes生态};
B -- 是 --> C{是否需要多云部署};
C -- 是 --> D[选择Kubernetes];
C -- 否 --> E{是否在AWS环境};
E -- 是 --> F[考虑Amazon ECS];
E -- 否 --> D;
B -- 否 --> G{是否熟悉Docker};
G -- 是 --> H{是否需要简单架构快速上手};
H -- 是 --> I[选择Docker Swarm模式];
H -- 否 --> J{是否需要通用资源管理};
J -- 是 --> K[考虑Apache Mesos(DC/OS)];
J -- 否 --> D;
G -- 否 --> D;
这个流程图展示了一个简单的决策过程,从对不同技术的熟悉程度、部署环境和具体需求等方面进行考虑,帮助用户选择最适合自己的容器编排框架。
8. 未来趋势与展望
随着云计算和容器技术的不断发展,容器编排框架也在不断演进。Kubernetes作为目前最流行的容器编排框架,将继续保持其领先地位,并不断完善和扩展其功能。社区的贡献将进一步丰富Kubernetes的生态系统,例如更多的集群附加组件和第三方工具的出现,将使Kubernetes在不同场景下的应用更加便捷和高效。
Docker Swarm模式虽然目前相对简单,但由于其与Docker的紧密集成,对于Docker用户来说仍然具有一定的吸引力。随着其功能的不断增强,可能会在一些特定场景中得到更广泛的应用。
Amazon ECS将继续依托AWS强大的云服务生态,为AWS用户提供更加便捷的容器编排解决方案。同时,AWS也可能会不断优化ECS的功能,使其在处理复杂工作负载和大规模集群方面表现更加出色。
Apache Mesos(DC/OS)凭借其通用的资源管理能力和对多样化工作负载的支持,将在一些对资源管理要求较高的企业级场景中发挥重要作用。随着Kubernetes在DC/OS中的集成不断完善,两者的结合可能会为用户带来更多的选择和便利。
总的来说,未来容器编排框架将朝着更加智能化、自动化和集成化的方向发展。不同的框架将在不同的领域和场景中发挥各自的优势,用户需要根据自己的实际情况选择合适的框架,并不断关注技术的发展动态,以适应不断变化的市场需求。
9. 实践建议
在实际应用中,为了更好地使用容器编排框架,以下是一些实践建议:
- 学习与培训 :对于Kubernetes等复杂的编排框架,建议参加专业的培训课程或阅读相关的技术书籍,深入了解其原理和操作方法。可以通过在线教程、官方文档和社区论坛等渠道进行学习。
- 小规模试验 :在将容器编排框架应用到生产环境之前,先进行小规模的试验和测试。可以在本地环境或云平台上搭建一个简单的集群,运行一些简单的应用程序,熟悉框架的使用流程和功能特性。
- 监控与优化 :建立完善的监控系统,实时监测容器和集群的运行状态。通过监控数据,及时发现并解决性能瓶颈和故障问题。同时,根据监控结果对集群进行优化,提高资源利用率和应用程序的性能。
- 持续集成与持续部署(CI/CD) :将容器编排框架与CI/CD工具集成,实现应用程序的自动化部署和更新。例如,使用Jenkins、GitLab CI/CD等工具,结合Helm等包管理器,实现应用程序的快速迭代和交付。
- 安全保障 :重视容器和集群的安全问题,采取必要的安全措施。例如,使用安全的镜像、设置访问控制和权限管理、定期进行漏洞扫描等,确保应用程序和数据的安全。
通过遵循这些实践建议,可以更好地掌握容器编排框架的使用,提高应用程序的开发和部署效率,降低运维成本。
10. 总结
本文详细介绍了Kubernetes的高级特性、社区生态以及其他容器编排框架。Kubernetes具有丰富的功能和强大的社区支持,通过Job和CronJob、亲和性和反亲和性、自动扩展等高级特性,能够满足各种复杂的工作负载和场景需求。其社区生态也非常活跃,包括Kubernetes孵化器和Helm等工具,为用户提供了更多的便利和选择。
同时,还介绍了Docker Swarm模式、Amazon ECS和Apache Mesos(DC/OS)等其他容器编排框架,分析了它们的特点和适用场景。不同的框架在架构复杂度、功能丰富度、学习曲线等方面存在差异,用户需要根据自己的实际情况进行选择。
在选择容器编排框架时,要综合考虑性能、稳定性、可用性、可扩展性、易用性等客观因素,以及实际应用场景和团队技术栈等实际情况。通过对比分析和决策流程,帮助用户找到最适合自己的解决方案。
最后,给出了一些实践建议,希望能帮助用户更好地应用容器编排框架,提高应用程序的开发和部署效率,实现业务的快速发展。在未来的技术发展中,容器编排框架将不断演进和完善,为云计算和容器技术的发展提供更强大的支持。
超级会员免费看
1091

被折叠的 条评论
为什么被折叠?



