云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

免备案CDN_北京网站建设报价_安全稳定

小七 141 0

使用HashiCorp Terraform管理Kubernetes应用程序

HashiCorp Terraform是一个开源工具,它允许用户使用一致的工作流提供任何基础设施。Terraform既可以管理公共云服务的基础设施,也可以管理外部服务,如GitHub、Nomad或kubernetespods。本文重点介绍了新的Terraform Kubernetes提供程序,它使操作员能够使用声明性基础设施作为代码来管理Kubernetes资源的生命周期。Terraform支持通过可扩展的提供者生态系统(插件)来提供基础设施和基础设施资源。除了解释使用Terraform管理Kubernetes资源与Kubernetes CLI相比的好处,本文还介绍了如何使用新的Kubernetes提供程序与Kubernetes资源交互(pod、复制控制器、,以及使运营商能够使用基础设施作为代码来控制Kubernetes资源的生命周期。»为什么是地形?Q: 为什么我要使用Terraform来管理Kubernetes资源作为代码的基础设施?Terraform使用相同的声明性语法来提供底层基础设施(计算、网络和存储)和调度(应用程序)层。使用图论,Terraform自动地为基础设施中所有依赖项之间的关系建模。这张图使Terraform能够随着资源(如计算实例或kubernetespods)随时间的变化而自动检测漂移。作为Terraform干运行规划阶段的一部分,该漂移将提交给用户确认。Terraform提供Kubernetes资源的完整生命周期管理,包括创建和删除pod、复制控制器和服务。因为Terraform理解资源之间的关系,它对创建、更新和删除资源的操作顺序和失败条件有着内在的理解。例如,如果持久卷声明(PVC)需要来自特定持久卷(PV)的空间,Terraform会自动知道在PVC之前创建PV。如果PV无法创建,Terraform将不会尝试创建PVC,因为Terraform知道创建将失败。与kubectlcli不同,Terraform在创建依赖资源之前将等待服务准备就绪。当您想保证命令完成后的状态时,这很有用。作为这种行为的一个具体例子,Terraform将一直等到服务被配置好之后,它才能将服务的IP添加到负载均衡器中。无需手动处理!»Kubernetes提供程序入门本文假设您已经有一个Kubernetes集群正在运行,并且可以从Terraform运行的地方访问集群。Terraform可以提供一个Kubernetes集群,但是这篇文章没有具体讨论。配置Kubernetes提供程序的最简单方法是在~/.kube/config处创建一个配置文件–Terraform将在运行期间自动加载该配置:# 主.tf提供者"kubernetes"{}当无法创建配置文件时,可以直接在配置中或通过环境变量配置提供程序。这在频繁更改的CI系统或短暂环境中非常有用。指定提供程序后,初始化Terraform。这将下载并安装Terraform Kubernetes提供程序的最新版本。$terraform初始化正在初始化提供程序插件。。。-正在下载提供程序"kubernetes"的插件。。。地形已成功初始化!»调度简单应用程序Kubernetes应用程序的核心是pod。pod由一个或多个容器组成,这些容器根据可用的CPU或内存在集群节点上调度。接下来,使用Terraform创建一个带有运行nginx的容器的pod,通过负载平衡器向用户公开端口80。通过添加标签,Kubernetes可以发现所有pod(实例),从而自动将流量路由到暴露的端口。资源"kubernetes_pod""echo"{元数据{name="回声示例"标签{App="回声"} }规格{集装箱{image="hashicorp/http-回波:0.2.1"name="示例2"args=-listen=:80","-text='Hello World'']港口{集装箱港口=80} } } }以上只是一个例子,并不代表最佳实践。在生产场景中,为了获得高可用性,您将运行多个应用程序实例。要向最终用户公开pod,请提供一个服务。服务能够在某些云提供商中提供负载平衡器。它可以在新的pods启动时管理pods和负载均衡器之间的关系。资源"kubernetes_service""echo"{元数据{name="回声示例"}规格{选择器{App="${kubernetes公司_pod.echo.metadata.0。标签.App}"}港口{端口=80目标端口=80}type="负载平衡器"} }输出"lb_ip"{value="${kubernetes"_service.echo.load_平衡器入口.0.ip}"}除了指定服务之外,这个Terraform配置还指定了一个输出。此输出显示在Terraform apply的末尾,并将打印负载平衡器的IP,以便操作员(人工)或任何需要它的工具/脚本都可以轻松访问它。该计划概述了Terraform计划要采取的行动。在本例中,您将在输出中看到两个资源(一个pod+一个服务)。随着基础设施和应用程序资源数量的增加,terraform plan命令对于理解更新和更改期间的影响和部署效果变得非常有用。立即运行地形计划:$地形图# ...+库伯内特斯_吊舱回波元数据。#:"1"metadata.0.generation:"<;computed>;"元数据。0。标签。%:"1"元数据。0。标签.App:"回声"metadata.0.name:"回显示例"metadata.0.namespace:"默认值"规格:"1"规范0.容器。#:"1"规范0.container.0.args.#:"2"规范0.container.0.args.0:"-listen=:80"spec.0.container.0.args.1:"-text='Hello World'"spec.0.container.0.image:"hashicorp/http"-回声:最新"spec.0.container.0.image\u pull_策略:"<;computed>;"spec.0.container.0.name:"示例2"规范0.容器.0.端口#:"1"spec.0.container.0.port.0.container_端口:"80"...+库伯内特斯_服务.echo负载平衡器入口:"<;computed>;"元数据。#:"1"metadata.0.generation:"<;computed>;"metadata.0.name:"回显示例"metadata.0.namespace:"默认值"metadata.0.resource_版本:"<;computed>;"metadata.0.self\u链接:"<;computed>;"metadata.0.uid:"<;computed>;"规格:"1"规范0.cluster\ip:"<;computed>;"规格0.端口:"1"spec.0.port.0.node_端口:"<;computed>;"spec.0.port.0.port:"80"spec.0.port.0.protocol:"TCP"spec.0.port.0.target_端口:"80"规范0.选择器。%:"1"规范0。选择器.App:"回声"spec.0.session_affinity:"无"spec.0.type:"负载平衡器"计划:2表示添加,0表示更改,0表示销毁。terraform plan命令从不修改资源;它纯粹是一个干运行。要应用这些更改,请运行terraform apply。此命令将创建资源(通过API)、处理排序、失败和条件。此外,terraform apply将阻塞,直到所有资源完成配置。立即运行terraform apply:$terraform应用库伯内特斯_吊舱回波:正在创建。。。...库伯内特斯_吊舱回波:创建完成(ID:default/echo示例)库伯内特斯_服务.echo:正在创建。。。...库伯内特斯_服务.echo:仍在创建。。。(经过10秒)库伯内特斯_服务.echo:仍在创建。。。(经过20秒)库伯内特斯_服务.echo:仍在创建。。。(经过30秒)库伯内特斯_服务.echo:仍在创建。。。(经过40秒)库伯内特斯_服务.echo:创建完成(ID:default/echo示例)申请完成!资源:添加了2个,更改了0个,销毁了0个。# ...输出:磅/平方英寸=35.197.9.247要验证应用程序是否正在运行,请从终端使用curl:$curl-s$(地形输出lb_ip)如果一切正常,您将看到文本hello world。kubernetesui提供了另一种方法来检查Pod和服务在它们被调度之后是否在那里。»正在更新应用程序随着时间的推移,需要部署应用程序的新版本。部署新版本时执行升级的最简单方法是相应地更改配置中的image字段。资源"kubernetes_pod""示例"{# ...规格{集装箱{image="hashicorp/http-回波:0.2.3"# ...}要验证Terraform将进行的更改,请运行Terraform plan并检查输出。这还将验证团队中没有其他人修改先前创建的资源。$地形图正在刷新计划前内存中的地形状态。。。库伯内特斯_吊舱回波:正在刷新状态。。。(ID:默认/回显示例)库伯内特斯_服务.echo:正在刷新状态。。。(ID:默认/回显示例)...~库伯内特斯_吊舱回波spec.0.container.0.image:"hashicorp/http"-回波:0.2.1"=>"hashicorp/http-回波:0.2.3"计划:0添加,1更改,0销毁。然后应用更改:$terraform应用库伯内特斯_吊舱回波:正在刷新状态。。。(ID:默认/回显示例)库伯内特斯_服务.echo:正在刷新状态。。。(ID:默认/回显示例)库伯内特斯_吊舱回波:正在修改。。。(ID:默认/回显示例)spec.0.container.0.image:"hashicorp/http"-回波:0.2.1"=>"hashicorp/http-回波:0.2.3"库伯内特斯_吊舱回波:修改完成(ID:default/echo-e