聊聊規模化容器

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"Increment 採訪了 Datadog、Braze 和 BetterUp 的工程負責人,討論了容器工具、測試和監控,以及他們如何處理容器遷移的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"嘉賓介紹:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"勞倫·伯納耶(Laurent Bernaille):DataDog 高級工程師。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"克里斯·羅格斯(Chris Rogus):Braze 工程總監。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":"布萊恩·希克森(Bryan Hickerson):BetterUp 工程經理。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"Q:貴組織使用哪些容器技術和工具?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"勞倫·伯納耶:"},{"type":"text","text":"主要容器技術有 Kubernetes、containerd 和 Cilium。我們在多個雲供應商上運行了數十個不同規模的 Kubernetes 集羣:我們最大的集羣每個都有 4000 多個節點,而且我們依賴內部開發的工具來管理和編排多個集羣的部署。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"克里斯·羅格斯:"},{"type":"text","text":"我們在 AWS 和 Azure 中使用 Kubernetes,運行 Ruby on Rails、Java、Go 和 Python 中的 dockerized 應用程序。Kubernetes 會將度量報告給 Datadog,將日誌報告給 Papertrail,而應用程序的錯誤會轉到 Sentry。通過使用 Terraform 定義 Kubernetes 在不同雲中部署的基礎設施,我們使用 Sops 進行祕密配置。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"布萊恩·希克森:"},{"type":"text","text":"我們使用 Heroku,它採用了稱爲 dynos 的輕量級容器,用於我們的網絡服務器、後臺作業以及機器學習微服務的一個子集。其他機器學習微服務使用 Kubeflow。利用 Docker,我們可以將開發和測試環境與生產環境保持一致。我們使用 SolarWinds Papertrail 和 Sumo Logic。對於客戶端和應用程序的錯誤報告,我們使用 Sentry。最後,在性能監控方面,我們使用了 Scout 和 Calibre。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"Q:貴組織何時開始使用容器,以及它們如何改變開發工作流程?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"勞倫·伯納耶:"},{"type":"text","text":"從 2018 年初開始,Datadog 遷移到 Kubernetes,大約 6 個月之後,DataDog 的第一個版本就完全在 Kubernetes 上運行和生產了。其中包括無狀態網絡應用和有狀態數據服務,如 Cassandra 和 Kafka。我們從用 Chef 管理的虛擬機中運行的應用程序遷移過來,因此這一過渡要求對開發流程進行很多更改。舉例來說,我們必須將每個應用程序容器化,並提供一種可以部署到 Kubernetes 集羣的解決方案,該方案最初依賴於 Spinnaker 和 Helm 圖表。遷移是一個挑戰。這個截止日期很有挑戰性,我們將從一個沒有容器、也沒有工具來部署容器的環境開始。但是這樣做也很有意義,因爲它爲我們提供了統一的打包和部署解決方案,使我們能夠部署到新的雲供應商和地區。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"克里斯·羅格斯:"},{"type":"text","text":"大約兩年前,我們開始在多雲環境中使用容器。經過近一年的初步探索,最初,容器會增加一些複雜性,尤其是在配置方面,但是,當我們構建工具時,某些方面會變得更加簡單。舉例來說,Chef 要求更嚴格的權限才能對配置進行修改。把 Chef 數據包的配置改成 Sops,我們給開發者帶來了更簡單的自助式更改。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"布萊恩·希克森:"},{"type":"text","text":"2015 年以前,我們使用基於虛擬機的開發環境,後來由於本地編譯的原生依賴性帶來的挑戰,常常導致升級失敗,從而改用容器。轉換爲容器之後,我們就可以做到無縫地遷移,而不會對開發工作流程造成負面影響。這也使我們的開發環境更加現代化,更接近於生產環境,並且降低了資源的密度。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"Q:貴組織是否將任何遺留的應用程序遷移到容器中?挑戰是什麼,學到了什麼?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"勞倫·伯納耶:"},{"type":"text","text":"我們大多數應用程序都是用 Go、Python 和 Java 編寫的,因此在容器中運行它們並不困難。問題當然是在細節上,我們面臨着一些挑戰,包括在容器中管理 JVM 佔用的內存。大部分應用程序都認爲它們只在虛擬機上運行,這就給它們自己提出了挑戰:尤其是 IO 操作(磁盤和網絡訪問),因爲 Kubernetes 在共享 CPU 時間和內存方面效率很高。Kubernetes 提供了更少的控制來限制和隔離資源消耗,IO 方面則更爲複雜。在將應用程序遷移到 Kubernetes 之後,我們注意到需要兩倍的主機數量。在剖析了應用程序並分析了開銷之後,我們就對 pod 配置進行了優化,從而大大減少了需要的額外主機數。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"克里斯·羅格斯:"},{"type":"text","text":"實際上,我們已將所有遺留應用程序遷移到容器。將應用程序 Docker 化是相對直接的,在大多數情況下,可以更輕鬆地打包依賴項和部署。在此之前,DevOps 管理 EC2 實例,將應用程序複製到 Chef 並通過 Chef 運行它。應用工程師把應用程序轉換成容器後,就可以更直接地控制應用程序在什麼環境中運行,可以使用什麼工具和庫,以及如何分配資源。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"困難在於將部署管道的職責從 DevOps 轉移到應用工程團隊,以及瞭解如何在 Kubernetes 而非 EC2 實例上調試應用程序。但是,所有這些都有顯著的長期好處,消除了反覆修改的需求,並使代碼與運行環境更緊密地結合在一起。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"布萊恩·希克森:"},{"type":"text","text":"利用容器進行機器學習微服務的實驗。在主要應用中,我們提取了一小部分,並通過更適合的技術棧快速啓動新服務。這樣就可以快速迭代和實驗。舉例來說,我們可以用 Python 中的神經網絡無縫替換 R 中的貝葉斯方法訓練的模型。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當我們將服務從單體上剝離時,我們面臨的一個挑戰是,這些服務不再能直接訪問實時應用數據。我們必須決定微服務將保留對那些數據的訪問,並且知道越是接近實時的服務,就越需要訪問上下文數據。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"Q:如何部署和監控容器化應用?你的關鍵健康指標有哪些?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"勞倫·伯納耶:"},{"type":"text","text":"我們依賴 DataDog 來監控。每一個應用都負責對其監控進行配置,但是有一些關鍵的指標隨處可見:容器的 CPU 和內存使用情況,容器狀態和重啓次數,以及底層節點的健康狀況。起初,我們使用 Spinnaker 來部署容器化應用程序,這在早期提供了一個強大的基礎,但是隨着集羣數量的增長和工作流程的複雜性,我們對此有所改進。當前,我們正在開發利用 Helm 和雲原生應用包並由 Temporal 支持的多集羣部署的內部解決方案。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"克里斯·羅格斯:"},{"type":"text","text":"我們主要看內存和 CPU,標準的 Kubernetes 監控,以及特定的應用指標,比如內部隊列大小和錯誤率。應用程序用 Helm 部署,當配置(GitHub repo 中的 YAML)發生變化時,使用內部工具通過 Jenkins 將部署配置提供給 Helm CLI。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"布萊恩·希克森:"},{"type":"text","text":"當構建在主分支中通過時,我們使用 Heroku 不斷地部署應用程序。通過使用 Heroku,我們還添加了日誌服務——Pingdom 和 New Relic,結合了 PagerDuty 的警報,這使得我們可以調查生產系統中的問題,並在發現問題時通知我們的團隊。同時,我們也使用合成和真實用戶監測來發現嚴重的錯誤和性能問題。我們這個團隊使用 KPI 來跟蹤基礎設施的趨勢。服務器的正常運行時間是關鍵的健康指標,在 2020 年這一指標爲 99.999%。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"Q:貴組織是如何處理容器測試?怎樣使用自動化?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"勞倫·伯納耶:"},{"type":"text","text":"我們沒有對容器進行系統性測試。取而代之的是,我們在 CI 中測試應用程序,並在 staging 和 canary(金絲雀)中驗證新容器版本。如果我們懷疑容器化對它有影響,我們還會臨時測試容器,尤其是那些無法用代碼庫更改來解釋的性能下降。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"克里斯·羅格斯:"},{"type":"text","text":"通過 Docker Compose 運行,我們的許多應用程序都在本地開發和測試。在運行容器化應用部署的開發和 staging 環境中,我們每天也會數次運行端到端測試。我們使用 Buildkit,CI 還在 Docker 中運行測試,當應用程序代碼改變時,測試會自動運行。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"布萊恩·希克森:"},{"type":"text","text":"測試容器已進行了配置,以與生產環境匹配。沒有直接測試容器本身,但是我們的連續測試過程可以確保應用程序在各個分支中的行爲一致。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"Q:貴組織如何跟上容器生態系統的轉變?你如何決定何時採用一項新技術或工具?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"勞倫·伯納耶"},{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":":"},{"type":"text","text":"由於我們大規模使用 Kubernetes,並且面對着生態系統剛剛開始應對的挑戰,所以我們更傾向於在早期測試新技術,並在測試成功之後再加以採用。比如,當 containerd 具有容器運行時接口時,我們將其標準化,並且當 kube-proxy 在測試版中可用時,我們就將其用於 IPVS 模式,這是處於擴展性的考慮。我們最近對 pod 網絡、服務負載平衡和網絡策略的 Cilium 進行了標準化。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"克里斯·羅格斯:"},{"type":"text","text":"我們工程師非常關心整個行業的變化。爲了嘗試新的方法,他們嚐嚐鼓足勇氣做出改變,包括在我們的內部“黑客日”進行概念驗證演示,以探索和衡量其他人的興趣。他們關注 AWS 的公告,Kubernetes 的公告,以及關於新選項的技術新聞來源。遇到問題的時候,他們會尋找解決辦法,想象出一個“更好的”樣子。舉例來說,我們已經做了很多研究,通過使用 spot 實例自動提供實例來節省成本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"布萊恩·希克森:"},{"type":"text","text":"我們依賴工程師來發現改進我們使用容器方法的機會,並且我們權衡了潛在價值和需求。舉例來說,最近我們的前端和全棧工程師在使用 Docker for Mac 時遇到了文件系統性能的問題。我們的一位工程師研究了改進 Docker 的 IO 的技術,並對 Mutagen、NFS,以及本地系統和 Docker 之間共享文件進行了實驗。最後,我們將 Mutagen 引入了整個團隊,極大地改善了開發人員的體驗。前端容器的構建時間不再會影響開發者的生產力。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic"},{"type":"strong"}],"text":"Q:使用容器時,貴組織發現的最令人喫驚的是什麼?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"勞倫·伯納耶:"},{"type":"text","text":"從控制平面上的可擴展性問題到低層的運行時問題和網絡問題,我們都遇到過許多令人喫驚的挑戰。總體而言,在採用容器方面最大的成功在於,它允許我們使用通用抽象在多個雲供應商之間進行擴展和部署。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"克里斯·羅格斯:"},{"type":"text","text":"構建用於 localdev 的容器需要其他額外的調試工具,這在生產環境中是不可取的。與本地調試相比,在生產環境中進行調試更困難,尤其是在託管容器的服務器上,它有一個細粒度的訪問控制列表。將面向服務的架構精確地複製到容器中會讓筆記本的 CPU 和內存負擔過重,這會導致仍然缺少一些可靠的捷徑,例如不運行“真正的” Kubernetes 集羣或者相同的配置。與本地構建不同,CI 構建容器可以輕鬆地包含本地不存在的內容,這可能會導致難以調試或識別。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"布萊恩·希克森:"},{"type":"text","text":"容器使我們能夠在一個雲供應商上訓練新的機器學習模型,並且當我們準備將它們與我們的主要應用集成時,可以輕鬆地遷移到另一個雲供應商上。令人驚訝的是,我們幾乎沒有遇到任何與容器本身相關的問題。一般情況下,任何問題都存在於比容器級別更高的抽象層次;例如,我們在部署應用程序時發現了一些錯誤,但這些錯誤並不特定於容器的使用。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}},{"type":"strong"}],"text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}],"text":" "}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/increment.com\/containers\/containerization-at-scale\/","title":null,"type":null},"content":[{"type":"text","text":"https:\/\/increment.com\/containers\/containerization-at-scale\/"}],"marks":[{"type":"color","attrs":{"color":"#494949","name":"user"}}]}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章