K8S棄用Docker了?Docker 不能用了?別逗了!

2020-12-16 騰訊網

Docker 大概沒想到,2020 年,它在技術圈內的兩次成為(輿論的)焦點,竟然都是因為信息差(說是「標題黨」也不為過)。

近幾年,Kubernetes 已經成為自有機房、雲上廣泛使用的容器編排方案,最廣泛的使用方式是 Kubernetes+Docker。從 DevOps 人員的角度,一面用 kubctl 命令、k8s API 來操作集群,一面在單機用 Docker 命令來管理鏡像、運行鏡像。

單獨用 Docker 的情況,在一些公司的場景裡面也是有的。一種場景是「只分不合」,把一臺機器用 Docker 做資源隔離,但是不需要將多容器「編排」。單獨用 Kubernetes,下層不是 Docker 的情況,並不算很多。

Kubernetes 和 Docker 的關係,簡單來說,有互補,也有競爭。在一般的認知中,Kubernetes 和 Docker 是互補關係:

Dockers屬於下層——容器引擎;

Kubernetes屬於上層——編排調度層。

Docker 源於 Linux Container,可以將一臺機器的資源分成 N 份容器,做到資源的隔離,並將可運行的程序定義為標準的 docker image;Kubernetes 則可以把不同機器的每份容器進行編排、調度,組成分布式系統。

2013 年

Docker 是在 2013 年的 PyCon 上首次正式對外公布的。它帶來了一種先進的軟體交付方式,即,通過容器鏡像進行軟體的交付。工程師們只需要簡單的 docker build 命令即可製作出自己的鏡像,並通過 docker push 將其發布至 DockerHub 上。通過簡單的 docker run命令即可快速的使用指定鏡像啟動自己的服務。

通過這種辦法,可以有效的解決軟體運行時環境差異帶來的問題,達到其 Build once, Run anywhere 的目標。

從此 Docker 也基本成為了容器的代名詞,並成為容器時代的引領者。

2014 年

2014 年 Google 推出 Kubernetes 用於解決大規模場景下 Docker 容器編排的問題。

這是一個邏輯選擇,在當時 Docker 是最流行也是唯一的運行時。Kubernetes 通過對 Docker 容器運行時的支持,迎來了大量的用戶。

同時,Google 及 Kubernetes 社區與 Docker 也在進行著密切的合作,在其官方博客上有如下內容:

We』ll continue to build out the feature set, while collaborating with the Docker community to incorporate the best ideas from Kubernetes into Docker.

An update on container support on Google Cloud Platform[1]

Kubernetes is an open source manager for Docker containers, based on Google’s years of experience using containers at Internet scale. Docker is delivering the full container stack that Kubernetes schedules into, and is looking to move critical capabilities upstream and align the Kubernetes framework with Libswarm.

Welcome Microsoft, RedHat, IBM, Docker and more to the Kubernetes community[2]

並在同一個月的 DockerCon 上發布演講,介紹了 Kubernetes 並受到了廣泛的關注。

此時 Docker Inc. 也發布了其容器編排工具, libswarm (也就是後來的 swarmkit) 。

2015 年

2015 年 OCI (Open Container Initiative)由 Docker 和其他容器行業領導者共同成立(它也是 Linux 基金會旗下項目)

OCI 主要包含兩個規範:

運行時規範(runtime-spec):容器運行時,如何運行指定的 文件系統上的包

容器鏡像規範(image-spec):如何創建一個 OCI 運行時可運行的文件系統上的包

Docker 把它自己的容器鏡像格式和 runtime ( 現在的 runc ) 都捐給了 OCI 作為初始工作。

2016 年

2016 年 6 月,Docker v1.12 發布,帶來了 Docker 在多主機多容器的編排解決方案,Docker Swarm 。 這裡也需要注意的是,Docker v1.12 的設計原則:

Simple Yet Powerful (簡單而強大)

Resilient(彈性)

Secure(安全)

Optional Features and Backward Compatibility(可選功能及向後兼容)

所以你可以通過配置自行選擇是否需要使用 Docker Swarm ,而無需擔心有什麼副作用。

2016 年 12 月, Kubernetes 發布 CRI (Container Runtime Interface) ,這當中一部分原因是由於 Kubernetes 嘗試支持另一個由 CoreOS 領導的容器運行時項目 rkt ,但是需要寫很多兼容的代碼之類的,為了避免後續兼容其他運行時帶來的維護工作,所以發布了統一的 CRI 接口,凡是支持 CRI 的運行時,皆可直接作為 Kubernetes 的底層運行時;

當然, Kubernetes 也是在 2016 年逐步取得那場容器編排戰爭的勝利的。

2017 年

2017 年, Docker 將自身從 v1.11 起開始引入的容器運行時 containerd[3] 捐給了 CNCF[4]

2017 年,Docker 的網絡組件 libnetwork 增加了 CNI 的支持;同時通過使用 Docker 為 Docker Swarm 提供的 ipvs 相關的代碼[5],也在 Kubernetes 中實現了基於 IPvs 的 service 負載均衡。不過在 v1.18 中開始移除了相關的依賴。

