1、演講人潘志雄-阿里云高級技術專家如何建設流批混部的高可用Serverless Flink平臺Serverless Flink整體架構跨可用區容災流批混部未來展望Serverless Flink整體架構Why Serverless?低成本按量付費免運維開箱即用高彈性快速啟動、規?;渴餒ow Serverless多租安全隔離管控面數據面混部安全性云原生容器服務k8s高可用跨可用區容災整體架構統一資源池Serverless InfraK8SKoordinatorVirtual Cluster普通ECS標準化多租K8s管控面多租Serverless底座 (Pyxis)彈性容器ECI南北向網絡連通東西
2、向網絡隔離網絡多租SLO混部資源管理與調度DNS服務發現彈性Quota跨可用區/負載均衡調度計量計費云原生資源全托管hook攔截注入云原生、安全與其他易擴展插件機制神龍裸金屬x86&arm免密臨時TokenVirtual Kubelet網絡PrivateLinkENIPrivateZoneANSM安全容器katarunDPyxis統一租戶接口Serverless Flink輕量化多租k8s管控面多租Virtual ClusterAPIServerETCDVirtual Clustervc-syncerSuper MasterVNodevn-agent混部節點kubeletcontainerd安
3、全容器安全容器KCMVirtualCluster標準化多租k8s管控面多租Virtual APIServerVirtual APIServerSuper MasterScope ManagerVirtualAPIServer輕量化多租kubeletcontainerdrunCkubeletcontainerdrunC獨占節點獨占節點Convert ManagerACL AuthorizerkubeletcontainerdrunC獨占節點數據面多租混部節點kubeletcontainerdrunDrunDagentrootfsvolumecontainerenivethansm計算隔離:安全容
4、器網絡隔離:VPC 存儲隔離:云盤container彈性Quotaclusterflink-reserve-capacityflink-pay-as-you-goflink-systemtenantA-roottenantA-root-q1tenantB-roottenantA-root-q2tenantC-rootpod(JM)pod(TM)pods(system)minmaxadmission已使空閑空閑已使Quota內已使Quota外空閑已使Quota內已使Quota外等待調度已使Quota內已使Quota外等待調度禁提交跨可用區容災核心問題庫存管理高可用網絡打通可用區無感調度一鍵容災遷
5、移整體架構計算集群AZ-2AZ-xJM-2TM-2JM-1TM-1高可用ANSM網關集群EndpointAZ-2AZ-xEndpointAZ-1JM-1TM-1EndpointAZ-1OSSKafkaRDSENIENIENIENIENIENIENIENIENIENI安全組B安全組A集群總資源售賣資源高可用資源Pyxis可用區調度決策自動化可用區遷移資源統計聚合jobjob可用區狀態可用區故障信號高可用網絡打通高可用ANSM網關集群EndpointAZ-2AZ-xEndpointEndpointAZ-1OSSKafkaRDSENIENIENIENIENIENI網絡打通:ANSM網關(Alibab
6、aCloud Network Service Mesh)高可用:網關跨可用區多副本部署replicas:2-ntopologySpreadConstraints:-labelSelector:matchLabels: x%按照等比例、整體均衡、高可用均衡等策略以及一定的步長動態計算可售賣的CU,需要滿足:任一可用區故障后高可用CU均可以成功在其他可用區拉起未使用CU之和=用戶未使用保障CU之和+待售賣CU系統預留CU常態化用于彈性以及庫存應急,在可用區故障時候可以開啟用戶未使用保障CU系統預留CU空閑CUAZ-3單可用已使用CU高可用已使用CU未使用CU可用區無感調度感知可用區空閑資源以及高可
7、用作業分布根據集群實時狀態動態注入可用區信息,需要滿足任一可用區故障后高可用CU均可以成功在其他可用區拉起調度優先策略:相同作業強制一個可用區高可用任務,優先考慮高可用任務可用區均衡非高可用任務,優先考慮可用區間空閑資源均衡pyxis-webhookpyxis-controllerNodeNodePodPod高可用AZ-1AZ-2數據統計計算Resource Summary監聽采集策略輸出計算結果watch&cachepod調度決策affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorT
8、erms:-matchExpressions:-key:topology.kubernetes.io/zoneoperator:Invalues:-zone-abindSchedule ProfileKoordinator彈性Quota調整節點邏輯資源調整節點擴展資源調整ProdBatch一鍵容災遷移用戶Workspace天然具備高可用可用區故障發生后:關閉集群自愈新增Pod禁止調度到故障可用區陸續驅逐故障可用區存量高可用Pod擴容其他可用區恢復自愈,驅逐故障可用區剩余Pod計算集群AZ-2AZ-xXXJM-1JM-1AZ-1JM-1TM-1JM-2TM-2可用區狀態可用區故障信號Pyxis新
9、Pod禁止調度故障可用區故障驅逐存量高可用Pod高可用高可用流批混部資源碎片整理滿足大規格Pod需求啟動性能任務快速啟動資源彈性提升資源利用率,分時復用核心問題核心問題調度性能大規模批任務啟動隔離cpu&memory,io&網絡整體架構koordlet預導入裸金屬混部節點runD安全容器基礎隔離io隔離網絡隔離cpu熱插拔ENIcontainerdkubeletKoordinator差異化SLOQoS感知Pyxis資源預留彈性QuotaResourceSummary資源碎片整理PriorityQuotaSchedule ProfileQoS Strategy配額管理重調度VPA資源池自動擴縮容
10、彈性節點池ECINodeGroupACS動態導入ECS節點池ECSECSElasticity Profile物理負載均衡批任務優先級管理調度koordlet混部節點runD安全容器containerdkubeletKoordinator差異化SLOQoS感知資源預留彈性Quota物理負載均衡K8S MasterReserve Profile引入Koordinator支持流批混部調度性能 1000 pods/s各節點提前預留部分大規格Pod供Flink Session和流使用,針對不滿足的情況通過重調度批任務再進一步整理Pyxis重調度資源碎片整理Node Metrics啟動性能runD安全容器
11、整體速度提升95%Pod啟動=調度+網卡掛載+存儲掛載+容器創建+容器啟動+init容器運行rootfsvolumecontainerenivethansmCPU BurstrunD啟動優化ENI池化runD built-in storageTaskManager預啟動隔離koordlet混部節點runD安全容器基礎隔離io隔離網絡隔離cpu熱插拔ENIcontainerdkubeletKoordinatorNode MetricsPyxis作業類型作業優先級動態調整混部隔離cpu&memoryionetworkKoordinator感知節點多維度資源水位,調整節點打分Pyxis根據作業類型以
12、及優先級,動態設置隔離參數資源彈性預導入裸金屬混部節點PyxisResourceSummary資源池自動擴縮容彈性節點池ECIACS動態導入ECS節點池ECSECS批任務EBMEBM引入ECI/ACS資源池,豐富彈性資源供給夜間動態彈出ECS節點,用于大規模批任務運行動態計算Batch資源,供批任務使用未來展望Serverless Flink平臺-通用大數據底座統一資源池普通ECSpyxis-dnsPyxis:開源大數據Serverless底座彈性容器ECI神龍裸金屬x86&armPyxis統一租戶接口(ControlPlane)pyxis-controllerappsnodessecurit
13、ynetworkingpyxis-webhookpyxis-managerpyxis-frameworkwatch&reloadmutate&validatereconcileresourcesnewwatchwatchreconcilereconcile沉淀通用能力支持更多大數據引擎Serverless化THANK YOU謝 謝 觀 看網易游戲 Flink 云原生實踐林小鉑網易游戲實時計算&數據湖平臺負責人陳宇智網易游戲大數據開發工程師背景架構演進實踐挑戰總結和展望背景資源管理發展Flink on K8sFlink on 混合云Flink on Yarn201820232024資源統一管理和
14、調度資源隔離能力差復用現有離線資源容錯性好資源粒度較粗,異構資源調度靈活性低運維成本高Flink on Yarn 優劣優勢劣勢VS架構演進部署模式 Standalone Mode自行創建和管理資源,資源利用率低管理復雜,擴展性差 Native Mode作業按需申請計算資源需要自行處理作業異常和升級 Flink Operator自動管理 Flink 作業及其生命周期深度集成,提供健康檢查、配置優化等特性Flink on K8s資源池存儲Docker RegistryHDFSCubeFS調度K8s作業管理Flink OperatorLambda 調度器作業Flink StreamingFlink
15、BatchFlink SQL作業編排Native SDKFlinkdeploymentCRDPodSVCCMIngressK8s 資源高可用ZookeeperVirtual-kubelet 引入自建 K8s 機器資源有限,與容器團隊合作基于 Virtual-Kubelet 接入私有云資源,帶來以下優勢:兼容 Flink K8s 使用姿勢 享受低成本高質量彈性算力 Serverless 化,簡化運維Flink on 私有云.OperatorWebhook私有云 kubeletKubelet私有云 K8sVirtual-KubeletSVCIngressCMFlink Operator Apise
16、rverETCD.kubectl1.submit 2.specsync3.specvalidate4.CRDcreated5.createdeploymnet6.create flink podjobmanager1jobmanager2.taskmanager1taskmanager2master control plane7.create other resource為何需要混合云公有云無限彈性資源按需計費高效可靠但涉及數據安全等問題私有云強控制權安全性高成本穩定可預測靈活性好但資源有限,維護成本高混合云彈性伸縮成本控制穩定高效安全敏捷Flink on 混合云共享存儲CubeFSHDFSO
17、SS容器編排私有云自建 K8sACK作業管理Flink OpeartorLambda 調度應用Flink Streaming日志采集指標上報告警鏡像管理基礎設施計算:CPU、Memory網絡:VPN、VPC存儲:SSD、HDDFlink BatchFlink SQLkeytab、jar 分發其它周邊配套虛擬集群集群管理容量管理實踐挑戰混合云部署Lambda 調度器自建 K8s 編排私有云編排ACK 編排K8s ApiserverFlink podHDFSS3 ProxyFlink OperatorKeytab uploadder前端用戶K8s IngressCRD 編排1.提交 jar2.啟動
18、作業3.上傳 jar4.定時同步5.作業編排6.提交 CRD4.同步 keytab7.創建 Flink pods9.同步 jar8.reconcile10.暴露 servcie11.輪詢監控應用場景流量高峰負載轉移游戲 CBT 測試異地容災On K8s 服務混部Flink streamingFlink SQL數據湖優化批作業kubeletNodehangoutlogstash其它在線服務kubeletNodelabel=streamflytaint=flink-grouplabel=loggingtaint=ol-groupApiserver計算服務資源池在線服務資源池閑時負載裸進程服務混部p
19、rocesseskubeletProcesskubeletprocessporcessplace holderplace holderprocessplace holdernode1node2processeskubeletProcesskubeletprocessporcessplace holderplace holderplaceholderprocessplace holdernode1node2processk8sk8sresourcemapresourcemapresourcemapresourcemap資源變化flinkpodflinkpodflinkpodflinkpodfli
20、nkpodflinkpodPod 驅逐自動擴縮容K8sFlinkPulsarVM agentMonitortalos集群狀態感知指標查詢作業狀態跟蹤DS2/Lag 算法PrometheusTM 水平伸縮TM 垂直伸縮JM 垂直伸縮Lambda 作業調度BlackHoleK8s Apiserver用戶metricsreportaggregate指標服務querytriggerapplyscalealertnotify自動擴縮容效果和收益作業資源自動伸縮,業務人力介入成本減少 30%作業成本降低 20%流批一體KafkaSourcePulsarIcebergTransformerLoaderinc
21、lude/exclude rulesFilterParserExtenderparse rulesextend rulesudf/udtfsink mapingKafka/PulsarSinkHDFS/IcebergDoris/CK.Entryx 共享算子模塊Flink streaming jobFlink batch jobstreaming/batch job 共用一套代碼,開發成本低自定義邏輯使用 udf/udtf 表達,自由度高結合自動擴縮容,低峰期自動拉起批作業Flink K8s Operator 內存優化集群作業規模不變情況下,Opeator 內存持續增長,最后因為 OOM 被系統
22、 kill 掉Flink K8s Operator 內存問題分析從 04.24 20:00 到 04.25 01:20,內存增長:34.725G-34.630G=95MBFlink K8s Operator 內存問題分析pmap 內存分析對比,內存增長主要是在棧內存地址段;從 74 MB(35444 KB+39668 KB)增長到 165 MB(65536 KB+65536 KB+35708 KB),增長 91 MB,基本符合前述監控中 95 MB 的增長。結合 Profile 分析內存增長主要發生在線程創建,確認是 glibc 多線程場景下的內存碎片問題,升級為 jemalloc 優化內存使
23、用Flink K8s Operator 其他優化Keytab 同步優化HDFS+S3 Proxy+Sidecar Container同步機制多種 rest serviceOperator 支持 Ingress+多種 rest svc 類型總結和展望生產現狀1w+作業10w+核50%上云10萬億日處理收益 基于服務混部和自動擴縮容,機器資源節省 30%70%作業計算成本下降 40%,平均成本下降 20%更多廉價彈性資源,保障業務增長未來展望 性能和規模提升,滿足大規模容災類場景 流批一體推廣 智能化運維,深度融合機器學習THANK YOU謝 謝 觀 看Serverless Flink:小紅書在云
24、上k8s的Flink集群部署遷移之路趙寶珠小紅書數據引擎研發工程師Serverless Flink:Xiaohongshus Journey in Migrating and Deploying Flink Clusters on Kubernetes in the Cloud現狀&痛點問題&解法收益&展望現狀&痛點現狀現有混部池資源規模100w+coreFlink獨占池規模30w+coreK8sFlinkCOSOSS阿里云騰訊云StreamBatch推薦數倉廣告社區安全調度計算平臺應用存儲服務器Flink作業管理平臺痛點Flink獨占資源池存在資源閑置靈活性差Flink獨占資源池運維成本高獨
25、占池業務無法充分利用全部資源存在眾多小業務,資源需求只有個位數資源碎片不同業務之間無法快速拆借資源資源優化成果難以落地Flink獨占池擴縮容流程復雜,涉及預算審批、云廠商開關機、機器環境初始化、K8s集群擴縮容等多個環節,單次流程耗時在天級別各個子業務使用不同的獨占資源池,維護上百資源池人力成本巨大問題&解法池化quota資源部署方案擴縮容只需要調整quota資源用多少申請多少,隨時可退不需要關心系統開銷、資源碎片成本FlinkPodFlinkPodFlinkPodFlinkPodFlinkPodFlinkPodFlinkPodFlinkPodnodenodenodenodepool Apoo
26、l BFlink獨占集群公共混部集群FlinkPodPodFlinkPodFlinkPodFlinkPodFlinkPodFlinkPodPodFlinkPodPodFlinkQuota AFlinkPodFlinkQuota B其他業務quota Cnodenodenodenode利用quota資源池的抽象,完成資源管理quota背后的預算管理、開機、初始化、集群擴容等流程都由平臺負責池化quota資源彈性擴縮容方案BaremetalSupplyFlink作業管理平臺QuotaServer預算管理預算管理QuotaServer二次調度退機QuotaServer統一調度BufferCA-自動開
27、機統一調度二次調度退機quota擴容quota縮容啟動作業停止作業標準混部池池化quota資源負載感知系統負載感知畫像系統實時感知負載預測基于Workload歷史監控預測未來負載,規避未來熱點實時感知Node負載,規避當前熱點NodeMetrics ControllerMetricsAwareControllerControllerAPIServer監控系統NodeAgentNodeAgentresourceProfilerNodeMetricsMetricsAwareWorkload畫像服務實時更新核心指標監聽MetricsAware匯總畫像,更新NodeMetrics獲取歷史監控更新預測指
28、標池化quota資源負載感知系統基于負載感知的調度調度二次調度實時感知機器負載,主動驅逐熱點機器上的pod調度時主動過濾熱點機器規則熱更新熱點機器判定條件、pod驅逐優先級等規則支持熱更新NodeMetrics ControllerMetricsAwareControllerControllerAPIServerresourceProfilerNodeMetricsMetricsAwareWorkload畫像服務SchedulerDescheduler實時負載感知調度實時負載感知二次調度動態更新規則降低池化quota資源pod驅逐對Flink作業的影響池化quota資源驅逐場景混部池會定期掃描
29、利用率低的機器,驅逐pod進行退機規避熱點機器時的二次調度會基于pod的優先級驅逐部分pod如何降低pod驅逐對Fink作業的影響?容器側和Flink交互,由Flink引擎主動控制Pod驅逐流程Flink引擎內提前申請資源,主動重新部署task,釋放待驅逐pod容器服務與Flink引擎的驅逐交互降低池化quota資源pod驅逐對Flink作業的影響容器服務Flink引擎Node維度匯總待驅逐的pod構造Flink請求URL請求驅逐Pod列表返回RequestId或者結果校驗pod是否在用申請冗余pod資源ready后拉黑pod并觸發task重啟根據RequestId輪訓結果返回是否可驅逐根據返
30、回結果執行驅逐或放棄釋放空閑pod降低池化quota資源pod驅逐對Flink作業的影響Flink 內部熱遷移流程整體流程端到端耗時較長,需要增加超時邏輯針對其中的任一環節都要進行異常處理并結束整個流程關注作業狀態變化,作業變為非running狀態需要結束熱遷移流程生成并返回RequestId收到驅逐請求根據請求傳入的Pod數量,申請對應的新Pod返回RequestId對應的請求狀態收到驅逐結果請求結束是否申請完成是否超時觸發checkpoint獲取Pod上的Task集合主動重啟Task設置驅逐請求為失敗上述流程正常執行設置驅逐請求為成功結束否是否是否是池化quota資源的IO性能保障本地存儲
31、選型使用CSI Ephemeral Inline Volumes 規避對宿主機的磁盤泄漏問題IO敏感的作業單獨申請掛載高性能SSD云盤Flink作業向池化資源的遷移方案前置檢查遷移流程工具化、白屏化明確遷移順序后置檢查批量操作一鍵遷移一鍵quota擴容版本校驗依賴校驗資源校驗作業延遲快照耗時快照失敗低優先級作業優化資源池分配率低優先資源需求作業優化收益&展望資源擴縮容耗時天級別-分鐘級別年底遷移60k core左右總體成本收益接近10k core應用AutoScaler進一步降低成本收益&展望階段收益后續規劃擴大池化資源覆蓋度THANK YOU謝 謝 觀 看Flink on K8s 在美團的落
32、地實踐馮斐計算引擎研發工程師袁懷旺資源調度系統研發工程師美團Flink的部署現狀美團Flink上云的探索和實踐美團K8s針對實時場景的持續優化未來規劃美團Flink的部署現狀Flink 規模10萬任務百萬核資源15億高峰QPS當前問題穩定性:資源隔離不徹底,同一節點上不同作業可相互影響運維效率:隊列資源與物理機綁定,資源的擴縮騰挪流程低效資源效率:大部分隊列中都留有冗余的資源,而資源緊張的隊列往往存在碎片資源CPU1CPU2CPUnjob1job3job2.nodenodenodenodequeue1nodenodenodequeue2node解決思路資源共池彈性擴縮容資源隔離+美團Flink
33、 上云的探索和實踐整體部署方案實時計算平臺提交服務apiserver delegationtokenmanagerJMTMTMFlinkDeploymentflink rest proxy 日志收集指標收集flinkkubernetes operatorK8s集群提交/停止Job提交/刪除CR調諧CRFlinkSessionJob控制面基于社區Flink Kubernetes Operator的部署架構Flink容器化改造Flink ContainerWorkingDirLog DiremptyDirhostPath宿主機網絡宿主機dns指標:復用基于log收集的metric-reporter
34、日志:fluent-bit 收集到S3持久化存儲FlinkUI:通過代理服務將集群內的JM Rest服務暴露給用戶hdfs token:新增token管理組件,完成hdfs token的apply/renew/cancel 等操作公共依賴:yarn節點上存在的依賴直接打入鏡像中多個configmap合并為1個增加對 jm 探活和重調度移除兩個service優化并消除所有list請求優化apiserver的重連策略支持 tm 資源的冗余申請Flink穩定性優化優化負載部署容錯operator調諧流程優化提交任務刪除任務operatorS3JM調用rest接口downloadAndRunJarru
35、n jar jobfetch jar userjar不再由operator下載并提交,避免operator成為提交單點瓶頸清理HA數據交由JM自己負責,operator僅負責兜底,避免operator成為kill作業瓶頸operatorJM調用rest接口 shutdownCluster清理HA數據HDFS異步檢查&清理operator調諧吞吐優化調諧并發?。?修復線程池設置bugrest 服務就緒慢-不等待service關聯pod-池化復用RestClient序列化操作頻繁-改用Kryo序列化-精簡CR內容-刪除不必要的序列化操作通過線程棧及火焰圖分析,發現壓測過程中調諧吞吐不高的原因:op
36、erator優化效果規模:operator 可調諧的單集群任務數達到2w吞吐:提交作業吞吐可達1000 app/分鐘,全程穩定其他優化調度語義-pod均勻調度到所有節點-有狀態作業調度到SSD節點遷移工具-作業預跑檢查-自動設置 cpu request、調度親和性-批量遷移運維+穩定性檢查美團K8s針對實時場景的持續優化業務特征單Pod規格小單機pod數500作業數量多萬級別單作業并發大單作業tm數量1000+業務訴求規模:提升單集群承載力調度性能:保障創建Pod吞吐穩定性:故障處理時效性整體吞吐1000app/m單app啟動時延小于1.5minPod35w+App3w+SLA單節點500po
37、d規模問題和挑戰大批量作業watch Event延遲嚴重節點資源泄漏容器并發啟動時延長Event延遲問題1000app/min創建作業客戶端客戶端etcdreflectorincomingWatchCachedispatchwatchersresultinputfilterlabelSelector=applabelSelector=appKube-apiserverindexfilterwatch index優化resultinputIndex優化方案增加watch索引優化filter節點資源泄漏問題系統進程(kubelet+containerd)CPU、內存隨Pod數量增加持續增長8121
38、50246810121416160220330單機Pod數與系統內存關系(G)主要原因1.Cadvisor通過ps獲取容器pid,讀取宿主機/proc/meminfo 文件產生大量pipe2.Kubelet exec du進程消耗大量io資源優化前優化后內存OOM200MCPU3.5C0.2C優化1.去掉指標采集2.dugo原生計算方式容器啟動時延問題并發容器數create_container 時延(avg)start_container 時延(avg)607.6s2.0s8010.5s2.4s10014.7s3.3sDocker+Devicemapper并發容器數create_contain
39、er 時延(avg)start_container 時延(avg)600.2s2.4s800.1s13.3s1000.2s16.2sDocker+Overlayfs存儲驅動Overlayfs在讀寫和存儲性能上比devicemapper表現較好容器啟動時延問題syncPodContainerManagerCRIdockershimDockerContainerdContainerdCRIkubelet容器運行時Containerd比docker啟動容器更快解決方案現狀方案容器運行時dockercontainerd存儲驅動devicemapperoverlayfs2.613.416.40.70.7
40、1.1051015206080100容器并發啟動時延對docker+devicemappercontainerd+overlayfsContainerd+overlayfs調度優化支持gang調度 提供all-or-nothing調度語義支持配額調度 提供基于min和max的資源管理能力支持優先級調度 隊列優先級,任務優先級,多級隊列豐富的調度語義 基于節點label、污點、親和/反親和,pod親和/反親和 資源均衡、租戶公平調度,基于拓撲分布微調高調度吞吐 基于集群容災,支持高調度吞吐-基于K8S自研調度器性能問題1.使用 dynamic provision pvc在大并發時調度時延增加明顯
41、2.gang調度!=同時調度,調度能力沒有提升3.沒有根據調度實際語義進行調度4.隨著規模增加,全局最優耗時較多5.Event延遲造成重復調度優化策略emptyDir替代LVM+PVCxfs+emptyDir緩存調度PrefilterPreScore局部最優同質調度調度狀態優化忽略Pod 狀態為已分配且nodeName為空的event同質調度queuepodgrouppodgrouppodpodpodnodenodequeuejobjobpodpodpodnodenodeOpenSessioncacheCloseSessionpredicatenodeordergangprioirtyallo
42、catepreemptqueuejobpodPredicatePrioritizeBindNodeCacheApiServer調度過程:預選-優選-調度同質Pod:jm創建的一組tm資源規格相同同質12update34sortnodeCache:一輪調度中同質作業的調度cache,cache內基于資源均衡調度避免熱點調度吞吐類別優化前優化后單Pod調度時延tp9960sms級調度吞吐300 pod/秒實時:1000+pod/秒離線+壓測:4000+pod/秒實時:集群級遷移 1000app/m,單app 10個tm,創建pod qps 1000+離線壓測壓測集群配置:apiserver 5副本
43、,單副本max-requests-inflight=5000 集群規模:基于kubemark,5k node,100k+pod,創建并發:客戶端并發1100*4,創建pod 并發 4000+(40004300)單作業tm數量越多,吞吐越高,調度器性能尚未達到瓶頸集群穩定性問題控制面穩定性高IO造成系統組件不正常業務超賣搶占系統預留資源異常故障解決方案1.IO隔離磁盤隔離reservedassignableexclusiveshared系統預留綁核預留+非綁核業務datasys2.資源預留+隔離1.業務搶占預留資源2.業務不占用預留資源非綁核故障感知與處理K8s節點故障決策處理禁止調度驅逐恢復K
44、8s故障感知與處理sK8s內部組件異常:kubelet異常、網絡異常、節點宕機資源不足:磁盤、內存、pid自愈處理問題1.假恢復2.容器引擎異常,如containerd3.節點熱點、空間滿4.節點維修效率低故障感知與處理NPDkubeletNPDkubeletnodenodecontrollerconditionconditionpodpodwatchDarinoTaint/cordon/drainwatch自愈告警報修K8s+NPD+Darino+自愈系統K8s節點持續ready+探測NPD+Darino+自愈系統1.NPD監控Disk、CPU、IO2.Darino決策處理3.節點監控和告警
45、4.訂閱告警,自動處理異常節點.apiserver機器指標異常自動處理秒級監控+分鐘級處理快拉黑+慢恢復節點故障下線報修零假恢復節點在線率98%關鍵策略與收益策略收益控制面優化優化etcd,支持5k+并發(maxGapBetweenApplyAndCommitIndex)高性能高可用高并發減少對象大小List查詢使用informer,RV=“0”Apiserver 灰度發布+readyz檢查異常流量APF限流未來規劃資源優化彈性伸縮流批混布未來規劃THANK YOU謝 謝 觀 看Flink在B站的大規模云原生實踐Large-Scale Cloud-Native Practice Of Flin
46、k at Bilibili丁國濤嗶哩嗶哩 資深開發工程師背景介紹功能及穩定性優化性能優化運維優化未來展望背景介紹背景介紹運行環境一致性基礎環境依賴物理機,環境不統一隔離性好,環境統一作業隔離好,容器運行環境一致獨占集群,資源使用率不高實時集群和其他離線集群獨立使用資源隔離性差隔離性差,作業間影響資源池統一,提高利用率實時離線統一,提高資源利用率生態繁榮統一基礎底座、運維管理和生態繁榮云原生化的優勢FlinkOn YARN云原生化系統設計 按隊列區分不同部署模式,對用戶透明,保障用戶體驗 與YARN集群統一任務管理方式實時計算平臺Flink作業YARN 集群隊列K8S 集群隊列監控作業狀態當前規
47、模Checkpoint狀態單作業最大狀態 30TB+最大作業并行度 6000+作業規模Streaming數量:6500+Batch數量:3000+部署模式Native Flink On K8S流批混部、Spark混部功能及穩定性優化 云原生化改造 穩定性改造Flink鏡像 鏡像分層,Base鏡像和發版鏡像,Flink發版后復用Base鏡像 Base鏡像增加arthas、gdb、strace等調試組件 刪除多余模塊 增加usrlib目錄,Flink啟動時,默認加載該目錄p 默認放置Flink SQL作業依賴p SQL作業,結合udf資源,生成userClasspathp JAR作業,默認不加載u
48、srlib目錄,避免和JAR作業依賴沖突/opt/flink bin conf lib plugins usrlib flink-bilibili-starter.jar table api 等依賴jar鏡像改造支持本地路徑掛載為Pod掛載物理磁盤hostPath機器從YARN集群遷移物理機遷移磁盤掛載在/mnt子目錄Flink進程啟動時篩選可用目錄統一掛載根目錄物理機磁盤數量不統一磁盤故障,權限問題等磁盤異構優化RocksDB磁盤選擇,根據磁盤IO、剩余容量等選擇最優磁盤磁盤優化RocksDB默認隨機選擇磁盤磁盤負載不均增加Pod lifecycle,Pod退出時通過preStop清理數據清
49、理數據在Pod退出時,不會刪除數據殘留數據JobManager Failover JobManager Pod是由Deployment生成的,會在Pod失敗時,自動拉起p 關閉HA時:任務將從首次啟動的Checkpoint/Savepoint路徑恢復 p 開啟HA時:任務可以從正確的Checkpoint恢復,但遇到JM故障時,會無限制重試 On YARNOn Kubernetesyarn.application-attempts,yarn.application-attempt-failures-validity-interval 允許AppMaster在一定時間內的失敗次數未開啟HA時,默認
50、為1在JobManager啟動時,判斷當前Pod restart次數,超出閾值時,則作業失敗未開啟HA時,默認為1pod重新調度時,restart會重置,未來繼續改進異常Pod異常PodPod 處于失敗狀態Pod 處于Running狀態 作業處于非健康的狀態 強制刪除異常Pod JobManager:重啟作業 TaskManager:遷移Pod 觸發作業重啟 殘留Pod處于Unknown狀態 導致作業被誤認為雙跑 影響k8s性能機器、kubelet進程、磁盤等異常時,會引起Pod異常異常TM Pod處理Kubernetes TaskManager Pod Watcher:監控Pod狀態變化,并
51、關注NodeLost事件p 強制刪除異常Podp Pod是Running狀態時,熱遷移PodTM WatcherflinkKubeClient1.watchResourceManagerK8sResMngr2.force deleteJobMasterSchedulerExecutionGraphSlotPoolCheckpointCoordinatorblocklistHandler4.request new slots5.trigger checkpoint6.cancel tasks7.release blocked slots8.start tasks3.add block nodes
52、異常JM Pod處理 增加JobManager Pod Watcherp 運行時NodeLost:強制刪除異常Pod,刪除Deployment,觸發JM失敗p Failover時異常Pod:刪除異常Pod記錄KubernetesJM WatcherflinkKubeClient1.watchK8sResMngr2.force delete3.delete deploymentKubernetes機器1機器2K8sResMngrJobManager PodflinkKubeClient1.宕機2.拉起新JM3.Recover&Check運行時Watch 異常啟動時Check異常JobManage
53、r Pod資源不足問題改進NodePort:每個作業會占用一個全局唯一的端口,導致配置的端口范圍內資源不足 Host網絡,作業啟動時會隨機獲取一個REST端口,并更新到Rest Service中 Headless ClusterIP,記錄了上述產生的IP和端口 實時平臺解析Rest Endpoint中 IP+端口現狀Pod線程數隔離Pid數量限制服務器無法創建線程 部分作業中線程泄漏,引起所在機器可用線程數不足,影響機器上所有作業 增加Pod Pid數量限制,超出限制后,kill Pod 啟動時根據numberOfTaskSlots值調整閾值大小,避免固定參數的不足問題優化性能優化 作業性能優
54、化Flink進程腳本執行慢Pod中Flink進程啟動慢,長達23min鏡像預熱OpenKruise,每天晚上預熱鏡像鏡像拉取耗時長Flink鏡像大小3G+,拉取長達45min提交作業超時提交作業時,因超時被平臺kill鏡像分層Base鏡像:不經常變動的系統環境增量鏡像:Flink版本包,400MB+ServiceLinks優化Pod加載上萬環境變量,腳本執行慢enableServiceLinks:falsePod啟動速度優化Pod啟動慢優化改進Pod+Flink進程啟動耗時90線:2 3 sFlink作業啟動速度優化Flink On Kubernetes 作業啟動耗時90線:30 35 s01
55、020304資源分發優化SQL作業依賴包含在鏡像中JM/TM啟動時下載 UDF/User Jar資源預申請&動態申請作業啟動RM后,立即申請TM資源額外申請冗余資源,解決慢節點RPC性能優化優化submitTask耗時,異步注冊metricsSQL編譯結果緩存緩存SQL編譯結果(transformations)作業重啟時,復用編譯結果,加速啟動K8S資源調度優化 默認模式下,部分作業可能出現集中調度在某些機器上,導致這部分機器出現負載高、磁盤IO高和磁盤寫滿等不穩定因素機器1TaskManagerTaskManagerTaskManagerTaskManagerTaskManagerJobMa
56、nager機器2機器3機器requestcreate podsKubernetesK8S資源調度優化 反親和性調度:控制 Pod 在集群中的分布,避免它們在集群中過于集中JobManager機器requestcreate podsTaskManager機器1TaskManager機器2TaskManager機器3TaskManagerTaskManager機器NKubernetes靈活的資源定義與彈性作業啟動時,JM需要加大資源加速啟動(SQL編譯)作業運行時,JM負載較低,帶來資源浪費1C4G是YARN的最小資源粒度資源區分request、limit(CPU)作業啟動時,使用limit資源加
57、速啟動(SQL編譯)作業運行時資源,按request計算不限制資源粒度On YARNOn K8S靈活的資源定義其它優化熱擴縮支持REST請求資源變更(VPA和HPA),減少作業啟停對業務影響單點恢復針對容忍少量數據丟失場景,對失敗TM進行恢復,實現作業不斷流優先級調度K8S感知作業SLA級別,資源緊張時,優先滿足高優作業資源運維優化 作業運維及異常診斷改造作業遷移 Flink Managerp 遷移任務隊列+遷移機器p 實現Flink作業自動遷移,降低用戶感知p 監控遷移前后作業運行狀態(Checkpoint),保障作業穩定性確定需要遷移的隊列stop-with-savepoint或者超時下線
58、從Savepoint/Checkpoint提交到K8S集群監控作業運行狀態篩選隊列所有運行作業確定需要遷移的機器篩選機器上運行作業Flink黑名單重啟,遷移Pod監控作業運行狀態移除機器label節點不可調度作業故障排查 問題p 日志存放于Pod中,作業失敗時,日志采集不一定足夠及時p K8S Event信息對排查問題有幫助,但未暴露出來 優化p 掛載Pod日志到宿主機,日志不隨Pod失敗而被刪除p K8S負責清理無用日志,默認超過1天則會刪除p K8S暴露Pod Event事件,方便故障排查K8S 事件中心日志平臺Pod宿主機Kubernetes記錄Pod Eventhost mount日志
59、采集Core Dump改造 問題p 部分作業UDF函數中含有JNI調用,JNI異常時,將直接導致TaskManager Crash,導致作業失敗 優化p 增加Java ErrorFile文件p 將Flink進程放后臺運行,在Flink進程Crash時,Pod不失敗,從而寫出Core Dump文件p 啟動腳本增加Flink進程監控,在Flink進程失敗后,退出Pod,并返回Flink進程失敗退出碼p 增加Core Dump事件告警p 注意:解析Core Dump文件,依賴運行時Flink鏡像未來展望負載均衡結合Flink作業資源畫像信息,通過調度和Descheduler來實現機器資源負載均衡多機房容災探索多機房高可用部署潮汐混部利用Flink作業潮汐特性,和其它資源混部,提升資源利用率未來展望THANK YOU謝 謝 觀 看