主頁 >  其他 > Qunar 云原生容器化落地實踐

Qunar 云原生容器化落地實踐

2021-09-19 12:45:39 其他

作者|鄒晟 去哪兒網基礎平臺技術專家

背景

近幾年,云原生和容器技術非常火爆,且日趨成熟,眾多企業慢慢開始容器化建設,并在云原生技術方向上不斷的探索和實踐,基于這個大的趨勢, 2020 年底 Qunar 也向云原生邁出了第一步——容器化,

云原生是一系列可以為業務賦能的技術架構準則,遵循它可以使應用具有擴展性、伸縮性、移植性、韌性等特點,云原生也是下一代技術堆疊的必選項,它可以讓業務更敏捷,通過實踐 DevOps、微服務、容器化、可觀測性、反脆弱性(chaos engineering)、ServiceMesh、Serverless 等云原生技術堆疊,我們便可以享受到云原生帶來的技術紅利,

Qunar 容器化發展時間線

一項新技術要在企業內部落地從來都不是一蹴而就的,Qunar 的容器化落地也同樣如此,Qunar 的容器后落地主要經歷了 4 個時間節點:

  • 2014 - 2015:

    業務線同學開始嘗試通過 Docker、Docker-Compose 來解決聯調環境搭建困難的問題,不過由于 Docker-Compose 的編排能力有限、無法解決真實的環境問題,因此容器化最后也沒有推行起來,

  • 2015 - 2017:

    ops 團隊把為了提高 ELK 集群的運維效率,把 ES 集群遷移到了 Mesos 平臺上,后來隨著 K8s 生態的成熟,把 ES 集群從 Mesos 遷移到了 K8s 平臺,運維效率得到了進一步的提升,

  • 2018 - 2019:

    在業務需求不斷增加的程序中,業務對測驗環境的交付速度和質量有了更高的要求,為了解決 MySQL 的交付效率問題( 并發量大時,網路 IO 成為了瓶頸,導致單個實體交付時長在分鐘級),為了解這個問題,我們把 MySQL 容器化,通過 Docker on host 的模式可以在 10 秒之內就可以交付一個 MySQL 實體,

  • 2020 - 2021:

    云原生技術已經非常成熟了,Qunar 也決定通過擁抱云原生來為業務增加勢能,在各個團隊齊心協力的努力下,300+ 的 P1、P2 應用已經完成了容器化,并且計劃在 2021 年年底全部業務應用實作容器化,

落地程序與實踐

容器化整體方案介紹

Qunar 在做容器化程序中,各個系統 Portal 平臺、中間件、ops 基礎設施、監控等都做了相應的適配改造,改造后的架構矩陣如下圖所示,

  • Portal:Qunar 的 PaaS 平臺入口,提供 CI/CD 能力、資源管理、自助運維、應用畫像、應用授權(db 授權、支付授權、應用間授權)等功能,

  • 運維工具:提供應用的可觀測性工具, 包括 watcher(監控和報警)、bistoury (Java 應用在線 Debug)、qtrace(tracing 系統)、loki/elk(提供實時日志/離線日志查看),

  • 中間件:應用用到的所有中間件,mq、配置中心、分布式調度系統 qschedule、dubbo 、mysql sdk 等,

  • 虛擬化集群:底層的 K8s 和 OpenStack 集群,

  • Noah:測驗環境管理平臺,支持應用 KVM/容器混合部署,

CI/CD 流程改造

CI/CD 改造前

CI/CD 改造后

主要改造點:

  1. 應用畫像: 把應用相關的運行時配置、白名單配置、發布引數等收斂到一起,為容器發布提供統一的宣告式配置,

  2. 授權系統: 應用所有的授權操作都通過一個入口進行,并實作自動化的授權,

  3. K8s 多集群方案: 通過調研對比,KubeSphere 對運維優化、壓測評估后也滿足我們對性能的要求,最終我們選取了 KubeSphere 作為多集群方案,

中間件適配改造

改造關注點:由于容器化后,IP 經常變化是常態,所以各個公共組件和中間件要適配和接受這種變化,

應用平滑遷移方案設計