同年 11 月,Kubernetes 中新增了 containerd 的支持[6]

cri-containerd

2018 年

2018 年, Kubernetes 的 containerd 集成,正式 GA[7]

containerd 1.0 cri-containerd

containerd 1.1 cri-containerd

2019 年

2019 年,上文中提到的另一個容器運行時項目 rkt 被 CNCF 歸檔,終止使命了;2019 年 Mirantis 收購 Docker 的企業服務。

2020 年

時間回到今年,Docker 主要被誤會的兩件事:

Docker Inc. 修改 DockerHub 的定價和 TOS 。國內爭論較多的主要是關於合規性的問題(但是被標題黨帶歪了,免不了恐慌);

Kubernetes 宣布開始進入廢棄 dockershim 支持的倒計時,被人誤以為 Docker 不能再用了;

一切都如此悄悄地開始。作為廣受歡迎的容器集群管理工具,在即將發行的Kubernetes 1.20版本說明文件中,Kubernetes(k8s)宣布:"kubelet放棄對Docker的支持,並會在將來的版本中移除。"

是的,實現了對Docker兼容支持其kubelet容器運行時Container Runtime Interface(CRI)標準的dockershim中間件將很快成為歷史。所以呢?這沒什麼大不了的。

谷歌雲開發人員助理及著名的Kubernetes導師凱爾西·海託華(Kelsey Hightower)在推特上說:"Docker不等於容器。Docker可以構建容器映像,Docker可以從容器倉庫中push和pull,Docker是容器運行時其中一員,Docker可以創建容器進程,但Linux仍然是老大。"

正如著名的"不必恐慌:Kubernetes和Docker"博客文章中所解釋的那樣,Kubernetes只是在v1.20版本後不推薦將Docker作為容器運行時使用。人們仍然可以使用Docker構建容器,繼續在倉庫中進行push和pull操作等。實際上是因為Docker並不符合Kubernetes的容器運行時接口標準(CRI)而不被推薦使用,Docker生成的鏡像依然可以一如既往地在集群中工作。

簡而言之,這就是我們想說的,這沒什麼大不了的,不必恐慌。

就像Dockershim Deprecation FAQ所說:"在1.20中唯一改變的是,如果使用Docker作為容器運行時,則在kubelet啟動時會列印一條警告信息。"

Dockershim中間件會一直保留到2021年末,直到發布Kubernetes 1.23版本為止。Kubernetes團隊將與所有人緊密合作,直到所有人都準備好了相關變更,才會將dockershim放飛牧場。

總結

本文主要介紹了 Docker 和 Kubernetes 的發展歷程,也解釋了本次 Kubernetes 僅僅是放棄其對 dockershim 組件的支持。未來更推薦的 Kubernetes 運行時是 兼容 CRI 的 containerd 之類的底層運行時。

Mirantis 公司將會和 Docker 共同維護 dockershim 並作為開源組件提供。

Docker 仍然是一款最佳的本地開發測試和部署的工具。

