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

天翼云_国色生香百度云_测评

小七 141 0

将策略作为代码应用于Kubernetes资源

在HashiConf 2017大会上,我们宣布了Sentinel,一个将政策视为代码的框架。Sentinel内置于HashiCorp企业产品中,允许通过实时运行系统来主动执行自动化护栏、业务要求、法律遵从性和其他策略。使用HashiCorp Terraform Enterprise和Kubernetes提供者,我们可以在对资源的更改应用到集群之前,使用Sentinel对Kubernetes资源应用细粒度的策略强制。这篇博客文章探讨了在Terraform Enterprise中使用Sentinel来管理Kubernetes集群并实施Kubernetes服务类型和名称空间命名约定。要了解更多关于如何在Terraform Enterprise中使用Sentinel,请阅读我们之前的博客post Sentinel and Terraform Enterprise。有关Kubernetes提供商的概述,请阅读我们的以前的博客文章用Terraform管理Kubernetes。»对服务执行策略Kubernetes服务是Kubernetes提供的用于访问底层pod的抽象。服务可以有各种"类型",包括ClusterIP、NodePort和LoadBalancer。默认情况下,服务类型LoadBalancer使用托管Kubernetes集群的云提供商创建面向公共的负载平衡器。具有治理需求的组织通常不希望直接使用云提供商的负载平衡器将这些Kubernetes服务公开给公共互联网。这些组织中的操作员可能希望限制创建LoadBalancer类型的服务。他们可能希望检查需要配置面向公共的负载平衡器的请求。让我们看看一个可以强制执行此限制的哨兵策略的示例。考虑使用Terraform管理的pod和服务示例:提供者"kubernetes"{}资源"kubernetes_pod""nginx"{元数据{name="nginx吊舱"标签{app="nginx"}}规格{集装箱{图像="nginx:1.7.8版"name="nginx"港口{集装箱港口=80}}}}资源"kubernetes_service""nginx"{元数据{name="nginx"}规格{选择器{#正在引用NGINX吊舱标签app="${kubernetes公司_pod.nginx.metadata.0。标签.app}"}港口{端口=80目标端口=80}类型="${可变服务类型}"}}变量"服务类型"{default="负载平衡器"}上面的示例定义了一个NGINX pod,并使用类型为LoadBalancer的"NGINX"服务在端口80上公开它。但是使用Sentinel,我们可以强制在Kubernetes中只创建NodePort或ClusterIP类型的服务,这可以使用以下Sentinel策略来实现:导入"tfplan"允许的服务类型=["节点报告","ClusterIP",]//函数的service_type_查找服务"type"的值//在kubernetes资源中service_type_for=func(资源){对于资源,如数据{对于数据,如{对于v。应用规范as规格{返回spectype"]}}}return false//未指定服务"type"时为false}//kubernetes_services函数返回"kubernetes"资源的列表kubernetes_服务=功能(){服务=[]//迭代地形平面图中的所有资源//查找"kubernetes_service"资源为tfplan.resources公司作为类型,资源{如果类型为"kubernetes_服务"{服务+=[资源]}}return services//返回Terraform计划中的kubernetes服务列表}//主要是哨兵政策执行的切入点主=规则{//迭代Terraform计划中的所有Kubernetes服务所有kubernetes_services()作为服务{//对于每个Kubernetes服务,检查是否允许服务类型允许的服务类型中的(服务)的服务类型}}上面的策略遍历所有作为Terraform计划一部分的kubernetes服务,并验证它们是否属于NodePort或ClusterIP类型,以便策略检查成功。操作员可以使用强制模式来确定如果策略失败会发生什么。在这种情况下,他们可能希望使用"软强制",因为它需要具有适当权限的操作员来覆盖任何策略失败。这种强制模式提供了一种很好的方法来验证和保持用户请求的服务。下面是使用Terraform Enterprise和Sentinel执行此策略的屏幕截图。»复制控制器上的策略强制在Kubernetes中使用复制控制器是一种常见的做法,以保持一定数量的pod始终在集群中运行。此编号是使用复制控制器中的副本定义的。但是用户向Kubernetes提交请求时可能会错误地提供副本的值。这种错误的后果可能导致集群被为复制控制器管理的pod保留的资源过度利用。操作员可能希望强制执行复制控制器中允许的最大副本数。让我们看看哨兵政策是如何实施这种限制的。考虑使用Terraform管理的复制控制器:提供者"kubernetes"{}资源"kubernetes_replication_controller""nginx"{元数据{name="nginx示例"标签{app="nginx示例"}}规格{副本="${变量副本}"选择器{app="nginx示例"}模板{集装箱{图像="nginx:1.7.8版"name="nginx"港口{集装箱港口=80}资源{限制{cpu="0.5"内存="512Mi"}请求{cpu="250米"内存="50Mi"}}}}}}#NGINX-kubernetes服务规范资源"kubernetes_service""nginx"{元数据{name="nginx示例"}规格{选择器{#正在引用NGINX吊舱标签app="${kubernetes_复制_controller.nginx.metadata.0。标签.app}"}港口{端口=80目标端口=80}type="节点报告"}}变量"副本"{默认值=15}上面的示例定义了一个管理NGINX pod的复制控制器。复制控制器指定在Kubernetes集群中运行15个pod副本。"nginx"服务用于访问nginx pods。操作员可能希望通过使用以下Sentinel策略强制在复制控制器中指定的最大副本数:导入"tfplan"//函数的replicas_查找"replicas"的值//在kubernetes资源中replications_for=func(资源){对于资源,如数据{对于数据,如{对于v。应用规范as规格{return int(specreplicals"])}}}return false//未指定副本时返回false}//kubernetes_replication_controllers函数返回//"kubernetes_replication_controller"资源kubernetes_replication_controllers=func(){复制控制器=[]//迭代地形平面图中的所有资源//查找"kubernetes_replication_controller"资源为tfplan.resources公司作为类型,资源{如果类型为"kubernetes_replication_controller"{复制控制器+=[资源]}}//返回kubernetes复制控制器的列表//在地形图上找到的返回复制\u控制器}主=规则{//迭代Terraform计划中的所有复制控制器资源所有kubernetes_replication_controllers()作为复制\u控制器{//对于每个复制控制器,请检查复制副本是否小于10(复制控制器)的副本