从2000年FREEBSD( 一种可免费使用的UNIX操作系统 ) 亮相,容器技术不断发展,到如今,容器已牢牢占据着现代软件交付的中心地位。Kubernetes是当今容器编排的事实上的标准,并且是容器化领域中最好的。正如预测的那样,到2023年,全球70%以上的企业将运行两个或多个容器化应用程序。
但是,Kubernetes目前仍然很复杂。即使Kubernetes在测试环境中运行平稳,在生产环境中也需要谨慎地运行它,以避免出现陷阱。
如果考虑在你的环境中使用Kubernetes,请注意以下几个方面:
Kubernetes挑战
掌握复杂性
部署完整的K8S基础架构时,需要配置的组件数量众多,使得部署过程变得复杂艰巨:
DNS设置:需要考虑和某些Linux发行版是否发生冲突,还有DNS搜索限制等。
负载均衡:需要考虑许多因素,例如在托管的K8S或外部负载均衡器之间进行选择。
资源约束:可以在容器,节点甚至命名空间级别定义资源约束,每种约束都有其优缺点。
基于角色的访问控制(RBAC):跨多个Pod,节点和名称空间的“角色”和“集群角色”需要进行认真规划和实施。
监测指标:尽管K8S提供了有关容器,pod,服务和集群级别的应用程序资源使用的详细信息,但是应用程序监视分散在多个应用程序和工具中,汇总起来比较麻烦。
加强安全性
在K8S环境中实施安全性,需要考虑到由于部署微服务而导致软件的攻击面增加。K8S虽然易于部署,但无法严格管理和控制它们会产生新的漏洞。需要考虑的一些要素是:
镜像的安全
节点访问控制
网络隔离
API管理
统一身份认证服务
集成以上这些元素所涉及的复杂性也常常被低估,并导致许多安全漏洞。根据2020年有关“Kubernetes安全状态”的研究“ ,94%的受访者在过去12个月内在其Kubernetes和容器环境中经历了安全事件。
K8S漏洞–在容器化环境中,攻击者可以使用“特权容器( privileged containers )”来获得特权。特权容器是指具有主机所有功能的容器。因此,获得对此类容器的访问权限可以授予攻击者权限,并可以访问所有主机资源。
扩展实例– K8S的生产环境中经常需要快速扩展数百个Pod,如果无效的监视和日志记录可能会导致无法诊断故障。
自动伸缩–配置垂直,水平或组合的自动伸缩过程需要对所需资源范围(节点的最小和最大CPU和内存)进行深入评估。
更新:当社区发布K8S的新版本时,如果需要升级生产集群,最好不要导致应用程序宕机。
资源管理–没有设置资源限制,会带来宕机的风险。
监视–有效监视系统运行信息,对于故障诊断至关重要。
Kubernetes 最佳实践
但是,我们可以采用一些最佳实践,来在生产环境中安全地操作K8S:
使用非Root权限运行容器:如果容器发生破坏,Root权限的容器会扩大风险。
实施RBAC:正确配置RBAC策略,以确保它们至少满足K8S的最低要求,并且最好根据特定的角色访问资源,以最大程度地提高安全性。
实施全面的测试:在部署生产环境之前,必须系统地运行包括功能测试,用户测试和负载测试在内的全面测试。
滚动升级避免使用latest 标签。
配置CI/CD-流水线:正确配置CI/CD流水线对于提高软件质量和安全性,以及加快发布速度至关重要。自动化的集成和部署工具可以帮助实现这一点。
镜像仓库和部署管理:确保将Docker镜像安全地存储在镜像仓库中,可以启用镜像管理工作流。适当的管理,可确保镜像签名,安全性,LDAP集成等方面的一致性。使用部署管理器(例如Helm)可以简化基于K8S的应用程序定义,安装和升级阶段的管理。
使用Pod安全策略(PSP):Pod Security Policies(PSP)是集群级的Pod安全策略,自动为集群内的Pod和Volume设置Security Context。。
镜像扫描:尤其是在使用外部镜像之前,首先需要对其进行扫描可降低引入漏洞的风险。另外,Kubei是一个不错的新工具,它“仅扫描在运行时部署的镜像,它取代了扫描整个镜像仓库。”
使用Service Mesh(服务网格):服务网格有助于确保服务交互经过授权,认证,从而确保通信安全。
使用指标,CPU状态和仪表板来衡量运行状况:无效的监视和日志记录可能导致无法诊断软件故障。
译文链接: https://dzone.com/articles/the-challenges-of-adopting-k8s-for-production-and