• [公告] AtomHub开源容器镜像中心开放公测
    12月16日-17日,以“一切为了开发者”为主题的开放原子开发者大会在无锡举办。会上,由开放原子开源基金会主导,华为、浪潮、DaoCloud、谐云、青云、飓风引擎以及OpenSDV开源联盟、openEuler社区、OpenCloudOS社区等成员单位共同发起建设的AtomHub可信镜像中心正式开放公测。AtomHub秉承共建、共治、共享的理念,旨在为开源组织和开发者提供中立、开放共建的可信开源容器镜像中心。AtomHub可信镜像中心正式公测平台地址:https://atomhub.openatom.cn/▍背景容器技术是云原生生态的基石,随着云原生技术在千行百业大规模落地和快速发展,容器镜像已经成为云原生应用分发的关键形态。开源容器镜像安全可靠的传播和分享,对云原生技术生态的繁荣有巨大促进作用。由于Docker Hub等镜像仓库的不稳定性和不可控性,以及一些政策和法规的限制,开发者们使用这些镜像仓库时也面临着种种问题和困难。网络不稳定:包括Docker Hub在内的多数容器镜像托管平台,服务器都位于海外,国内用户在访问时经常会遇到网络延迟和丢包的问题,导致镜像的上传和拉取频繁超时或请求失败。镜像拉取被限流:以Docker Hub为例,匿名用户6小时内只能拉取镜像100次,而注册登录的免费用户每6小时也只能拉取镜像200次,严重影响了镜像构建和应用部署的效率。缺失中立平台:国内用户缺失中立的镜像分享平台,构建镜像上传到Docker Hub再从国内下载受限制,影响容器镜像在中国的分享和传播。▍AtomHub定位鉴于上述原因,打造一个中立、开放共建的可信开源容器镜像中心,成为了当前亟待解决的问题。AtomHub项目——开源容器镜像中心由此发起,旨在为开发者提供来源真实、生态开放、平台中立、安全可信的新一代开源容器镜像中心。▍AtomHub架构AtomHub将采用镜像评级机制,确保镜像质量和安全性。官方镜像是由AtomHub官方发布的镜像,具有最高度可靠性和安全性,涵盖各种流行的操作系统、编程语言、数据库、中间件和应用程序;认证社区镜像由经过认证的开源社区发布,符合社区的质量标准和安全规范;认证厂商镜像则由经过认证的软件厂商发布,具有较高可靠性和专业性。与此同时,AtomHub还支持开发者自行构建和发布镜像,以满足个性化的需求。AtomHub将基于国产操作系统和软件打造自主可信根镜像、可信全链路构建系统,支持安全漏洞扫描和内容合规检测,及时发现和修复镜像漏洞和安全风险,确保镜像层层安全可信,重建可持续容器镜像供应链。AtomHub计划采用高性能镜像存储后端、多云CDN同步、冷热数据自动转储分流等关键技术,打造百万级并发规模容器镜像分发平台,为用户提供稳定可靠的镜像下载服务。▍AtomHub五大战略规划安全性:AtomHub将提供一套完善的安全机制,包括镜像签名、漏洞扫描和内容合规检测等功能,确保镜像安全可靠。高性能:AtomHub将采用高性能存储引擎和多云CDN加速,为您提供高速的镜像拉取和推送体验。易用性:AtomHub将会提供用户友好的Web界面,支持关键词搜索、分类浏览和镜像智能推荐,方便用户快速找到和下载所需镜像。兼容性:AtomHub采用OCI标准,兼容Docker Hub生态,可以无缝对接您现有的容器编排和持续集成/持续部署(CI/CD)工具。开放性:AtomHub将完全开源,打造一个开放、中立、透明的容器镜像共享平台,允许所有爱好者共同参与项目的开发、维护和使用。AtomHub作为一个新兴的开源容器镜像中心项目,对中国本土云原生技术和开源生态良性循环有巨大促进作用,我们欢迎所有对开源和容器技术感兴趣的开发者们加入我们的社区,一起打造安全可靠、高效便捷的容器镜像中心!AtomHub可信镜像中心平台地址https://atomhub.openatom.cn/首批提供160+款基础软件容器镜像,包含操作系统,编程语言,主流中间件等,欢迎体验!更多镜像陆续增加中
  • [大咖交流] 华为云@OADC 2023,共建云原生未来生态
    12月16日-17日,以“一切为了开发者”为主题的开放原子开发者大会在江苏无锡举办。秉持“共建、共治、共享”原则,聚焦大模型、云原生、前端、自动驾驶、物联网、开源治理与开发者运营等多领域内容,大会汇聚百万开发者生态,集聚政、产、学、研、用、金、创、投等各方力量,云集全球技术专家和行业大咖,持续推动软件生态蓬勃发展。华为云重磅参会开幕式、云原生分论坛、展区等多个环节,共同推进开源与云原生产业发展。▍开放原子云社区正式成立开幕式上,开放原子开源基金会理事长孙文龙与北京航空航天大学、华为技术有限公司、阿里巴巴集团控股有限公司、深圳市腾讯计算机系统有限公司、招商银行股份有限公司、京东科技信息技术有限公司代表共同启动成立开放原子云社区。▲开放原子云社区成立仪式北京航空航天大学的胡春明教授当选担任开放原子云社区主席,华为技术有限公司王泽锋,阿里巴巴集团控股有限公司丁宇,深圳市腾讯计算机系统有限公司邹辉,招商银行股份有限公司罗文江分别当选开放原子云社区副主席。开放原子云社区的成立,将通过凝聚云原生产学研用各方力量,共同推动我国云产业高质量发展。未来,该社区将围绕云原生技术路线图及生态全景规划、发掘孵化优质项目形成完整技术栈、培育壮大国内云原生开源生态、积极开展人才培养和国际合作等方面,推动云计算行业迈入“云上价值挖掘”的新阶段,重塑云计算产业价值链。▍AtomHub可信镜像中心正式公测由开放原子开源基金会牵头,开放原子云社区多家成员单位共同建设的AtomHub可信镜像中心在本次大会上正式开放公测。▲ AtomHub可信镜像中心正式公测AtomHub可信镜像中心由开放原子开源基金会牵头,华为、浪潮、DaoCloud、谐云、青云、飓风引擎以及OpenSDV开源联盟、openEuler社区、OpenCloudOS社区等成员单位共同发起,秉承共建、共治、共享的理念,旨在为开源组织和开发者提供中立、开放共建的可信开源容器镜像中心。▲ AtomHub可信镜像中心首批共建单位&社区▍云原生技术前沿落地实践论坛大会的“云原生技术前沿落地实践论坛”由CNCF基金会大使、技术监督委员会贡献者及多个项目创始人王泽锋担任出品,复旦大学计算机科学技术学院副院长、教授、博士生导师彭鑫,网易资深云原生专家侯诗军,腾讯云容器技术专家孟凡杰,蚂蚁集团高级研发工程师王思远,蚂蚁集团算法专家徐剑,华为云云原生团队开源技术专家徐中虎,开源项目 Serverless Devs 联合发起人、项目负责人袁坤,通明智云产品总监单雷,DaoCloud大容器团队技术负责人张潇,DaoCloud大容器团队开发工程师涂立海分别带来议题分享。云原生论坛议题聚焦云原生架构的创新与演进、云原生中间件的稳定性与可靠性、云原生的智能化运维与告警、云原生的FinOps实践、云原生Serverless架构与研发体验等多领域,为参会者提供全面视角和实践分享。▲云原生技术前沿落地实践论坛嘉宾合影在《融入未来:分布式云原生架构演进》的主题演讲中,华为云云原生团队核心成员、开源技术专家徐中虎分享了分布式云原生的发展历史与挑战,分布式云原生架构的演进,华为云Kurator项目在分布式云原生领域的创新。Kurator源于华为云在分布式云原生架构演进过程中多年探索,借助Kurator快速构建分布式云原生平台,可以帮助用户快速构建、部署、监控分布式云原生应用。▲华为云云原生团队核心成员、开源技术专家徐中虎▍Kurator分布式云原生开源社区展区Kurator是一款打造统一分布式云原生基础设施的开源套件。项目整合Karmada、KubeEdge、Volcano、Kubernetes、Istio、Promethus等业界主流开源技术栈,提供多云、多集群统一编排,统一调度,统一流量治理,边云协同,统一监控运维等核心能力,助力企业业务跨云跨边,分布式化升级。社区地址:cid:link_0▲Kurator分布式云原生开源社区随着云原生产业的不断发展,如何从战略全局去规划软件产业高质量发展,充分发挥开源生产方式的作用,是加快推进新型工业化发展的一大命题。社会各界都在整个过程中发挥着环环相扣的力量,而各行各业的开发者和使用者是数字时代创造知识、沉淀知识的主力军,开发者活力是软件产业繁荣发展最直接、最生动的体现。大会倡议,深化交流互鉴,聚焦产业亟需,增添发展动力,加强国际合作,做好服务保障。希望社会各界关注开源、拥抱开源、支持开源,深刻认识开源价值,为开发者提供服务,特别是在资产评估、价值认定、集成创新方面予以重点支持。也希望广大开发者和使用者能积极贡献智慧与力量,以时代责任应对共同挑战,以实干担当开创美好未来。更多云原生技术动向关注容器魔方添加小助手k8s2222进入技术群
  • [问题求助] 如何选择适合自己业务需求的弹性计算服务?
    如何选择适合自己业务需求的弹性计算服务?
  • [公告] 新一代云原生可观测平台之华为云CCE集群健康中心
    "Kubernetes运维确实复杂,这不仅需要深入理解各种概念、原理和最佳实践,还需要对集群的健康状态、资源利用率、容器的稳定性等多个方面进行风险评估。当集群出现故障时,我们通常需要花费大量时间来分析各种日志和监控信息,以找出问题的根本原因。"一位IT公司运维总监如此说道。近年来,越来越多的公司转向了基于Kubernetes的云原生架构。随着微服务和云原生架构的变得越来越复杂,我们也收到不少客户反馈在生产中进行监控和故障排除变得越来越困难。虽然CCE云原生可观测平台提供了监控、告警、日志等功能,能够让用户更加方便的定位问题,但是同样也无形中提高了运维人员的技术门槛。为了让运维和开发人员能够从繁重的故障定位排查中解脱出来,CCE服务提供了集群健康诊断能力。CCE集群健康诊断集合了容器运维专家的经验,为您提供了集群级别的健康诊断最佳实践。可对集群健康状况进行全面检查,帮助您及时发现集群故障与潜在风险,并给出对应的修复建议供您参考。▎开箱即用:免开通零依赖,一键健康诊断集群健康诊断功能作为CCE内置健康专家系统,可以在不依赖任何插件和其他服务的情况下独立运行。用户无需繁琐的开通与配置流程,就可以一键触发集群健康诊断。图1 一键健康诊断▎定时巡检:无人值守,持续守护集群健康在主动运维场景,比如集群升级前后或业务重保期间,用户可随时主动触发健康诊断来保障业务的顺利运行。另一方面,在日常运维中,我们无法一直盯屏保障,为了将客户从这种低级的劳动中解放出来,健康诊断支持定时巡检功能,只需要简单的配置定时任务,健康诊断任务就可以在后台守护您的集群健康,并将检查结果定时存档,方便随时回溯复盘。图2 健康检查结果▎多维诊断:丰富的诊断项,集群全方位体检CCE集群健康诊断提炼了运维专家提供的高频故障案例,覆盖了集群/核心插件/节点/工作负载/外部依赖等多种维度的健康检查,并且所有的诊断项都给出了风险评级、影响风险、以及修复建议。集群维度:包括集群运维能力检查,安全组配置检查,集群资源规划检查等诊断项。图3 集群维度诊断项核心插件维度:覆盖监控、日志、coredns、存储等核心插件的健康检查。图4 核心插件维度诊断项节点维度:包括节点资源负载情况和节点状态诊断。图5 节点维度诊断项工作负载维度:包括工作负载配置检查,Pod资源负载检查,Pod状态诊断等。图6 工作负载维度诊断项外部依赖维度:主要包括ECS和云硬盘等资源配额检查。图7 外部依赖维度诊断项▎智能分析:智能健康评级,专业修复建议CCE集群健康诊断会针对故障和潜在风险,给出风险等级并提供修复建议。风险等级按照紧急程度分为高风险和低风险两种:高风险:说明该诊断项会危及到集群或应用稳定性,可能造成业务损失,需要尽快修复。低风险:说明该诊断项不符合云原生最佳实践,存在潜在的风险,但是不会马上对业务造成重大影响,建议修复。在每一次健康诊断完成之后,所有的诊断结果会被汇总分析,并给出最终的集群健康评分,该评分反映了集群的整体健康状况。健康评分较低的集群往往存在较大的故障风险,需要引起集群管理员的高度重视。图8 健康风险等级评估▎案例分析:一次安全组误操作导致的业务故障CCE作为通用的容器平台,安全组规则的设置适用于通用场景。集群在创建时将会自动为Master节点和Node节点分别创建一个安全组。如果用户不小心误操作了默认安全组中的规则,可能会导致节点网络不通等问题,而且这种问题往往比较难以排除,需要花费较多的时间才能定位到安全组的原因,影响业务恢复速度。这种情况我们可以通过健康中心的巡检功能来进行故障诊断。例如修改一个集群的默认安全组规则,将Master与Node通信规则,从允许改为拒绝。图9 修改安全组规则以上操作会导致集群部分功能异常,如网络不通出现无法执行kubectl命令的问题。这种问题往往难以排查,会消耗用户大量的时间来寻找根因。此时如果用户在CCE健康中心执行一次健康巡检,会发现安全组高风险巡检项提示:图10 安全组异常提示通过诊断详情可以直接定位异常安全组,便于进行针对性修复:图11 定位异常安全组整个故障诊断流程方便快捷,可以大幅减低故障排查时间,帮助客户业务更稳定的运行在CCE集群上。▎结语CCE集群健康诊断功能,集成沉淀了大量的专家运维经验,目标是为客户提供更加智能、快捷的运维能力。当前该能力依然在快速迭代,后续我们会增加巡检结果通知、风险评估阈值调整以及更丰富的诊断项等能力,为大家带来更智能、更可靠稳定的云原生系统。服务体验请访问cid:link_0云容器引擎 CCE
  • [公告] Kuasar成为CNCF官方项目,探索容器运行时新纪元!
    北京时间12月20日,云原生计算基金会(CNCF)正式接纳多沙箱容器运行时项目 Kuasar(cid:link_0)。Kuasar的加入,极大地推动了云原生领域容器运行时技术的探索、创新和发展。作为CNCF首个多沙箱容器运行时项目,Kuasar于2023年4月在KubeCon + CloudNativeCon Europe上由华为云、中国农业银行以及openEuler社区、WasmEdge社区和Quark Containers社区联合发起。Kuasar融入了各企业和社区在容器运行时领域的前沿探索、技术积累和生产实践,开源至今受到业界的广泛关注和支持,已收获900多个GitHub Star和70多个Fork,数十位来自外部企业、高校的开源爱好者参与开发贡献和积极落地应用,Kuasar正以开源创新的姿态促进云原生产业发展。“WebAssembly正在快速成为云原生技术栈的一个关键部分,Kuasar深度集成了高性能、轻量级的WasmEdge沙箱,Kuasar的加入使得WebAssembly生态和CNCF生态联系更加紧密,未来WasmEdge和Kuasar将共同推动在大模型、边缘计算和函数计算等领域的发展。”—— WasmEdge项目创始人  Michael Yuan“openEuler社区在Kuasar项目发布之初就率先完成与Kuasar多沙箱生态的对接,推出基于iSulad + Kuasar + StratoVirt的极速轻量安全容器解决方案。未来openEuler社区将继续深化与CNCF社区项目的合作,为用户提供更轻量、更安全、更多样的容器化底座。”—— openEuler技术委员会主席  胡欣蔚“Kuasar项目融入了华为云在容器运行时领域多年的积累,结合了社区合作伙伴的实践经验。成为CNCF官方项目,表明了Kuasar社区开放治理的决心,致力于为企业和开发者提供厂商中立、多方协作的开放环境,促进各种沙箱技术的商用成熟,为用户带来极致体验。”—— CNCF官方大使  华为云云原生开源团队负责人  王泽锋“云原生场景多样化促进了多种沙箱技术的蓬勃发展,沙箱技术接入北向生态成为普遍需求,Kuasar推动了Containerd中沙箱技术标准的统一,提供了多种沙箱技术实现,为CNCF的容器运行时板块注入了新鲜活力。”——  CNCF官方大使  Containerd社区维护者  蔡威▍Kuasar项目介绍为了满足企业在云原生场景下的诉求,业界出现了多种沙箱容器隔离技术。然而,应用云原生的沙箱技术仍面临挑战。一方面,各类云原生场景对沙箱提出更高要求,单一沙箱无法同时满足用户云上业务对安全隔离、极速低噪、标准通用等多个维度的要求,企业面临云原生业务场景全覆盖问题;另一方面,支持多类沙箱带来运维压力显著上升,当前业界沙箱技术对接容器运行时的实现缺乏统一开发框架,因此关键日志、重要事件、沙箱管理逻辑等均存在差异,新引入沙箱的同时运维压力陡增。Kuasar在保留传统容器运行时功能的基础上,与Containerd社区一起推动新的沙箱接口统一标准,并通过全面Rust化以及优化管理模型框架等手段,进一步降低管理开销,简化调用链路,灵活扩展对业界主流沙箱技术的支持。此外,通过支持多安全沙箱共节点部署,Kuasar可以充分利用节点资源、降本增效,为用户提供更安全高效的沙箱场景解决方案。▲ Kuasar项目全景图南向沙箱方面,Kuasar已支持基于轻量级虚拟化技术的安全容器沙箱(Cloud Hypervisor、Qemu、StratoVirt),基于新兴的WebAssembly沙箱(WasmEdge、Wasmtime),基于进程级虚拟化的App Kernel沙箱(Quark)以及基于内核的原生普通容器沙箱(runC);北向引擎方面,Kuasar已与Containerd联合构建最新的沙箱接口标准,并共同推动该标准在Containerd v2.0版本的完整实现。此外,轻量级容器引擎iSulad项目也已经完成与Kuasar项目的深度集成,支持在openEuler 23.09创新版本上一键部署。▍未来可期此次CNCF正式将Kuasar接纳为官方项目,将极大促进Kuasar上下游社区生态构建及合作。Kuasar将持续探索云原生容器运行时领域技术创新,在企业数字化、云原生转型过程中发挥作用,让基于Kuasar的多沙箱容器运行时方案融入更广泛的云原生技术生态。作为CNCF亚洲唯一创始成员、白金会员,华为云在CNCF贡献量、Kubernetes社区和Istio社区的代码贡献量持续多年稳居亚洲第一,已向CNCF贡献了业界首个云原生边缘计算项目KubeEdge、首个云原生批量算力项目Volcano、首个多云容器编排项目Karmada等多个重量级云原生开源项目,并持续开源Kurator、Kappital、Kmesh等创新项目,与全球云原生社区共同发展。Kuasar社区技术交流地址Kuasar官网:https://kuasar.io项目地址:cid:link_0Twitter: https://twitter.com/Kuasar_io添加社区小助手回复“Kuasar”进入技术交流群
  • [技术干货] 服务器操作系统与 AI 和云计算的结合,将会掀起一股什么样的热潮?
    《国产服务器操作系统发展报告(2023)》称操作系统已步入 2.0 时代,服务器操作系统与 AI 和云计算的结合已是大势所趋,你认为龙蜥开源操作系统在云+AI 的时代面临哪些挑战?对此你有什么看法?
  • [技术干货] 华为云云计算实践设计——使用区块链相关技术实现区块链部署模拟资产变化的实践。
    通过华为云云计算实践——使用区块链相关技术实现区块链部署模拟资产变化的实践可知:区块链具有去中心化,透明度高,安全性,自治性等优点。大致分为四步关键流程:(1)订购区块链服务 :创建VPC,创建CCE,创建BCS。(2)安装及实例化链代码。(3)配置并部署应用:证书下载,SDK配置下载,部署应用。(4)结果验证。从本次实践应用中我们可以得出,区块链的优点如下:(1)去中心化,改变了传统的中心化系统存在单点故障和不可靠性的问题,使得交易记录、数字身份、智能合约等数据的存储和管理不依赖于中心机构,可以在整个网络中共享和验证。(2)透明度:任何人都可以查看分布式账本中的交易记录。这样一来,区块链技术可以提高数据的透明度,减少欺诈行为。(3)安全性:每个区块链节点都会在网络中验证交易并记录到分布式账本中。这些交易记录使用了密码学算法进行加密,使得记录不可篡改,从而保证了交易的安全性。(4)自治性:采用基于协商一致的规范和协议,使各参与方在不需要信任任何人的环境下进行自由安全的交易,排除人为干扰因素达到高度自治。
  • [活动公告] 【进行中 · 问卷调研】开发者技能提升问卷,参与问卷调研,吐露开发者真声!
    亲爱的开发者:您好!在技术不断迭代进化的今天提升编码技能、了解技术前沿对开发者来说尤为重要那么作为开发者的你喜欢什么样的学习形式?觉得现有学习平台有何不便之处?欢迎填写问卷,参与调研让我们了解开发者的学习痛点以便后续更精准的提供有效内容~戳下方问卷填写:https://survey.huaweicloud.com/survey/#/qtn?id=d95fc8286afd427d832950ad323328b8&utm_medium=banner1(耗时大约3-5分钟)活动时间:2023.12.5-2023.1.151、如果你对PaaS、媒体、云原生、EI感兴趣,欢迎观看收藏往期专家直播👉【DTSE Tech Talk】直播回顾汇总,开发者必读的技术公开课干货大合集!2、如果你想持续关注DTSE Tech Talk(华为云开发者联盟推出的技术公开课),可戳下方链接了解👉 DTSE Tech Talk 华为云直播
  • [推广规则] 2023年12月奖励推广规则
    12月奖励推广规则重要信息提示:1、邀请用户注册并完成购买云产品可获基础现金奖励2、本月云推官参加“2023年12月额外奖励活动”,可以自动叠加“基础现金奖励”。①本月新加入云推官本月最多可获得5万元现金奖励(基础奖励)+2000元购物卡盲盒(额外活动推荐客户数奖) + 华为P40 Pro+手机(额外活动消费金额奖)②已经在推广的云推官本月最多可获得8万元现金奖励(基础奖励)+2000元购物卡盲盒(额外活动推荐客户数奖) +华为P40 Pro+手机(额外活动消费金额奖)3、新上线产品“云耀云服务器L实例”,该新品的订单中,以下规格不返利:①应用超市②固定带宽中的“动态BGP流量包”规格对应订单截图举例:​参与本月活动,需先点此加入成为云推官:加入条件:奖励推广活动限华为云官网已实名个人客户参与(渠道以及子客户,NA 客户,以及有专属商务经理对接的客户不参与此活动,且产生的订单不计入返利范围),点击“立即加入云推官”按钮,即刻加入活动开始推荐。有效推荐:推荐产生关联仅适用于新注册用户,关联关系建立后的30天内产生的有效新购订单的累计付费可计入返利,订单实付金额>0元即可计入奖励统计。沟通途径:如有任何推广问题,您可随时添加华为云奖励推广活动企业微信随时沟通,添加企业微信可及时接收最新活动及其他相关动态。本月激励汇总一、基础现金奖励(0元起返)规则介绍:cid:link_1本月新加入云推官最高奖励比例31%,单月奖励封顶5万元老云推官最高奖励比例34%,单月奖励封顶8万元​二、2023年12月额外奖励活动活动时间:2023年12月1日0点 - 2023年12月31日24点活动要求:1、需要加入华为云奖励推广计划成为云推官。2、云推官需在活动时间内通过指定活动报名页进行报名,方可成功参加本月活动。3、云推官成功推荐的客户,注册和购买时间需要在活动限定时间内(2023年12月1日0点 - 2023年12月31日24点)。4、本月活动礼品中的“购物卡”为京东购物卡,“购物卡盲盒”的实际到手面值≥活动描述面值。5、云推官在活动报名页填写正确的邮箱信息,以便后续正常发放和接收“购物卡”。6、活动发放的礼品卡,云推官需在接收后30天内完成绑定,如出现绑定异常,需联系京东客服自行解决。7、如有任何活动问题,您可通过华为云奖励推广官方企业微信沟通交流。活动一:12月推荐客户数额外激励活动条件:条件说明:1、云推官推荐成功的客户,购买的产品需要在《可参加返利产品明细表》中,且订单类型为包年包月或一次性。2、云推官推荐单客户的现金付费金额≥41元。3、礼品数量有限,需先报名参加活动,如果对应礼品区间参与人数大于礼品数,则按“推荐金额”排序向后顺延。云推官专属特惠产品页符合本活动产品举例(更多产品及配置可查看云途观专属特惠页):活动二:11月消费金额额外激励活动条件:条件说明:1、全体云推官,本月推荐付费客户数≥2,且单客户的现金付费≥1000元,可得实物礼品。2、云推官推荐成功的客户,购买的产品需要在《可参加返利产品明细表》中;3、礼品数量有限,需报名参加,如果对应礼品区间参与人数大于礼品数,则按“推荐金额高→低”排序向后顺延。云推官专属特惠产品页符合本活动的特惠产品举例(更多产品及配置可查看云推官专属特惠页):
  • [热门活动] 【活动已下线】2023年12月额外奖励活动
    活动时间:2023年12月1日0点 - 2023年12月31日24点已加入云推官点此快速报名参加本月活动重要提示:1、需要加入华为云奖励推广计划成为云推官。2、云推官需在活动时间内通过活动报名页进行报名,方可成功参加本月活动。3、云推官成功推荐的客户,注册和购买时间需要在活动限定时间内(2023年12月1日0点 - 2023年12月31日24点)。4、本月云推官参加“2023年12月额外奖励活动”,可以自动叠加“基础现金奖励”。。①本月新加入云推官最多可获得5万元现金奖励(基础奖励)+2000元购物卡盲盒(额外活动推荐客户数奖) + 华为P40 Pro+手机(额外活动消费金额奖)②已经在推广的云推官最多可获得8万元现金奖励(基础奖励)+2000元购物卡盲盒(额外活动推荐客户数奖) + P40 Pro+手机(额外活动消费金额奖)5、本月活动礼品中的“购物卡”为京东购物卡,以“盲盒”形式发放,实际到手面值≥活动描述面值。6、云推官在活动报名页填写正确的邮箱信息,以便后续正常发放和接收“购物卡”。7、活动发放的礼品卡,云推官需在接收后30天内完成绑定,如出现异常,请联系京东客服解决。8、如有任何活动问题,您可通过华为云奖励推广官方企业微信沟通交流。活动一:12月推荐客户数额外激励活动条件:条件说明:1、云推官推荐成功的客户,购买的产品需要在《可参加返利产品明细表》中,且订单类型为包年包月或一次性。2、云推官推荐单客户的现金付费金额≥41元。3、礼品数量有限,需先报名参加活动,如果对应礼品区间参与人数大于礼品数,则按“推荐金额”排序向后顺延。活动二:12月消费金额额外激励活动条件:条件说明:1、全体云推官,本月推荐付费客户数≥2,且单客户的现金付费≥1000元,可得实物礼品。2、云推官推荐成功的客户,购买的产品需要在《可参加返利产品明细表》中;3、礼品数量有限,需报名参加,如果对应礼品区间参与人数大于礼品数,则按“推荐金额高→低”排序向后顺延。奖励推广活动规则:1. 本活动仅限华为云官网已实名个人用户参与(渠道以及子客户,NA 客户,以及有专属商务经理对接的客户不参与此活动,且产生的订单不计入返利范围)。2. 购买储值卡订单及消费储值卡余额所产生的订单不计入业绩,使用信用账户、现金券、代金券的扣款部分不计入业绩,业绩只计入扣款后实付金额部分。3.适用产品:可参与返现的产品有弹性云服务器、虚拟私有云、云硬盘、云数据库、企业主机安全、 DDoS高防、分布式缓存服务、管理检测与响应等90款产品。其他产品均不参加返利,另储值卡、资源包、按需套餐包付费订单类型也不纳入返利计算,点击查看更多返利产品4..当月的有效推荐奖励,我们会在次月最后一天统计出您的推广业绩,然后您可以申付到您绑定的银行卡,申付的到账时间一般为3-7个工作日。2020年12月起,推广返利分四个月发放到云推官已通过商业信息认证的银行卡内(返利发放比例为:20%、20% 、 20%、40%),请您务必绑定正确的银行卡信息,以确保返现奖励正常发放。5. 推荐产生关联仅适用于新注册用户,关联关系建立后的30天内(推荐周期)产生的有效新购订单的累计付费可计入返利,推荐金额为活动期间的实际付费金额(续订订单不计为有效订单)。6. 活动的返利结算周期为自然月 。用户可在用户中心—我的推荐查看返利订单及详情。7. 新购实付订单金额>0元的用户方为有效用户,2020年12月起,每月的推广返利将会分四个月发放到您的银行卡内。8. 参与返利的订单将在次月6日被锁定,锁定期为订单时长(锁定时不得降配和退款)。9. 若云推官与用户存在以下任何一种情况:同手机号、同邮箱、同身份证、同设备注册或登录的,则产生的订单不能参与推荐返利。10. 云推官在主体名下(身份证主体)只能有一个华为云账号加入奖励推广计划,注册的其他账号无法加入。11. 推云推官推荐的用户在有效推荐周期内,且在订单锁定前,用户的身份发生变化(如变更为渠道及其子客户,NA客户等),则该用户的推荐无效。12. 如云推官的一个被推荐主体(身份证主体)有注册多个账号与云推官进行关联,则只允许一个账号关联有效,其他关联关系会失效,有效关联账号以最早注册的账号为准。13. 禁止链接劫持、强制**、违反法律法规等的非正当方式推广,须退回佣金;如云推官、用户违反 华为云用户协议,则不返利。14. 本次优惠活动与华为云站内及站外其他优惠活动不重叠,赠送金额不兑现、不开票。15. 华为云员工以及伙伴员工不能参与奖励推广计划。16. 如有问题,可直接发送邮件到 cloudcps@huawei.com 进行咨询。17. 所有参加本活动的用户,均视为认可并同意遵守《华为云用户协议》以及《华为云合作推广协议》。* 推荐奖励说明:1. 累计付费阶梯奖励、额外任务奖励、连续推广奖励的“返点比例”可叠加。2. 有效推广月份:累计推广有效付费金额>0元的月份。3. 参与门槛:自2020年8月1日起,用户每月有效新购订单实付金额>0为有效推广用户。4. 请云推官务必绑定正确的银行卡信息,以确保返现奖励正常发放。5. 自2020年8月1日起,华为云奖励推广计划奖励升级为现金返利,8月以后参与推广产生的订单即可获得现金返利,8月前推广的订单依旧按历史规则返京东E卡或代金券。
  • Istio Egress 出口网关使用
    前面我们了解了位于服务网格内部的应用应如何访问网格外部的 HTTP 和 HTTPS 服务,知道如何通过 ServiceEntry 对象配置 Istio 以受控的方式访问外部服务,这种方式实际上是通过 Sidecar 直接调用的外部服务,但是有时候我们可能需要通过专用的 Egress Gateway 服务来调用外部服务,这种方式可以更好的控制对外部服务的访问。Istio 使用 Ingress 和 Egress Gateway 配置运行在服务网格边缘的负载均衡,Ingress Gateway 允许定义网格所有入站流量的入口。Egress Gateway 是一个与 Ingress Gateway 对称的概念,它定义了网格的出口。Egress Gateway 允许我们将 Istio 的功能(例如,监视和路由规则)应用于网格的出站流量。使用场景比如有一个对安全要求非常严格的团队,要求服务网格所有的出站流量必须经过一组专用节点。专用节点运行在专门的机器上,与集群中运行应用程序的其他节点隔离,这些专用节点用于实施 Egress 流量的策略,并且受到比其余节点更严密地监控。另一个使用场景是集群中的应用节点没有公有 IP,所以在该节点上运行的网格服务都无法访问互联网,那么我们就可以通过定义 Egress gateway,将公有 IP 分配给 Egress Gateway 节点,用它引导所有的出站流量,可以使应用节点以受控的方式访问外部服务。接下来我们就来学习下在 Istio 中如何配置使用 Egress Gateway。准备工作如果你使用的 demo 这个配置文件安装 Istio,那么 Egress Gateway 已经默认安装了,可以通过下面的命令来查看:$ kubectl get pod -l istio=egressgateway -n istio-system NAME READY STATUS RESTARTS AGE istio-egressgateway-556f6f58f4-hkzdd 1/1 Running 0 14d如果没有 Pod 返回,可以通过下面的步骤来部署 Istio Egress Gateway。如果你使用 IstioOperator 安装 Istio,请在配置中添加以下字段:spec: components: egressGateways: - name: istio-egressgateway enabled: true否则使用如下的 istioctl install 命令来安装:$ istioctl install <flags-you-used-to-install-Istio> \ --set components.egressGateways[0].name=istio-egressgateway \ --set components.egressGateways[0].enabled=true同样我们还是使用 sleep 示例做为发送请求的测试源,如果启用了自动 Sidecar 注入,运行以下命令部署示例应用程序:kubectl apply -f samples/sleep/sleep.yaml否则,在使用以下命令部署 sleep 应用程序之前,手动注入 Sidecar:kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)为了发送请求,您需要创建 SOURCE_POD 环境变量来存储源 Pod 的名称:export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})用 Egress gateway 发起 HTTP 请求首先创建一个 ServiceEntry 对象来允许流量直接访问外部的 edition.cnn.com 服务。apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: cnn spec: hosts: - edition.cnn.com ports: - number: 80 name: http-port protocol: HTTP - number: 443 name: https protocol: HTTPS resolution: DNS发送 HTTPS 请求到 https://edition.cnn.com/politics 验证 ServiceEntry 是否已正确应用。$ kubectl exec "$SOURCE_POD" -c sleep -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics # 输出如下内 HTTP/1.1 301 Moved Permanently # ...... location: https://edition.cnn.com/politics # ...... HTTP/2 200 Content-Type: text/html; charset=utf-8 # ......然后为 edition.cnn.com 的 80 端口创建一个 egress Gateway,并为指向 Egress Gateway 的流量创建一个 DestinationRule 规则,如下所示:apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-egressgateway spec: selector: istio: egressgateway # 匹配 Egress Gateway Pod 的标签 servers: - port: number: 80 name: http protocol: HTTP hosts: - edition.cnn.com # 也支持通配符 * 的形式 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: egressgateway-for-cnn spec: host: istio-egressgateway.istio-system.svc.cluster.local # 目标规则为 Egress Gateway subsets: - name: cnn # 定义一个子集 cnn,没有指定 labels,则 subset 会包含所有符合 host 字段指定的服务的 Pod在上面的对象中我们首先定义了一个 Gateway 对象,不过这里我们定义的是一个 Egress Gateway,通过 istio: egressgateway 匹配 Egress Gateway Pod 的标签,并在 servers 中定义了 edition.cnn.com 服务的 80 端口。然后定义了一个 DestinationRule 对象,指定了目标规则为 istio-egressgateway.istio-system.svc.cluster.local,并定义了一个子集 cnn。这里的子集名称是 cnn,但没有指定 labels。这意味着,这个 subset 会涵盖所有属于 istio-egressgateway.istio-system.svc.cluster.local 服务的 Pod。这种情况下,subset 的作用主要是为了在其他 Istio 配置中提供一个方便的引用名称,而不是为了区分不同的 Pod 子集。如何再定义一个 VirtualService 对象将流量从 Sidecar 引导至 Egress Gateway,再从 Egress Gateway 引导至外部服务,如下所示:apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: direct-cnn-through-egress-gateway spec: hosts: - edition.cnn.com gateways: - istio-egressgateway # Egress Gateway - mesh # 网格内部的流量 http: - match: - gateways: - mesh # 这条规则适用于从服务网格内发出的流量 port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local # 流量将被路由到 egress gateway subset: cnn port: number: 80 weight: 100 - match: - gateways: - istio-egressgateway # 这条规则适用于通过 istio-egressgateway 的流量 port: 80 route: - destination: host: edition.cnn.com # 流量将被路由到外部服务 port: number: 80 weight: 100在上面的 VirtualService 对象中通过 hosts 指定 edition.cnn.com,表示该虚拟服务用于该服务的请求,gateways 字段中定义了 istio-egressgateway 和 mesh 两个值,istio-egressgateway 是上面我们定义的 Egress Gateway,mesh 表示该虚拟服务用于网格内部的流量,也就是说这个虚拟服务指定了如何处理来自服务网格内部以及通过 istio-egressgateway 的流量。mesh 是一个特殊的关键字,在 Istio 中表示服务网格内的所有 Sidecar 代理。当使用 mesh 作为网关时,这意味着 VirtualService 中定义的路由规则适用于服务网格内的所有服务,即所有装有 Istio sidecar 代理的服务。http 字段中定义了两个 match,第一个 match 用于匹配 mesh 网关,第二个 match 用于匹配 istio-egressgateway 网关,然后在 route 中定义了两个 destination,第一个 destination 用于将流量引导至 Egress Gateway 的 cnn 子集,第二个 destination 用于将流量引导至外部服务。总结来说,这个 VirtualService 的作用是控制服务网格内部到 edition.cnn.com 的流量。当流量起始于服务网格内时,它首先被路由到 istio-egressgateway,然后再路由到 edition.cnn.com,这种配置有助于统一和控制从服务网格内部到外部服务的流量,可以用于流量监控、安全控制或实施特定的流量策略。应用上面的资源对象后,我们再次向 edition.cnn.com 的 /politics 端点发出 curl 请求:$ kubectl exec "$SOURCE_POD" -c sleep -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics # ...... HTTP/1.1 301 Moved Permanently location: https://edition.cnn.com/politics # ...... HTTP/2 200 Content-Type: text/html; charset=utf-8 # ......正常和前面的一次测试输出结果是一致的,但是这次在请求是经过 istio-egressgateway Pod 发出的,我们可以查看日志来验证:kubectl logs -l istio=egressgateway -c istio-proxy -n istio-system | tail正常会看到一行类似于下面这样的内容:[2023-11-15T08:48:38.683Z] "GET /politics HTTP/2" 301 - via_upstream - "-" 0 0 204 203 "10.244.1.73" "curl/7.81.0-DEV" "6c2c4550-92d4-955c-b6cb-83bf2b0e06f4" "edition.cnn.com" "151.101.3.5:80" outbound|80||edition.cnn.com 10.244.2.184:46620 10.244.2.184:8080 10.244.1.73:49924 - -因为我们这里只是将 80 端口的流量重定向到 Egress Gateway 了,所以重定向后 443 端口的 HTTPS 流量将直接进入 edition.cnn.com,所以没有看到 443 端口的日志,但是我们可以通过 SOURCE_POD 的 Sidecar 代理的日志来查看到:$ kubectl logs "$SOURCE_POD" -c istio-proxy | tail # ...... [2023-11-15T08:55:55.513Z] "GET /politics HTTP/1.1" 301 - via_upstream - "-" 0 0 191 191 "-" "curl/7.81.0-DEV" "12ce15aa-1247-9b7e-8185-4224f96f5ea0" "edition.cnn.com" "10.244.2.184:8080" outbound|80|cnn|istio-egressgateway.istio-system.svc.cluster.local 10.244.1.73:49926 151.101.195.5:80 10.244.1.73:41576 - - [2023-11-15T08:55:55.753Z] "- - -" 0 - - - "-" 839 2487786 1750 - "-" "-" "-" "-" "151.101.195.5:443" outbound|443||edition.cnn.com 10.244.1.73:45246 151.101.67.5:443 10.244.1.73:42998 edition.cnn.com -用 Egress gateway 发起 HTTPS 请求上面我们已经学习了如何通过 Egress Gateway 发起 HTTP 请求,接下来我们再来学习下如何通过 Egress Gateway 发起 HTTPS 请求。原理都是一样的,只是我们需要在相应的 ServiceEntry、Egress Gateway 和 VirtualService 中指定 TLS 协议的端口 443。首先为 edition.cnn.com 定义 ServiceEntry 服务:apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: cnn spec: hosts: - edition.cnn.com ports: - number: 443 name: tls protocol: TLS resolution: DNS应用该资源对象后,发送 HTTPS 请求到 https://edition.cnn.com/politics,验证该 ServiceEntry 是否已正确生效。$ kubectl exec "$SOURCE_POD" -c sleep -- curl -sSL -o /dev/null -D - https://edition.cnn.com/politics ... HTTP/2 200 Content-Type: text/html; charset=utf-8 ...接下来同样的方式为 edition.cnn.com 创建一个 Egress Gateway。除此之外还需要创建一个目标规则和一个虚拟服务,用来引导流量通过 Egress Gateway,并通过 Egress Gateway 与外部服务通信。apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-egressgateway spec: selector: istio: egressgateway servers: - port: number: 443 name: tls protocol: TLS hosts: - edition.cnn.com tls: mode: PASSTHROUGH # 透传 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: egressgateway-for-cnn spec: host: istio-egressgateway.istio-system.svc.cluster.local subsets: - name: cnn --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: direct-cnn-through-egress-gateway spec: hosts: - edition.cnn.com gateways: - mesh - istio-egressgateway tls: - match: - gateways: - mesh port: 443 sniHosts: - edition.cnn.com route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local subset: cnn port: number: 443 - match: - gateways: - istio-egressgateway port: 443 sniHosts: - edition.cnn.com route: - destination: host: edition.cnn.com port: number: 443 weight: 100上面对象中定义的 Gateway 对象和前面的一样,只是将端口改为了 443,然后在 tls 中指定了 mode: PASSTHROUGH,表示该 Gateway 对象用于 TLS 协议的请求。然后在后面的 VirtualService 对象中就是配置 spec.tls 属性,用于指定 TLS 协议的请求的路由规则,配置方法和前面 HTTP 方式类似,只是注意要将端口改为 443,并且在 match 中指定 sniHosts 为 edition.cnn.com,表示该虚拟服务用于处理 edition.cnn.com 的 TLS 请求。应用上面的资源对象后,我们现在发送 HTTPS 请求到 https://edition.cnn.com/politics,输出结果应该和之前一样。$ kubectl exec "$SOURCE_POD" -c sleep -- curl -sSL -o /dev/null -D - https://edition.cnn.com/politics ... HTTP/2 200 Content-Type: text/html; charset=utf-8 ...检查 Egress Gateway 代理的日志,则打印日志的命令是:kubectl logs -l istio=egressgateway -n istio-system应该会看到类似于下面的内容:[2023-11-15T08:59:55.513Z] "- - -" 0 - 627 1879689 44 - "-" "-" "-" "-" "151.101.129.67:443" outbound|443||edition.cnn.com 172.30.109.80:41122 172.30.109.80:443 172.30.109.112:59970 edition.cnn.com到这里我们就实现了通过 Egress Gateway 发起 HTTPS 请求。最后记得清理上面创建的资源对象:$ kubectl delete serviceentry cnn $ kubectl delete gateway istio-egressgateway $ kubectl delete virtualservice direct-cnn-through-egress-gateway $ kubectl delete destinationrule egressgateway-for-cnn需要注意的是,Istio 无法强制让所有出站流量都经过 Egress Gateway, Istio 只是通过 Sidecar 代理实现了这种流向。攻击者只要绕过 Sidecar 代理, 就可以不经 Egress Gateway 直接与网格外的服务进行通信,从而避开了 Istio 的控制和监控。出于安全考虑,集群管理员和云供应商必须确保网格所有的出站流量都要经过 Egress Gateway。这需要通过 Istio 之外的机制来满足这一要求。例如,集群管理员可以配置防火墙,拒绝 Egress Gateway 以外的所有流量。Kubernetes NetworkPolicy 也能禁止所有不是从 Egress Gateway 发起的出站流量,但是这个需要 CNI 插件的支持。此外,集群管理员和云供应商还可以对网络进行限制,让运行应用的节点只能通过 gateway 来访问外部网络。要实现这一限制,可以只给 Gateway Pod 分配公网 IP,并且可以配置 NAT 设备, 丢弃来自 Egress Gateway Pod 之外的所有流量。Egress TLS Origination接下来我们将学习如何通过配置 Istio 去实现对发往外部服务的流量的 TLS Origination(TLS 发起)。若此时原始的流量为 HTTP,则 Istio 会将其转换为 HTTPS 连接。TLS Origination 的概念前面我们也已经介绍过了。TLS Origination假设有一个传统应用正在使用 HTTP 和外部服务进行通信,如果有一天突然有一个新的需求,要求必须对所有外部的流量进行加密。此时,使用 Istio 便可通过修改配置实现此需求,而无需更改应用中的任何代码。该应用可以发送未加密的 HTTP 请求,由 Istio 为请求进行加密。从应用源头发起未加密的 HTTP 请求,并让 Istio 执行 TLS 升级的另一个好处是可以产生更好的遥测并为未加密的请求提供更多的路由控制。下面我们就来学习下如何配置 Istio 实现 TLS Origination。同样我们这里使用 sleep 示例应用来作为测试源,如果启用了自动注入 Sidecar,那么可以直接部署 sleep 应用:kubectl apply -f samples/sleep/sleep.yaml否则在部署 sleep 应用之前,必须手动注入 Sidecar:kubectl apply -f <(istioctl kube-inject -f samples/sleep/sleep.yaml)创建一个环境变量来保存用于将请求发送到外部服务 Pod 的名称:export SOURCE_POD=$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})▍配置对外部服务的访问首先使用 ServiceEntry 对象来配置对外部服务 edition.cnn.com 的访问。这里我们将使用单个 ServiceEntry 来启用对服务的 HTTP 和 HTTPS 访问。创建一个如下所示的 ServiceEntry 对象:apiVersion: networking.istio.io/v1alpha3 kind: ServiceEntry metadata: name: edition-cnn-com spec: hosts: - edition.cnn.com ports: - number: 80 name: http-port protocol: HTTP - number: 443 name: https-port protocol: HTTPS resolution: DNS上面的 ServiceEntry 对象中我们指定了 edition.cnn.com 服务的主机名,然后在 ports 中指定了需要暴露的端口及其属性,表示该 ServiceEntry 对象代表对 edition.cnn.com 的访问,这里我们定义了 80 和 443 两个端口,分别对应 http 和 https 服务,resolution: DNS 定义了如何解析指定的 hosts,这里我们使用 DNS 来解析。直接应用该资源对象,然后向外部的 HTTP 服务发送请求:$ kubectl exec "${SOURCE_POD}" -c sleep -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics # 输出如下结果 HTTP/1.1 301 Moved Permanently # ...... location: https://edition.cnn.com/politics HTTP/2 200 content-type: text/html; charset=utf-8 # ......上面我们在使用 curl 命令的时候添加了一个 -L 标志,该标志指示 curl 将遵循重定向。在这种情况下,服务器将对到 http://edition.cnn.com/politics 的 HTTP 请求进行重定向响应,而重定向响应将指示客户端使用 HTTPS 向 https://edition.cnn.com/politics 重新发送请求,对于第二个请求,服务器则返回了请求的内容和 200 状态码。尽管 curl 命令简明地处理了重定向,但是这里有两个问题。第一个问题是请求冗余,它使获取 http://edition.cnn.com/politics 内容的延迟加倍,第二个问题是 URL 中的路径(在本例中为 politics)被以明文的形式发送。如果有人嗅探你的应用与 edition.cnn.com 之间的通信,他将会知晓该应用获取了此网站中哪些特定的内容。出于隐私的原因,我们可能希望阻止这些内容被嗅探到。通过配置 Istio 执行 TLS 发起,则可以解决这两个问题。▍用于 egress 流量的 TLS 发起为 edition.cnn.com 创建一个出口网关,端口为 80,接收 HTTP 流量,如下所示:apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-egressgateway spec: selector: istio: egressgateway servers: - port: number: 80 name: tls-origination-port protocol: HTTP hosts: - edition.cnn.com然后为 istio-egressgateway 创建一个 DestinationRule 对象,如下所示:apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: egressgateway-for-cnn spec: host: istio-egressgateway.istio-system.svc.cluster.local subsets: - name: cnn接着我们只需要创建一个 VirtualService 对象,将流量从 Sidecar 引导至 Egress Gateway,再从 Egress Gateway 引导至外部服务,如下所示:apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: direct-cnn-through-egress-gateway spec: hosts: - edition.cnn.com gateways: - istio-egressgateway # Egress Gateway - mesh # 网格内部的流量 http: - match: - gateways: - mesh port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local subset: cnn port: number: 80 weight: 100 - match: - gateways: - istio-egressgateway port: 80 route: - destination: host: edition.cnn.com port: number: 443 # 443 端口 weight: 100 --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: originate-tls-for-edition-cnn-com spec: host: edition.cnn.com trafficPolicy: loadBalancer: simple: ROUND_ROBIN portLevelSettings: - port: number: 443 tls: mode: SIMPLE # initiates HTTPS for connections to edition.cnn.com需要注意的是上面最后针对 edition.cnn.com 的 DestinationRule 对象,在 trafficPolicy 中指定了 portLevelSettings 用于对不同的端口定义不同的流量策略,这里我们定义了 443 端口的 tls 模式为 SIMPLE,表示当访问 edition.cnn.com 的 HTTP 请求时执行 TLS 发起。应用上面的资源对象,然后再次向 http://edition.cnn.com/politics 发送 HTTP 请求:$ kubectl exec "${SOURCE_POD}" -c sleep -- curl -sSL -o /dev/null -D - http://edition.cnn.com/politics # 直接输出200状态码 HTTP/1.1 200 OK content-length: 2474958 content-type: text/html; charset=utf-8 # ......这次将会收到唯一的 200 OK 响应,因为 Istio 为 curl 执行了 TLS 发起,原始的 HTTP 被升级为 HTTPS 并转发到 edition.cnn.com。服务器直接返回内容而无需重定向,这消除了客户端与服务器之间的请求冗余,使网格保持加密状态,隐藏了你的应用获取 edition.cnn.com 中 politics 端点的信息。如果我们在代码中有去访问外部服务,那么我们就可以不用修改代码了,只需要通过配置 Istio 来获得 TLS 发起即可,而无需更改一行代码。到这里我们就学习了如何通过配置 Istio 实现对外部服务的 TLS 发起。▍TLS 与 mTLS 基本概念前面我们学习了如何通过配置 Istio 实现对外部服务的 TLS 发起,这里其实还有一个 mTLS 的概念呢,由于 TLS 本身就比较复杂,对于双向 TLS(mTLS)就更复杂了。TLS 是一个连接层协议,旨在为 TCP 连接提供安全保障。TLS 在连接层工作,可以与任何使用 TCP 的应用层协议结合使用。例如,HTTPS 是 HTTP 与 TLS 的结合(HTTPS 中的 S 指的是 SSL,即 TLS 的前身),TLS 认证的流程大致如下所示:首先向第三方机构 CA 提交组织信息、个人信息(域名)等信息并申请认证。CA 通过多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等。如信息审核通过,CA 会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA 的信息、有效时间、证书序列号等信息的明文,同时包含一个签名。其中签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA 的私钥对信息摘要进行加密,密文即签名。客户端向服务端发出请求时,服务端返回证书文件。客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA 的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性。客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任 CA 的证书信息(包含公钥),比如浏览器基本上都带有知名公共 CA 机构的证书,如 Verisign、Digicert 等,这些证书在发布时被打包在一起,当我们下载浏览器时,就经把正确的证书放进了浏览器,如果 CA 不被信任,则找不到对应 CA 的证书,证书也会被判定非法。认证过程当然 HTTPS 的工作流程和这个过程基本就一致了:1.客户端发起一个 HTTPS 请求。2.服务端把配置好的证书返回给客户端。3.客户端验证证书:比如是否在有效期内,证书的用途是不是匹配 Client 请求的站点,是不是在 CRL 吊销列表里面,它的上一级证书是否有效等。4.客户端使用伪随机数生成对称密钥,并通过证书里服务器的公钥进行加密,后续使用该对称密钥进行传输信息。5.服务端使用自己的私钥解密这个消息,得到对称密钥。至此,客户端和服务端都持有了相同的对称密钥。6.服务端使用对称密钥加密明文内容 A,发送给客户端。7.客户端使用对称密钥解密响应的密文,得到明文内容 A。8.客户端再次发起 HTTPS 的请求,使用对称密钥加密请求的明文内容 B,然后服务器使用对称密钥解密密文,得到明文内容 B。HTTPS 工作流程当然双向 TLS 就更为复杂了,Mutual TLS(双向 TLS),或称 mTLS,对于常规的 TLS,只需要服务端认证,mTLS 相对来说有一个额外的规定:客户端也要经过认证。在 mTLS 中,客户端和服务器都有一个证书,并且双方都使用它们的公钥/私钥对进行身份验证。TLS 保证了真实性,但默认情况下,这只发生在一个方向上:客户端对服务器进行认证,但服务器并不对客户端进行认证。为什么 TLS 的默认只在一个方向进行认证?因为客户端的身份往往是不相关的。例如我们在访问优点知识的时候,你的浏览器已经验证了要访问的网站服务端的身份,但服务端并没有验证你的浏览器的身份,它实际上并不关心你的浏览器的身份,这对于互联网上的 Web 项目来说足够了。但是在某些情况下,服务器确实需要验证客户端的身份,例如,当客户端需要访问某些敏感数据时,服务器可能需要验证客户端的身份,以确保客户端有权访问这些数据,这就是 mTLS 的用武之地,mTLS 是保证微服务之间跨服务通信安全的好方法。首先,你想要安全的通信。当我们把我们的应用程序拆分为多个服务时,我们最终会在这些服务之间的网络上发送敏感数据。任何能够进入网络的人都有可能读取这些敏感数据并伪造请求。其次,你关心客户端的身份。首先,你要确保你能知道调用是什么时候发生的,以便进行诊断,并正确记录指标等事项。此外,你可能想对这些身份进行授权(允许 A 调用 B 吗)。当然授权是另外的话题了。接下来我们就来测试下如何通过 egress 网关发起双向 TLS 连接。▍通过 egress 网关发起双向 TLS 连接首先使用 openssl 命令生成客户端和服务器的证书与密钥,为你的服务签名证书创建根证书和私钥:openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=example Inc./CN=example.com' -keyout example.com.key -out example.com.crt # 生成 CA 证书和私钥为 my-nginx.mesh-external.svc.cluster.local 创建证书和私钥:# 为 my-nginx.mesh-external.svc.cluster.local 创建私钥和证书签名请求 $ openssl req -out my-nginx.mesh-external.svc.cluster.local.csr -newkey rsa:2048 -nodes -keyout my-nginx.mesh-external.svc.cluster.local.key -subj "/CN=my-nginx.mesh-external.svc.cluster.local/O=some organization" # 使用 CA 公钥和私钥以及证书签名请求为 my-nginx.mesh-external.svc.cluster.local 创建证书 $ openssl x509 -req -sha256 -days 365 -CA example.com.crt -CAkey example.com.key -set_serial 0 -in my-nginx.mesh-external.svc.cluster.local.csr -out my-nginx.mesh-external.svc.cluster.local.crt然后生成客户端证书和私钥:# 为 client.example.com 创建私钥和证书签名请求 $ openssl req -out client.example.com.csr -newkey rsa:2048 -nodes -keyout client.example.com.key -subj "/CN=client.example.com/O=client organization" # 使用相同的 CA 公钥和私钥以及证书签名请求为 client.example.com 创建证书 $ openssl x509 -req -sha256 -days 365 -CA example.com.crt -CAkey example.com.key -set_serial 1 -in client.example.com.csr -out client.example.com.crt接着我们来部署一个双向 TLS 服务器,为了模拟一个真实的支持双向 TLS 协议的外部服务,我们在 Kubernetes 集群中部署一个 NGINX 服务,该服务运行在 Istio 服务网格之外,比如运行在一个没有开启 Istio Sidecar proxy 注入的命名空间中。创建一个命名空间 mesh-external 表示 Istio 网格之外的服务,注意在这个命名空间中,Sidecar 自动注入是没有开启的,不会在 Pod 中自动注入 Sidecar proxy。kubectl create namespace mesh-external然后创建 Kubernetes Secret,保存服务器和 CA 的证书。$ kubectl create -n mesh-external secret tls nginx-server-certs --key my-nginx.mesh-external.svc.cluster.local.key --cert my-nginx.mesh-external.svc.cluster.local.crt $ kubectl create -n mesh-external secret generic nginx-ca-certs --from-file=example.com.crt生成 NGINX 服务器的配置文件:$ cat <<\EOF > ./nginx.conf events { } http { log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; server { listen 443 ssl; root /usr/share/nginx/html; index index.html; server_name my-nginx.mesh-external.svc.cluster.local; ssl_certificate /etc/nginx-server-certs/tls.crt; ssl_certificate_key /etc/nginx-server-certs/tls.key; ssl_client_certificate /etc/nginx-ca-certs/example.com.crt; ssl_verify_client on; } } EOF生成 Kubernetes ConfigMap 保存 NGINX 服务器的配置文件:kubectl create configmap nginx-configmap -n mesh-external --from-file=nginx.conf=./nginx.conf然后就可以部署 NGINX 服务了:$ kubectl apply -f - <<EOF apiVersion: v1 kind: Service metadata: name: my-nginx namespace: mesh-external labels: run: my-nginx spec: ports: - port: 443 protocol: TCP selector: run: my-nginx --- apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx namespace: mesh-external spec: selector: matchLabels: run: my-nginx template: metadata: labels: run: my-nginx spec: containers: - name: my-nginx image: nginx ports: - containerPort: 443 volumeMounts: - name: nginx-config mountPath: /etc/nginx readOnly: true - name: nginx-server-certs mountPath: /etc/nginx-server-certs readOnly: true - name: nginx-ca-certs mountPath: /etc/nginx-ca-certs readOnly: true volumes: - name: nginx-config configMap: name: nginx-configmap - name: nginx-server-certs secret: secretName: nginx-server-certs - name: nginx-ca-certs secret: secretName: nginx-ca-certs EOF现在如果我们在网格内部去直接访问这个 my-nginx 服务,是无法访问的,第一是没有内置 CA 证书,另外是 my-nginx 服务开启了 mTLS,需要客户端证书才能访问,现在我们的网格中是没有对应的客户端证书的,会出现 400 错误。开启了双向认证▍为 egress 流量配置双向 TLS创建 Kubernetes Secret 保存客户端证书:kubectl create secret -n istio-system generic client-credential --from-file=tls.key=client.example.com.key \ --from-file=tls.crt=client.example.com.crt --from-file=ca.crt=example.com.crtSecret 所在的命名空间必须与出口网关部署的位置一致,我们这里是 istio-system 命名空间。然后为 my-nginx.mesh-external.svc.cluster.local 创建一个端口为 443 的 Egress Gateway,以及目标规则和虚拟服务来引导流量流经 egress 网关并从 egress 网关流向外部服务。$ kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: istio-egressgateway spec: selector: istio: egressgateway servers: - port: number: 443 name: https protocol: HTTPS hosts: - my-nginx.mesh-external.svc.cluster.local tls: mode: ISTIO_MUTUAL --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: egressgateway-for-nginx spec: host: istio-egressgateway.istio-system.svc.cluster.local subsets: - name: nginx trafficPolicy: loadBalancer: simple: ROUND_ROBIN portLevelSettings: - port: number: 443 tls: mode: ISTIO_MUTUAL sni: my-nginx.mesh-external.svc.cluster.local EOF上面我们定义的 Gateway 对象和前面的一样,只是将端口改为了 443,然后在 tls 中指定了 mode: ISTIO_MUTUAL,表示该 Gateway 对象用于 TLS 双向认证协议的请求。然后同样在后面的 DestinationRule 对象中配置了通过 istio-egressgateway 的流量的规则,这里我们定义了 443 端口的 tls 模式为 ISTIO_MUTUAL,表示当访问 my-nginx.mesh-external.svc.clustr.local 的 TLS 请求时执行 TLS 双向认证。最后我们定义一个 VirtualService 对象来引导流量流经 egress 网关:$ kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: direct-nginx-through-egress-gateway spec: hosts: - my-nginx.mesh-external.svc.cluster.local gateways: - istio-egressgateway - mesh # 网格内部的流量 http: - match: - gateways: - mesh port: 80 route: - destination: host: istio-egressgateway.istio-system.svc.cluster.local subset: nginx port: number: 443 weight: 100 - match: - gateways: - istio-egressgateway port: 443 route: - destination: host: my-nginx.mesh-external.svc.cluster.local port: number: 443 weight: 100 EOF上面的 VirtualService 对象定义网格内部对 my-nginx.mesh-external.svc.cluster.local 服务的访问引导至 istio-egressgateway,然后再由 istio-egressgateway 引导流量流向外部服务。添加 DestinationRule 执行双向 TLS:$ kubectl apply -n istio-system -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: originate-mtls-for-nginx spec: host: my-nginx.mesh-external.svc.cluster.local trafficPolicy: loadBalancer: simple: ROUND_ROBIN portLevelSettings: - port: number: 443 tls: mode: MUTUAL credentialName: client-credential # 这必须与之前创建的用于保存客户端证书的 Secret 相匹配 sni: my-nginx.mesh-external.svc.cluster.local EOF发送一个 HTTP 请求至 http://my-nginx.mesh-external.svc.cluster.local:$ kubectl exec "$(kubectl get pod -l app=sleep -o jsonpath={.items..metadata.name})" -c sleep -- curl -sS http://my-nginx.mesh-external.svc.cluster.local <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...检查 istio-egressgateway Pod 日志,有一行与请求相关的日志记录。如果 Istio 部署在命名空间 istio-system 中,打印日志的命令为:kubectl logs -l istio=egressgateway -n istio-system | grep 'my-nginx.mesh-external.svc.cluster.local' | grep HTTP将显示类似如下的一行:[2023-11-17T08:23:51.203Z] "GET / HTTP/1.1" 200 - via_upstream - "-" 0 615 17 16 "10.244.1.100" "curl/7.81.0-DEV" "434b5755-54da-9924-9e2a-a204b5a2124c" "my-nginx.mesh-external.svc.cluster.local" "10.244.1.106:443" outbound|443||my-nginx.mesh-external.svc.cluster.local 10.244.2.239:35198 10.244.2.239:8443 10.244.1.100:56448 my-nginx.mesh-external.svc.cluster.local -双向认证即使我们直接在网格中访问的是 HTTP 的服务,但是通过配置 Istio,我们也可以实现对外部服务的双向 TLS 认证。参考文档:https://istio.io/latest/docs/tasks/traffic-management/egress/本文转载自k8s技术圈,原文链接添加社区小助手回复“Istio”进入技术交流群
  • [公告] 新一代云原生可观测平台之CCE服务日志和告警篇
    告警和日志是运维人员快速定位问题、恢复异常的主要手段。运维人员日常的工作模式往往是先接收告警信息,再根据告警信息初步判断异常的范围和影响,通过相关组件的日志定位出故障原因,进行系统恢复。因此,如何给运维人员提供简单易用的告警和日志管理平台是各个云原生平台高度关注的问题。相较传统系统,云原生场景下应用数量非常巨大,监控指标、事件、日志等运维数据更是海量的。同时,告警配置需要联通多个系统,如告警通知人的配置涉及消息通知系统、指标阈值告警规则涉及监控系统、日志关键字告警涉及日志管理系统等。这就导致云原生场景告警的配置复杂度相当高,且涉及跳转到不同系统,流程存在断点。同样,云原生场景下日志文件庞杂繁复。日志有容器标准输出日志、容器内日志、节点日志等多种类型;且日志可能分布在不同的主机上,位置不固定,从而导致日志查找困难。因此,如何帮助运维人员快速精确地查找到故障时间点的完整日志链路并清晰的呈现是日志服务所面临的关键挑战。图1 日志和告警中的挑战针对于上述云原生场景下告警和日志的问题,华为云CCE服务上线告警中心和日志中心功能,实现“一站式告警配置”、“云原生日志视图”。一站式告警配置为了让用户在极短时间内完成系统的基本告警配置,CCE服务联合AOM服务推出云原生专属告警模板,一键即可配置云原生系统的告警规则。此告警模板基于华为云日常运维经验总结提炼,内容涵盖了集群故障事件以及集群、节点、负载资源监控阈值等多方面的常见故障场景。用户只需要在CCE开启告警中心,绑定故障通知人员的邮箱或手机即可。图2 一键开启另外,告警中心还具备告警通知组配置、告警规则配置、告警查看回溯等能力,让运维人员能够一站式完成告警的配置和处理流程,完成闭环。告警中心基于华为云SMN服务提供告警通知组能力。通过配置告警通知组,能够在故障产生时根据问题触发系统的种类和级别及时通知相应的运维人员介入处理。图3 配置告警通知组告警规则可通过告警模板一键下发,涵盖集群常用的指标告警和事件告警。当然,用户也可以自由选配这些告警规则。图4 配置告警规则当告警产生时,告警通知人会及时收到告警通知,并可以通过告警中心提供的可视化界面查看和消除告警。为方便用户对已发生故障进行回溯,告警中心也同样支持查看历史已经消除的告警。图5 告警列表云原生日志视图为了契合云原生业务特征,方便运维人员快速查询日志并准确定位故障,华为云CCE服务推出日志中心功能,提供云原生视角的专属页面版式。图6 日志中心日志中心支持根据K8s资源对象,如工作负载、Pod等进行过滤筛选。同时支持K8s管理日志、审计日志、业务日志等分类展示,整体页面更加简洁,日志主体内容及关联的K8s资源等重点信息更加突出,能够让运维人员聚焦故障点日志,排除干扰。图7 多维度过滤筛选日志中心还提供了日志采集策略的配置管理能力,支持自由配置采集的K8s资源对象。另外,为了进一步降低日志的使用门槛,日志中心提供了控制面日志、审计日志和容器标准输出日志的采集配置模板,支持一键开启或关闭。图8 采集模板本期我们针对告警中心和日志中心的能力给大家进行了简单的介绍。我们非常期待这些能力能够有效地提升您的运维体验。我们将会进行持续优化。期待您的使用以及宝贵的改进意见。服务体验请访问cid:link_3相关链接cid:link_2cid:link_4云容器引擎 CCE
  • [技术干货] 基于华为云MRS的Kafka集群实践
    一、MRS流式集群购买按照华为云用户手册(cid:link_0)购买。二、Kafka客户端安装FusionInsight Manager登陆界面下载集群客户端客户端生成成功安装客户端至集群内其他节点解压并校验软件包安装客户端完成三、Kafka消息传递登陆master1节点,并配置环境变量开启IAM用户同步查看并记录一个ZooKeeper角色实例的IP地址创建名为“77”的Kafka topic查看并记录Kafka角色实例中任意一个的IP在topic test中收发消息,内容为姓名全拼(liuchengjie)和学号(201250125)四、Python使用Kafka结果如下,内容为姓名全拼(liuchengjie)和学号(201250125)
  • [技术干货] Karmada百倍集群规模多云基础设施体系揭秘
    作者:华为云云原生团队随着云原生技术在越来越多的企业和组织中的大规模落地,如何高效、可靠地管理大规模资源池以应对不断增长的业务挑战成为了当下云原生技术的关键挑战。在过去的很长一段时间内,不同厂商尝试通过扩展单集群的规模来扩展资源池。然而,Kubernetes社区很早就发布了大规模集群的最佳实践,其中包括几项关键数据:节点数不超过5k,Pod数不超过150k,单个节点的Pod数量不超过110 k等。这侧面说明了支持超大规模的集群不是Kubernetes社区主要努力的方向。同时,以单集群的方式扩展资源池通常需要定制Kubernetes的原生组件,这在增加了架构复杂度的同时也带来了不少弊端:(1)集群运维复杂度急剧增加。(2)与社区演进方向相左,后续的维护成本上升,升级路径不清晰。(3)单集群本质上属于单个故障域,集群故障时将导致无法控制爆炸半径。而多集群技术能在不侵入修改Kubernetes单集群的基础上横向扩展资源池的规模,在扩展资源池的同时降低了企业的运维管理等成本。此外,多集群系统天然支持多故障域,符合多数业务场景,如多地数据中心、CDN就近提供服务等。Karmada作为CNCF首个多云容器编排项目,提供了包括Kubernetes原生API支持、多层级高可用部署、多集群故障迁移、多集群应用自动伸缩、多集群服务发现等关键特性,致力于让用户轻松管理无限可伸缩的资源池,为企业提供从单集群到多云架构的平滑演进方案。随着以Karmada为代表的多集群架构在企业的逐步落地,大规模场景下多集群系统的性能问题往往是用户的核心关注点之一。本文将围绕以下几个问题,结合Karmada社区对大规模场景的思考,揭示Karmada稳定支持100个大规模集群、管理超过50万个节点和200万个Pod背后的原理。(1) 如何衡量一个多集群系统资源池的维度与阈值?(2) 对多集群系统进行大规模环境的压测时,我们需要观测哪些指标?(3) Karmada是如何支撑100个大规模K8s集群并纳管海量应用的?(4) 在Karmada的生产落地过程中,有哪些最佳实践和参数优化手段可以参考?▎多集群系统资源池的维度与阈值当前,业界对于多云资源池的Scalability尚未达成统一标准,为此,Karmada社区结合企业用户的实践,率先对这一问题进行了深入探索。一个多集群系统资源池规模不单指集群数量,实际上它包含很多维度的测量标准,在不考虑其他维度的情况下只考虑集群数量是毫无意义的。在若干因素中,社区按照优先级将其描述为以下三个维度:(1) 集群数量。集群数量是衡量一个多集群系统资源池规模和承载能力最直接且最重要的维度。(2) 资源(API对象)数量。对于多集群系统的控制面来说,存储并不是无限的,在控制面创建的资源对象的数量和总体大小受限于系统控制面的存储,也是制约多集群系统资源池规模的重要维度。这里的资源对象不仅指下发到成员集群的资源模板,而且还包括集群的调度策略、多集群服务等资源。(3) 集群规模。集群规模是衡量一个多集群系统资源池规模不可忽视的维度。一方面,集群数量相等的情况下,单个集群的规模越大,整个多集群系统的资源池越大。另一方面,多集群系统的上层能力依赖系统对集群的资源画像,例如在多集群应用的调度过程中,集群资源是不可或缺的一个因素。综上所述,单集群的规模与整个多集群系统息息相关,但单集群的规模同样不是制约多集群系统的限制因素。用户可以通过优化原生的Kubernetes组件的方式来提升单集群的集群规模,达到扩大整个多集群系统的资源池的目的,但这不是衡量多集群系统性能的关注点。在集群的标准配置中,Node与Pod毫无疑问是其中最重要的两个资源,Node是计算、存储等资源的最小载体,而Pod数量则代表着一个集群的应用承载能力。▎大规模场景下多集群系统的性能指标在多集群系统的大规模落地进程中,如何衡量多集群联邦的服务质量是一个不可避免的问题。在参考了Kubernetes社区的SLI(Service Level Indicator)/SLO(Service Level Objectives)和多集群系统的落地应用后,Karmada社区定义了以下SLI/SLO来衡量大规模场景下多集群联邦的服务质量。API Call LatencyStatusSLISLOOfficial最近5min的单个Object Mutating API P99 时延除聚合API和CRD外,P99 <= 1sOfficial最近5min的non-streaming read-only P99 API时延除聚合API和CRD外P99 :(a) <= 1s if scope=resource (b) <= 30s otherwise (if scope=namespace or scope=cluster)注:API调用时延仍然是衡量基于Kubernetes的多集群系统服务质量的关键指标。Karmada兼容Kubernetes原生API,用户除了使用原生API创建K8s的资源模板外,也可以使用Karmada自有API来创建多集群策略和访问跨集群的资源。Resource Distribution LatencyStatusSLISLOOfficial用户在联邦控制面提交资源模板和下发策略后到资源在成员集群上被创建的P99时延,不考虑控制面与成员集群之间的网络波动P99 <= 2sCluster Registration LatencyStatusSLISLOWIP集群从接入联邦控制面到状态能被控制面正常收集的P99时延,不考虑控制面与成员集群之间的网络波动TBD注:集群注册时延是从集群注册到控制面到集群在联邦侧可用的时延,它反映了控制面接入集群以及管理集群的生命周期的性能。但它在某种程度上取决于控制面如何收集成员集群的状态。因此,我们不会对这个指标进行强制的限制。Resource UsageStatusSLISLOWIP在接入一定数量的集群后集群联邦维持其正常工作所必需的资源使用量TBD注:资源使用量是多集群系统中非常重要的指标,我们希望在纳管海量的集群和资源的同时消耗尽量少的系统资源。但由于不同的多集群系统提供的上层服务不同,因此对于不同的系统,其对资源的要求也会不同。因此,我们不会对这个指标进行强制的限制。▎Karmada百倍集群规模基础设施揭秘Karmada社区在结合对上述两个问题的思考以及用户在落地过程中的反馈后,测试了Karmada同时管理100个5K节点和2w Pod的Kubernetes集群的场景。本文不详细描述具体的测试环境信息与测试过程,而是侧重于对测试结果进行分析在整个测试过程中,API调用时延均符合上述定义的SLI/SLO。图一:只读API(cluster-scope)调用时延图二:只读API(namespace-scope)调用时延图三:只读API(resource-scope)调用时延图四:Mutating API调用时延Karmada在百倍集群规模下,仍能做到快速的API响应,这取决于Karmada独特的多云控制面架构。事实上,Karmada在架构设计之初就采用了关注点分离的设计理念,使用Kubernetes原生API来表达集群联邦资源模板,使用可复用的策略API来表达多集群的管理策略,同时控制面的资源模板作为应用的模板,不会在控制面生成具体的Pod。不同集群的应用在控制面的映射(Work对象)通过命名空间来进行安全隔离。完整的API工作流如下图所示。如此设计,不仅可以让Karmada能够轻松集成Kubernetes的生态, 同时也大大减少了控制面的资源数量和承载压力。基于此,控制面的资源数量不取决于集群的数量,而是取决于多集群应用的数量。此外,Karmada的架构极具简洁性和扩展性。karmada-apiserver作为控制面的入口与kube-apiserver类似,即使是在百倍集群规模下,Karmada仍能保持快速API响应。Karmada支持通过命令行快速接入集群,以及集群的全生命周期管理。Karmada会实时采集集群心跳和状态,其中集群状态包括集群版本、支持的API列表、集群健康状态以及集群资源使用量等。其中,Karmada会基于集群资源使用量对成员集群进行建模,这样调度器可以更好地为应用选择资源足够的目标集群。在这种情况下,集群注册时延与集群的规模息息相关。下表展示了加入一个5,000节点的集群直至它可用所需的时延。你可以通过关闭集群资源建模来使集群注册时延与集群的大小无关,在这种情况下,集群注册时延这个指标将小于2s。Cluster Registration Latency:metricP50(ms)P90(ms)P99(ms)SLOcluster_register535661256904N/AKarmada支持多模式的集群统一接入,在Push模式下,Karmada控制面直连成员集群的kube-apiserver,而在Pull模式下,Karmada将在成员集群中安装agent组件,并委托任务给它。因此Push模式多用于公有云的K8s集群,需要暴露APIServer在公网中,而Pull模式多用于私有云的K8s集群。下表展示了Karmada在不同模式下下发一个应用到成员集群所需的时延。Resource Distribution Latency:MetricP50(ms)P90(ms)P99(ms)SLOcluster_schedule121532N/Aresource_distribution(Push)70689912982000resource_distribution(Pull)6128819892000结论:我们容易得出,不论是Push模式还是Pull模式,Karmada都能高效地将资源下发到成员集群中。在Karmada演进的数个版本中,大规模场景下使用Karmada管理多云应用的资源消耗一直是用户比较关注的问题。Karmada社区做了许多工作来减少Karmada管理大型集群的资源使用量,比如我们优化了Informer的缓存,剔除了资源无关的节点、Pod元数据;减少了控制器内不必要的类型转换等等。相较于1.2版本,当前Karmada在大规模集群场景下减少了85%的内存消耗和32%的CPU消耗。下图展示了不同模式下Karmada控制面的资源消耗情况。Push模式:Pull模式:总的来说,系统消耗的资源在一个可控制面的范围,其中Pull模式在内存使用上有明显的优势,而在其他资源上相差的不大。▎Karmada大规模环境下的最佳实践Karmada支持性能参数的可配置化,用户可以通过调整组件的参数来调整同一时间段内并发处理Karmada内部对象的数量、系统的吞吐量等以优化性能。同时Karmada在不同模式下的性能瓶颈并不相同,以下着重对此进行分析。在Push模式中,控制面的资源消耗主要集中在karmada-controller-manager(约70%),而Karmada控制面基座(etcd/karmada-apiserver)的压力不大。结合karmada-apiserver的qps以及karmada-etcd的请求时延我们可以看出karmada-apiserver的请求量保持在一个较低的水平。在Push模式中,绝大多数的请求来自karmada-controller-manager。因此我们可以通过调整karmada-controller-manager的--concurrent-work-syncs来调整同一时间段并发work的数量来提升应用下发的速度,也可以配置--kube-api-qps和--kube-api-burst这两个参数来控制Karmada控制面的整体流控。在Pull模式中,控制面的资源消耗主要集中在karmada-apiserver,而不是karmada-controller-manager。结合karmada-apiserver的qps以及karmada-etcd的请求时延我们可以看出karmada-apiserver的请求量保持在一个较高的水平。在Pull模式中,每个成员集群的karmada-agent需要维持一条与karmada-apiserver通信的长连接。我们很容易得出:在下发应用至所有集群的过程中请求总量是karmada-agent中配置的N倍(N=#Num of clusters)。因此,在大规模Pull模式集群的场景下,Pull模式在资源下发/状态收集方面有更好的性能,但同时需要考虑控制面的抗压能力以及各个karmada-agent和控制面的整体流控。当前,Karmada提供了集群资源模型的能力来基于集群空闲资源做调度决策。在资源建模的过程中,它会收集所有集群的节点与Pod的信息。这在大规模场景下会有一定的内存消耗。如果用户不使用这个能力,用户可以关闭集群资源建模来进一步减少资源消耗。▎总结根据上述测试结果分析,Karmada可以稳定支持100个大规模集群,管理超过50万个节点和200万个Pod。在Karmada落地进程中,用户可以根据使用场景选择不同的部署模式,通过参数调优等手段来提升整个多集群系统的性能。受限于测试环境和测试工具,上述测试尚未测试到Karmada多集群系统的上限,同时多集群系统的分析理论以及测试方法仍处于方兴未艾的阶段,下一步我们将继续优化多集群系统的测试工具,系统性地整理测试方法,以覆盖更大的规模和更多的典型场景。添加小助手微信k8s2222,进入云原生交流群
  • [行业前沿] 【云原生批量调度引擎Volcano案例】 ING国际银行基于Volcano的大数据分析平台应用实践
    在 KubeCon + CloudNativeCon North America 2022 ,ING集团发表了《Efficient Scheduling Of High Performance Batch Computing For Analytics Workloads With Volcano - Krzysztof Adamski & Tinco Boekestijn, ING》主题演讲,重点介绍了云原生批量计算项目Volcano如何在数据管理平台中为大数据分析作业提供高性能调度工作。详情参见:KubeCon + CloudNativeCon North America ▎ING背景介绍ING集团(荷兰语:Internationale Nederlanden Groep),亦名荷兰国际集团,是一个国际金融服务私营企业,成立于1991年,由荷兰最大的保险公司Nationale-Nederlanden,与荷兰的第三大银行NMB PostBank Group合并而成。ING集团的服务遍及全球40多个国家,核心业务是银行、保险及资产管理等。ING集团的全球职员大约56,000人,顾客5320万人,包括自然人、家庭,企业、政府及其他等,例如基金组织。务背▎业务背景介绍在银行行业有许多法规和限制,如:监管要求在全球范围内各不相同、数据孤岛-全局和本地限制、数据安全、合规创新等,想要快速引入新技术不是一件容易的事情,为此,ING布局符合自身产业的DAP平台(Data Analytics Platform),为全球50%的ING员工提供安全的、自助的端到端分析能力,帮助员工在数据平台之上构建并解决业务问题。2013年开始我们有了数据平台的概念,2018年通过引入云原生技术打造新一代基础设施平台,从那时起,平台需求有了稳定的增长,采用率也在持续提升,目前数据索引平台上的项目已超过400个。我们所构建的平台目标是在高度安全的自助服务平台中完成所有分析需求,并且具备以下特点:开源工具模型强大的计算能力严格的安全和合规措施所有的分析集中在同一个平台满足全球和本地需求▎挑战与方案目前我们在由传统的Hadoop平台向Kubernetes过渡,但是对于作业管理和多框架支持方面还存在一些挑战,如下:1.Job的管理a.Pod级调度,无法感知上层应用b.缺乏细粒度的生命周期管理c.缺乏任务依赖关系,作业依赖关系2.调度a.缺少基于作业的调度,如:排序、优先级、抢占、公平调度、资源预定等b.缺少足够的高级调度算法,如:CPU拓扑、任务拓扑、IO-Awareness,回填等c.缺少对作业、队列、命名空间之间资源共享机制的支持3.多框架支持a.对Tensorflow、Pytorch等框架的支持不足b.对每个框架部署(资源规划、共享)等管理比较复杂利用Kubernetes来管理应用服务(无状态应用、甚至是有状态应用)是非常方便的,但是对于批量计算任务的调度管理不如yarn友好,同样yarn也存在一些限制,比如对新框架的支持不够完善,比如TensorFlow、Pytorch等,为此,我们也在寻找新的解决方案。▍Kubernetes + Hadoop在我们之前的集群管理上,会把Hadoop和Kubernetes的调度分开,基本上所有的spark作业都会运行在Hadoop集群中,其他的一些任务和算法会运行在Kubernetes集群,我们的目标是希望所有的任务全部运行在Kubernetes集群,这样管理起来会更简单。Kubernetes和YARN共同工作时,由于Kubernetes和Hadoop资源是静态划分的,在正常办公时间,Hadoop应用和Kubernetes各自使用自身分配资源,即便spark任务压力大也无法借用更多资源。夜晚时间,集群中仅有批处理任务,Kubernetes资源全部空闲,却无法分配给Hadoop进行有效利用,对于调度平台来讲,这不是一种最佳的资源分配方式。▍Kubernetes with Volcano使用Kubernetes管理整个集群,通过Volcano进行spark任务调度,此时不需要再对资源做静态划分,集群资源可根据Pod、Batch、Interactive任务的优先级、资源压力等进行动态调整,集群整体资源利用率得到极大提升。比如在正常办公时间内,常规服务应用资源空闲的情况下,Batch和Interactive应用资源需求增多时,可以暂时借用常规服务的资源;在假期和夜晚休息时,Batch业务可以使用集群所有资源进行数据计算,集群资源利用率得到极大提升。比如在正常办公时间内,常规服务应用资源空闲的情况下,Batch和Interactive应用资源需求增多时,可以暂时借用常规服务的资源;在假期和夜晚休息时,Batch业务可以使用集群所有资源进行数据计算,集群资源利用率得到极大提升。Volcano是专为Kubernetes而生的批处理调度引擎,其提供了以下能力:加权优先级的作业队列如果集群具有备用容量,可提交超过队列资源限制的任务当更多的pod被调度时,具备抢占能力丰富可配置的工作负载调度策略     5.兼容YARN的调度能力Volcano的引入,补齐了Kubernetes平台对批处理作业的调度管理能力,并且自Apache Spark 3.3版本以来,Volcano被作为Spark on Kubernetes的默认batch调度器,安装使用更方便。业务常用特性▍冗余与局部亲和Volcano保留Kubernetes中pod级别的亲和性反亲和性策略配置,并增加了task级别的亲和性和反亲和性策略。▍DRF(Dominant Resource Fairness)调度DRF调度算法的全称是Dominant Resource Fairness,是基于容器组Domaint Resource的调度算法。volcano-scheduler观察每个Job请求的主导资源,并将其作为对集群资源使用的一种度量,根据Job的主导资源,计算Job的share值,在调度的过程中,具有较低share值的Job将具有更高的调度优先级。比如集群资源总量为CPU:18C,Memory:72GB,两个用户分别是User1和User2,每个User分配1个队列,在提交作业时会根据主导资源计算job的调度优先级。User1: CPU share值为 6/18=0.33,Memory share值为 24 / 72 = 0.33,最终share值为0.33User2:CPU share值为 12/18=0.67,Memory share值为 24 / 72 = 0.33,最终share值为0.67DRF策略在任务调度时,优先分配share值较低的Job,即User1所申请的资源。集群内队列资源可以通过配置权重值进行划分,但是当本队列提交任务超出队列分配的资源,并且其他队列存在资源空闲时,可以进行队列间资源共享。即User2在使用完本队列CPU资源后,可以使用User1队列内的空闲CPU资源。当User1队列提交新任务需要CPU资源时,将会触发抢占动作,回收User1被其他队列借用的资源。▍避免资源匮乏在使用过程中,需要避免批量计算任务与自有服务出现资源抢占与冲突的问题。比如:我们集群中有两个可用节点,集群中需要部署一个统一的服务层对外提供服务,比如Presto,或者类似Alluxio的缓存服务。但是在批量计算调度时,集群的资源空间有可能全部被占用,我们将无法完成自有服务的部署或升级,为此我们增加了空间可用系数相关配置,为集群预留一些备用空间,用于自有服务的部署使用。▍DRF 仪表盘我们根据Volcano的监控数据做了一个drf调度的仪表盘,在不同层次显示更细粒度的调度信息。在业务集群中,我们有一个队列存放交互式用户的任务,另有队列存放平台运行的所有重大项目的计算任务,我们可以为重大项目队列提供一定的资源倾斜,但是此时对交互式用户的任务将不会太友好。目前我们正在考虑增加集群高峰时段展示的功能,为用户提供更多的集群使用状态和压力等信息,在自助服务平台用户视角来看,用户按照集群的繁忙程度选择自己任务的开始时间,这样可以避免后台复杂的配置就可以获得高性能的运算体验。总结Volcano对批处理任务调度做了很好的抽象,使我们在Kubernetes平台能够获得更高的调度性能,后面我们也会将开发的功能逐步回合社区,比如:DRF Dashboard、在每个节点添加空闲空间、自动队列管理、更多的Prometheus监控指标、Grafana仪表盘更新、kube-state-metrics更新和集群角色限制等。Volcano社区技术交流地址Volcano官网:https://volcano.shGitHub : cid:link_0每周例会: https://zoom.us/j/91804791393添加社区小助手k8s2222回复“Volcano”进入技术交流群
总条数:1350 到第
上滑加载中