為了幫助業務快速平滑地遷移到容器,我們制定了一些規范和自動化測驗驗證等操作來實作這個目標,

  1. 容器化的前置條件: 應用無狀態、不存在 post_offline hook(服務下線后執行的腳本)、check_url 中不存在預熱操作,

  2. 測驗環境驗證: 自動升級 SDK、自動遷移,我們會在編譯階段幫助業務自動升級和更改 pom 檔案來完成 SDK 的升級,并在測驗環境部署和驗證,如果升級失敗會通知用戶并提示,

  3. 線上驗證: 第一步線上發布,但不接線上流量,然后通過自動化測驗驗證,驗證通過后接入線上流量,

  4. 線上 KVM 與容器混部署:保險起見,線上的容器和 KVM 會同時在線一段時間,等驗證期過后再逐步下線 KVM,

  5. 線上全量發布: 確認服務沒問題后,下線 KVM,

  6. 觀察: 觀察一段時間,如果沒有問題則回收 KVM,

容器化落地程序中碰到的問題

如何兼容過去 KVM 的使用方式,并支持 preStart、preOnline hook 自定義腳本?

KVM 場景中 hook 腳本使用場景介紹:

preStart hook : 用戶在這個腳本中會自定義命令,比如環境準備,

preOnline hook:用戶會定義一些資料預熱操作等,這個動作需要在應用 checkurl 通過并且接入流量前執行,

問題點:

K8s 原生只提供了 preStop、postStart 2 種 hook, 它們的執行時機沒有滿足上述 2 個 KVM 場景下業務用到的 hook,

分析與解決程序:

preStart hook:在 entrypoint 中注入 preStart hook 階段,容器啟動程序中發現有自定義的 preStart 腳本則執行該腳本,至于這個腳本的位置目前規范是定義在代碼指定目錄下,

preOnline hook:由于 preOnline 腳本執行時機是在應用 checkurl 通過后,而應用容器是單行程,所以在應用容器中執行這個是行不通的,而 postStart hook 的設計就是異步的,與應用容器的啟動也是解耦的, 所以我們初步的方案選擇了 postStart hook 做這個事情,實施方案是 postStart hook 執行后會不斷輪詢應用的健康狀態,如果健康檢測 checkurl 通過了, 則執行 preOnline 腳本,腳本成功后則進行上線操作, 即在應用目錄下創建 healthcheck.html 檔案,OpenResty 和中間件發現這個檔案后就會把流量接入到這個實體中,

按照上面的方案,Pod 的組成設計如下:

發布程序讀不到標準輸入輸出

場景介紹:

在容器發布程序中如果應用啟動失敗,我們通過 K8s API 是拿不到實時的標準輸入輸出流,只能等到發布設定的超時閾值,這個程序中發布人員心里是很焦急的,因為不確定發生了什么,如下圖所示,部署程序中應用的更新作業流中什么都看不到,

問題點:

K8s API 為什么拿不到標準輸入輸出?

分析與解決程序:

通過 kubectl logs 查看當時的 Pod 日志,什么都沒有拿到,超時時間過后才拿到,說明問題不在程式本身,而是在 K8s 的機制上;

查看 postStart Hook 的相關檔案,有一段介紹提到了 postHook 如果執行時間長或者 hang 住,容器的狀態也會 hang 住,不會進入 running 狀態, 看到這條資訊,大概猜測到罪魁禍首就是這個 postStart hook 了,

基于上面的猜測,把 postStart hook 去掉后測驗,應用容器的標準輸入可以實時拿到了,

找到問題后,解決方法也就簡單了,把 postStart hook 中實作的功能放到 Sidecar 中就可以解決,至于 Sidecar 如何在應用容器的目錄中創建 healthcheck.html 檔案,就需要用到共享卷了,新的方案設計如下:

使用上述方案后,發布流程的標準輸入輸出、自定義 hook 腳本的輸出、Pod 事件等都是實時可見的了, 發布程序更透明了,

并發拉取鏡像超時

場景介紹:

我們的應用是多機房多集群部署的,當一個應用的新版本發布時,由于應用的實體數較多,有 50+ 個并發從 harbor 拉取鏡像時,其中一些任務收到了鏡像拉取超時的報錯資訊,進而導致整個發布任務失敗,超時時間是 kubelet 默認設定的 1 分鐘,

分析與解決:

通過排查最終確認是 harbor 在并發拉取鏡像時存在性能問題,我們采取的優化方案是通用的 p2p 方案,DragonFly + Harbor,

并發大時授權介面抗不住

場景介紹:

應用發布程序中呼叫授權介面失敗,K8s 的自愈機制會不斷重建容器并重新授權,并發量比較大,最終把授權服務拖垮,

我們的容器授權方案如下:

  1. Pod init 容器啟動時進行調研授權介面進行授權操作,包括 ACL 和 mysql 的白名單,

  2. 容器銷毀時會執行 Sidecar 容器的 preStop hook 中執行權限回收操作,

問題點:

ACL 授權介面涉及到了防火墻,QPS 比較低,大量容器進行 ACL 授權時把服務拖垮 ,

