jjzjj

实施虚拟 Kubernetes 集群时的关键注意事项

赵立京 2023-03-28 原文

在 Kubernetes 环境中,多租户是指在开发和测试等环境中,多个团队、应用程序或用户之间共享一个大型集群,主要是为了降低管理多个集群的成本和运营开销。多租户正在成为平台团队部署 Kubernetes 基础设施的基本要求。

使用 Kubernetes 命名空间实现多租户

到目前为止,实现多租户的最流行的方法是使用 Kubernetes 命名空间。Kubernetes 命名空间提供了一种简单的方法来划分一组资源,例如 Pod、服务和部署,这些资源只能在该命名空间内访问。

平台团队通常管理和操作集群,并具有完全集群级别的权限。它们通过创建一个或多个特定于每个团队、应用程序、用户的命名空间,并限制作为开发人员、DevOps 工程师和应用程序所有者的最终用户对这些命名空间的访问来实现多租户。最终用户只能执行特定于他们拥有所有权的命名空间的操作。这适用于绝大多数多租户用例。在这里,vcluster 框架可能很有用。

使用 Vcluster 开源框架的多租户

在某些极端情况下,限制最终用户仅访问命名空间不太合理,因为最终用户需要访问集群范围对象(如 CRD、入口控制器、集群 API 服务器等),来进行日常开发工作。通常,参与开发自定义资源和自定义控制器以扩展 Kubernetes API、准入控制器以实现变异和验证 Webhook ,以及其他可能需要自定义 Kubernetes 配置服务的用户需要集群级访问权限。虚拟集群(vcluster)是一个开源框架,旨在解决这个问题。vcluster 本质上是一个可以在物理集群中创建的虚拟集群。

默认情况下,Vcluster 在每个虚拟集群实例的主机集群命名空间中安装 K3s 集群(可选为 k0s、k8s 和 EKS),并安装 API 服务器、控制器管理器、存储后端和(可选)调度程序等核心 Kubernetes 组件。最终用户与虚拟群集 API 服务器交互并获得对虚拟群集的完全访问权限,但是仍保持资源隔离和安全性,因为他们仅限于主机命名空间,并且无权访问主机群集 API 服务器。平台团队在主机群集中创建命名空间,为主机命名空间配置资源配额和策略,创建虚拟群集实例,并将虚拟群集移交给最终用户。

部署 Vcluster 之前要回答的关键问题

虽然为一小组最终用户部署 vcluster 相当简单,但在进行大规模 vcluster 部署之前,平台团队必须要清晰的了解以下问题,并围绕 vcluster 实施其他解决方案,才能满足其组织的自动化、安全性、治理和合规性要求:

1、如何为每个命名空间创建主机级命名空间和资源配额,并将其映射到内部用户、团队?

平台团队仍然需要命名空间级多租户的解决方案,因为必须先创建主机命名空间才能部署 vcluster 实例。

2、如何自动执行 vcluster 的生命周期管理以应对大规模使用?

平台团队需要解决诸如创建、修改、删除虚拟集群实例、向最终用户公开虚拟集群 API 服务器(使用入口或负载均衡器)、将虚拟集群 Kubeconfig 文件安全地分发给最终用户以及升级虚拟集群实例 (K3), 以应对软件更新和安全漏洞等问题。

3、如何确保每个虚拟集群中仅运行已批准和授权的群集范围服务?是否在每个虚拟集群中部署它们?如何保证没有漂移?

这些服务通常包括安全插件、日志记录、监控、服务网格、入口控制器、存储插件等。

4、如何在命名空间级别为主机命名空间创建网络策略?

由于物理群集可能在多个 BU 和应用程序团队之间共享,因此仍然需要此级别的网络隔离,这需要在主机命名空间之间进行网络隔离。

5、如何在每个虚拟集群中实施 OPA 等安全策略?是否需要在每个虚拟群集中部署这些策略?

大多数平台团队会根据其安全团队的建议标准化一组安全策略,并将其部署到每个集群中,来保持安全状况。

6、如何检索每个虚拟集群的 Kubectl 审核日志?

对于某些组织来说,Kubectl 审计是一项关键要求,无论在什么样的环境中都是如此。

7、如何处理成本分配?

由于资源由不同的开发团队共享,因此它们可能属于不同的成本中心,平台团队需要实施适当的按存储容量使用计费策略,来进行成本分配。

8、如何让其他开发人员工具(如ArgoCD)与vcluster一起工作?

像ArgoCD这样的GitOps工具需要集群访问才能部署应用程序,必须在ArgoCD中配置每个vcluster实例,以便最终用户利用ArgoCD GitOps部署。这可能适用于其他常用工具,例如可观测性、日志记录和监视工具。

9、每个 vcluster 实例会产生哪些额外的资源和运营开销?

