首頁 > 軟體

Docker與K8s關係介紹不會Docker也可以使用K8s

2022-06-21 18:01:25

K8s和Docker 的關係

Docker 和 K8s 這兩個經常一起出現,兩者的Logo 看著也有一定聯絡一個是背上馱著集裝箱的鯨魚一個是船的舵輪。

不過兩者不能放在一個維度上討論,Docker 是當前流行的 Linux 容器解決方案,利用 Namespaces 、Cgroups 以及聯合檔案系統UnionFS 實現了同一主機上容器程序間的相互隔離。

  • NameSpaces:隔離程序,讓程序只能存取到本名稱空間裡的掛載目錄、PID、NetWork 等資源
  • Cgroups: 限制程序能使用的計算機系統各項資源的上限,包括 CPU、記憶體、磁碟、網路頻寬等等
  • 聯合檔案系統UnionFS : 儲存一個作業系統的所有檔案和目錄,在它基礎之上新增應用執行依賴的檔案。建立容器程序的時候給程序指定Mount Namespace 把映象檔案掛載到容器裡,用 chroot 把程序的 Root目錄切換到掛載的目錄裡,從而讓容器程序各自擁有獨立的作業系統目錄。

而 K8s 是擁有容器編排能力的叢集管理解決方案,可以按照應用的定義排程各個執行著應用元件 Docker 容器,但是 Docker 並不是 K8s 對容器的唯一選擇,K8s 的 容器執行時支援對接多種容器 ,比如CoreOS公司的Rkt容器(之前稱為Rocket,現更名為Rkt),Apache 開源的 Mesos 容器等。只要容器實現了 K8s 容器執行時的介面約定,都能讓 K8s 進行排程。

Docker 公司也推出過自己的容器叢集管理方案 Docker Swarm ,跟 K8s 算是競品,但是在生產上幾乎沒人使用。

Docker Swarm 沒有流行起來的深層次的原因就不深究了,從一些IT媒體的報道看,可能的原因是

  • 跟 Docker 深度繫結,人天生對集權主義非常反感。
  • Docker 公司在大規模叢集管理上的經驗不足,不像谷歌那樣能高屋建瓴地給出好的解決方法。

容器用Docker,需要學到什麼程度

看完 K8s 和 Docker 的關係後,我們已經有答案了,想學 K8s 不一定非得會 Docker。但是畢竟 Docker 還是目前最流行的 Linux 容器方案,絕大部分情況下我們還是會選擇使用 Docker,那麼我們 Docker 掌握到什麼程度更易於我們學習 K8s 呢?

這個主要看我們想學會 K8s 幹什麼,即使執行在 K8s 之上的容器選擇 Docker,如果我們是搭建一些基建類的軟體,比如 MySQL、Redis之類的,因為這些組織已經提供了軟體容器的映象,我的使用體驗是,完全用不到那些 Docker 的各種命令。

比如要在 K8s 叢集上執行一個 MySQL 應用,寫好應用的清單檔案(就是各種設定和期望的狀態),然後直接執行

kubectl apply -f mysql.yaml 

就好,K8s 的容器執行時會根據清單檔案裡的映象名,幫我們調 Docker 的介面去下載映象、執行容器。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql:5.7
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: superpass
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
            - name: mysql-config
              mountPath: /etc/mysql/conf.d/my.cnf
              subPath: my.cnf

上面組態檔,有刪減。完整可執行的案例,請參考:

kubernetes環境部署單節點redis資料庫的方法

使用Kubernetes叢集環境部署MySQL資料庫

不過,我們使用 K8s 除了搭建這種基礎軟體外,學 K8s 更多是讓自己開發的服務能依託 K8s 叢集管理、排程的能力變的更具魯棒性、更portable。這個時候 Docker 方面的技能掌握基本的 Dockerfile 編寫、打包上傳映象的命令。這部分的幾個簡單的知識,感覺花個兩小時就能掌握,這裡推薦一下我以前的文章

基於Docker映象部署go專案的方法步驟

Java 應用怎麼打包成 Docker 映象

學會這幾個簡單的Docker知識就完全夠用,能支撐我們開始 K8s 的學習和練習啦,其他 Docker 相關的知識完全可以在做 K8s 練習時遇到問題、解決問題的過程中再學。

總結

這篇文章把 Docker 和 K8s 的關係給大家做了一個解答,希望還在遲疑自己現有的知識儲備能不能直接學 K8s 的,趕緊行動起來,K8s 是典型的入門有點難,後面越用越香。

更多關於Docker與K8s關係的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com