相關焦點

  • Kubernetes 將棄用 Docker
    近日,Kubernetes 官方發布公告,宣布自 v1.20 起放棄對 Docker 的支持,屆時用戶將收到 Docker 棄用警告,並需要改用其他容器運行時。但 Docker 作為容器鏡像構建工具的作用將不受影響,用其構建的容器鏡像將一如既往地在集群中與所有容器運行時正常運轉。
  • Kubernetes棄用Docker?其實不用慌
    kubernetes 真的棄用 docker 了嗎?Kubernetes 1.20 版本提到的不再維護 dockershim 墊片,並逐漸在後續版本中移除該墊片,這意味著在未來的 Kubernetes 環境中,docker 的佔比將逐漸下降。
  • Kind + Docker 一鍵部署K8s集群
    所以業界也除了一些簡易版的K8s集群環境,比如K3S(5 less than k8s),本文蟲蟲給大家介紹也是這樣一個項目Kind,一鍵部署的單機K8S環境,可以用於學習、本地開發和CI環境。另外kind操作依賴docker,需要先安裝docker。
  • macOS上Docker啟動Kubernetes
    ago Created也能看到版本:docker/desktop-kubernetes:kubernetes-v1.18.8-cni-v0.8.5-critools-v1.17.0應該是下載不完整不能啟動:參考:
  • 阿里雲內部獨家的K8s+Docker套餐,有內味了
    細心的網友會發現網.上關於k8s的資料非常非常的多,可90%的資料都是教你怎麼安裝部署k8s,那麼部署好了之後呢? ? ?,於是乎你的小編(雷鋒)在這個星期也沒閒著整理了這份關於K8s+Docker源碼+筆記+項目實戰的資料。
  • Docker不香嗎?為什麼還要用k8s
    Docker使用率越來越高Docker怎麼用?其實大多數人談論 Docker 時說的是 Docker Engine,這只是一個構建和運行的容器。在運行容器前需要編寫Docker File,通過 dockerFile 生成鏡像,然後才能運行 Docker 容器。
  • Kubernetes決定棄用Docker,到底會影響到誰?
    從 DevOps 人員的角度,一面用 kubctl 命令、k8s API 來操作集群,一面在單機用 Docker 命令來管理鏡像、運行鏡像。單獨用 Docker 的情況,在一些公司的場景裡面也是有的。一種場景是「只分不合」,把一臺機器用 Docker 做資源隔離,但是不需要將多容器「編排」。
  • K8S工作節點的演變:由Docker到CRI-O
    docker主導這些功能分為2個層次:高級別功能:鏡像管理,傳輸,鏡像解壓縮和API,發送命令來運行容器,網絡,存儲(例如:rkt,docker,LXC等)。低級別功能: 運行容器。這些功能可以拆分獨立出各個部分來,各個部分可以選用各種開源組件,並搭配成更合理更高效的組合。
  • 雲計算核心技術Docker教程:docker Stack介紹
    Docker在進行多服務部署和管理時通常會使用Docker Stack來解決大規模部署管理問題,Docker引擎在1.12 版本集成了Docker Swarm, 內置新的容器編排工具docker stack,通過提供期望狀態、滾動升級、簡單易用、擴縮容、健康檢查等特性簡化了應用的管理
  • 從docker容器內部/k8s容器執行宿主機的docker命令
    1) 把docker相關的命令和依賴使用-v掛載到容器docker run -it -d \--restart=always-u root \-v /usr/bin/docker:/usr/bin/docker \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 鏡像名稱以root的身份去運行鏡像(避免在容器中調用Docker命令沒有權限)將宿主機的
  • Docker部署MySQL主從
    /master/{conf,logs,data}mkdir -p ~/docker-mysql/slave/{conf,logs,data}conf 配置文件logs 日誌文件data 數據文件啟動主庫docker
  • 蹲坑學Docker之十五:使用Harbor搭建Docker私有倉庫
    Docker官方提供的私有倉庫registry,用起來雖然簡單,但在管理的功能上存在不足。Harbor是一個用於存儲和分發Docker鏡像的企業級Registry伺服器,Harbor使用的是官方的docker registry v2服務去完成。
  • 一起學習docker-08-小結
    一般企業用社區版即可。/linux/centos/docker-ce.repo,或者下載rpm包之類的。3、安裝一般先檢查系統是否自帶企業版,先卸載,然後安裝社區版4、目錄注意事項一般要注意修改為數據目錄,最好不要用默認目錄,不如現在一些雲主機,根默認20G,到時候遷移數據也是麻煩事。
  • 容器|Docker 如此之好,你為什麼還要用k8s
    我是小小,我們又見面了,今天是本周的第五篇,本篇將會著重講解關於為什麼要使用k8s 前言 左圖,應用直接部署在宿主機中,造成環境相互幹擾,不利於運維和維護,右邊,應用直接打包在docker中,應用之間互相互不幹擾,可以任意運行。
  • 「Docker」 研發日常製作鏡像操作
    鏡像去發布的時候使用的一些命令,本文章不涉及k8s相關的操作,具體k8s部署會在後續文章進行更新。images |grep xx使用xx-project進行運行 8080:本機使用訪問的埠 80:Docker內啟動的埠 xx-project-docker:指定啟動之後容器名稱 xx-project:1.0 鏡像名稱(由上面命令獲得或者第一個命令 -t 的參數值)docker run -p 8080:80 -d --name xx-project-docker xx-project:1.0
  • 用rancher2分分鐘搭建k8s集群
    k8s擴展docker單個容器的管理功能,實現誇多主機的問題,容器編排要負責網絡,存儲,安全等問題。具體來講包括以下幾點,可以讓應用的管理和部署得到巨大紅利,實現devops故障遷移:當某一個node節點關機或掛掉後,node節點上的服務會自動轉移到另一個node節點上,這個過程所有服務不中斷。
  • Docker再體驗之Docker Compose,及它與Kubernetes的區別
    雖然Docker Swarm也是多節點管理,但基本已棄用,了解一下就好了。安裝Docker Compose接上一篇的例子,安裝Docker Compose,並進行賦權和檢驗。sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-composesudo chmod +x /usr/local/bin/docker-composedocker-compose
  • 「K8S系列」Docker緩存之Docker鏡像層
    Dockerfile中的每個命令都會創建docker鏡像的一層,該層包括執行該命令後docker鏡像中的所有文件。每個圖層均保存為docker鏡像狀態-在上面的示例中,高亮輸出部分顯示每一層的結束,並且帶有ID標識符。
  • macOS Docker安裝Kubernetes Dash
    先看下有哪些集群kubectl config get-contextsCURRENT NAME CLUSTER AUTHINFO NAMESPACE* docker-desktop docker-desktop docker-desktop我這就一個集群,如果需要切換
  • 被棄用的 Docker 會被 Podman 取代嗎?
    Kubernetes 團隊近日宣布將在最新版本中棄用 Docker 支持的功能,後續版本會陸續刪除這些功能。Kubernetes 宣布棄用 Docker近日 Kubernetes 宣布棄用 Docker。