每个虚拟集群本质上都是一个 K3s/K8s 集群,其中包含所有附加组件,例如安全插件、日志记录插件、监控插件、入口控制器等。当部署更多虚拟集群实例时,每个 vcluster Kubernetes 资源和加载项可能会产生大量开销。同样,由于每个虚拟集群本质上都是一个 Kubernetes 集群,因此平台团队可能会产生额外的开销来管理这些集群,来进行 Kubernetes 版本更新、补丁管理和附加组件管理。

10、vcluster 是否与实际生产环境相匹配?

对于某些组织,开发环境必须与生产环境紧密匹配。vcluster 支持其他发行版,例如 K8s 和 EKS,但平台团队必须检查它是否等效于为接近生产环境的用例运行独立集群。例如,EKS 支持许多高级功能,包括第三方 CNI、各种存储类、自动扩展、IRSA 和附加组件,这些功能在虚拟 EKS 集群中可能不可用。

结论

对于大多数平台团队来说,基于命名空间的多租户以及围绕命名空间生命周期管理、安全性和成本控制的额外自动化,可以解决其多租户用例。vcluster 解决了 Kubernetes 命名空间多租户中的一个特定差距,没有集群级别权限的最终用户可以访问其虚拟集群中的集群范围对象。平台团队必须在内部验证其最终用户是否存在此类要求,根据其安全性、合规性和治理要求,进行彻底的成本效益分析,并围绕它实施额外的自动化操作,以确保它的成功部署。

有关实施虚拟 Kubernetes 集群时的关键注意事项的更多相关文章

  1. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  2. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  3. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  4. ruby-on-rails - 如何从过时的 TZInfo 标识符中获取 Rails TimeZone 名称? - 2

    已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb

  5. ruby - Ruby 的 AST 中的 'send' 关键字是什么意思? - 2

    我正在尝试学习Ruby词法分析器和解析器(whitequarkparser)以了解更多有关从Ruby脚本进一步生成机器代码的过程。在解析以下Ruby代码字符串时。defadd(a,b)returna+bendputsadd1,2它导致以下S表达式符号。s(:begin,s(:def,:add,s(:args,s(:arg,:a),s(:arg,:b)),s(:return,s(:send,s(:lvar,:a),:+,s(:lvar,:b)))),s(:send,nil,:puts,s(:send,nil,:add,s(:int,1),s(:int,3))))任何人都可以向我解释生成的

  6. ruby - 为什么 return 关键字会导致我的 'if block' 出现问题? - 2

    下面的代码工作正常:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson)do|key,oldv,newv|ifkey==:aoldvelsifkey==:bnewvelsekeyendendputskerson.inspect但是如果我在“ifblock”中添加return,我会得到一个错误:person={:a=>:A,:b=>:B,:c=>:C}berson={:a=>:A1,:b=>:B1,:c=>:C1}kerson=person.merge(berson

  7. ruby - 在 Ruby 中跳过额外的关键字参数 - 2

    我定义了一个方法:defmethod(one:1,two:2)[one,two]end当我这样调用它时:methodone:'one',three:'three'我得到:ArgumentError:unknownkeyword:three我不想从散列中一个一个地提取所需的键或排除额外的键。除了像这样定义方法之外,有没有办法规避这种行为:defmethod(one:1,two:2,**other)[one,two,other]end 最佳答案 如果不想写**other中的other,可以省略。defmethod(one:1,two:2

  8. ruby - 比较 rspec 中的 float 时的奇怪行为 - 2

    以下测试中的第3个失败:specify{(0.6*2).shouldeql(1.2)}specify{(0.3*3).shouldeql(0.3*3)}specify{(0.3*3).shouldeql(0.9)}#thisonefails这是为什么呢?这是浮点问题还是ruby​​或rspec问题? 最佳答案 从rspec-2.1开始specify{(0.6*2).shouldbe_within(0.01).of(1.2)}在那之前:specify{(0.6*2).shouldbe_close(1.2,0.01)}

  9. ruby-on-rails - Rails 验证虚拟属性 - 2

    我这个模型:classBunny每当我提交一个表单来创建这个模型时,我都会收到以下错误:#的未定义方法“number_before_type_cast” 最佳答案 我通过将此方法添加到我的Bunny模型中解决了这个问题:defnumber_before_type_castnumberend我不喜欢它,但我想在有人发布更好的解决方案之前它会起作用。 关于ruby-on-rails-Rails验证虚拟属性,我们在StackOverflow上找到一个类似的问题: h

  10. ruby - 使用 Nokogiri 替换时的编码问题 - 2

    我有这个代码:#encoding:utf-8require'nokogiri's="CaféVerona".encode('UTF-8')puts"Originalstring:#{s}"@doc=Nokogiri::HTML::DocumentFragment.parse(s)links=@doc.css('a')only_text='CaféVerona'.encode('UTF-8')puts"Replacementtext:#{only_text}"links.first.replace(only_text)puts@doc.to_html但是,输出是这样的:Originals

随机推荐