分析與解決:

為了解決上述的問題,限量和降低授權介面呼叫次數是有效的解決方式,我們采取了下面幾個措施:

init 容器中的重試次數限制為 1 次,

授權介面按應用和 IP 限流, 超過 3 次則直接回傳失敗,不會再進行授權操作,

ACL 中涉及的一些通用的埠,我們統一做了白名單,應用無需再進行授權操作,

Java 應用在容器場景下如何支持遠程 Debug

KVM 場景 Debug 介紹:

在開發 Java 應用的程序中,通過遠程 Debug 可以快速排查定位問題,因此是開發人員必不可少的一個功能,Debug 具體流程: 開發人員在 Noah 環境管理平臺的界面點擊開啟 Debug, Noah 會自動為該 Java 應用配置上 Debug 選項,-Xdebug -Xrunjdwp: transport=dt_socket, server=y, suspend=n, address=127.0.0.1:50005,并重啟該 Java 應用,之后開發人員就可以在 IDE 中配置遠程 Debug 并進入除錯模式了,

容器場景的 Debug 方案:

測驗環境的 Java 應用默認開啟 Debug 模式,這樣也避免了更改 Debug 重建 Pod 的程序,速度從 KVM 的分鐘級到現在的秒級,當用戶想開啟 Debug 時,Noah 會呼叫 K8s exec 介面執行 socat 相關命令進行埠映射轉發,讓開發人員可以通過 socat 開的代理連接到 Java 應用的 Debug 埠,

問題點:

容器場景下在用戶 Debug 程序中,當請求走到了設定的斷點后,Debug 功能失效,

分析與解決程序:

  1. 復現容器場景下 Debug,觀察該 Pod 的各項指標,發現 Debug 功能失效的時候系統收到了一個 liveness probe failed,kill pod 的事件,根據這個事件可以判斷出當時 liveness check 失敗,應用容器才被 kill 的,應用容器重啟代理行程也就隨之消失了,Debug 也就失效了,

  2. 關于 Debug 程序 checkurl 為什么失敗的問題,得到的答案是 Debug 時當請求走到斷點時,整個 JVM 是 hang 住的,這個時候任何請求過來也會被 hang 住,當然也包括 checkurl,于是我們也特地在 KVM 場景和容器場景分布做了測驗,結果也確實是這樣的,

  3. 臨時解決方案是把斷點的阻斷級別改為執行緒級的,這樣就不會阻斷 checkurl 了, idea 中默認的選項是 Suspend All,改為 Suspend Thread 即可,不過這個也不是最優解,因為這個需要用戶手工配置阻斷級別,有認知學習成本,

  1. 回到最初的問題上,為什么容器場景下遇到這個問題,而 KVM 沒有,主要是因為容器場景 K8s 提供了自愈能力,K8s 會定時執行 liveness check, 當失敗次數達到指定的閾值時,K8s 會 kill 掉容器并重新拉起一個新的容器,

  2. 那我們只好從 K8s 的 liveness 探針上著手了,探針默認支持 exec、tcp 、httpGet 3 種模式,當前使用的是 httpGet,這種方式只支持一個 url, 無法滿足這個場景需求,經過組內討論, 最后大家決定用這個運算式 (checkurl == 200) || (socat process && java process alive) 在作為應用的 liveness 檢測方式,當 Debug 走到斷點的時候, 應用容器就不會阻斷了, 完美的解決了這個問題,

以上就是我們落地容器化程序中遇到的幾個問題與我們的解決思路,其中很重要的一點是從 KVM 遷移到容器時需要考慮用戶的使用習慣、歷史功能兼容等要點,要做好兼容和取舍,只有這樣容器化落地才會更順暢,

未來展望

  • 多集群穩定性治理

    • 讓可觀測性資料更全面、覆寫度更廣,進而完善我們的 APM 系統,提升排查問題效率,

    • 通過實施混沌工程來驗證、發現和消除容器化場景的穩定性盲區,

  • 提高資源利用率

    • 根據業務指標實作彈性擴縮容,

    • 根據應用的歷史資料智能的調整 requests,

  • ServiceMesh 方案落地

    • 我們是基于 Istio 和 MOSN 以及當前的基礎架構做的 mesh 方案,目前在測驗階段,這套方案落地后相信會讓基礎架構更敏捷,

本文由博客一文多發平臺 OpenWrite 發布!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301388.html

標籤:其他

上一篇:Linux常用命令總結(語法+案例)建議收藏!

下一篇:免費服務器搭建--個人網站搭建第一步

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more