爲何Kubernetes使用Pod做爲最小調度單元

1、Pod說明

Pod只是一個邏輯概念,一個原子調度單位,其優點在於html

  1. 能夠統一調度一組容器到指定的node上
  2. 共享資源:Pod的容器可使用localhost進行通訊,使用volume進行文件共享、使用socket文件進行本地通訊,減小頻繁的遠程網絡請求網絡
  3. 使容器A和容器B不依賴啓動順序(經過使用infra容器,解決docker volume-from存在的容器啓動的前後順序問題,)

2、4種容器部署方式

需求:Tomcat經過webapp下的WAR包運行應用java

1. 一個tomcat鏡像+war包鏡像

將WAR包放在Tomcat鏡像的webapps目錄下,作成一個新的docker鏡像,
缺點:更新WAR包或者升級Tomcat鏡像,都要從新發布鏡像node

2. 一個tomcat鏡像+war包掛載宿主機

聲明一個hostPath類型的Volume,把宿主機的WAR包掛載到Tomcat容器當中運行起來,只有一個tomcat鏡像
缺點:要在宿主機裏放一個WAR包,而且得通知宿主機更新這個包nginx

3. 一個tomcat鏡像+一個war包鏡像,經過--volumes-from方式

經過A容器--volumes-from=B容器方式,將B容器目錄掛載
缺點:容器存在啓動前後順序,地位不對等web

4. 一個tomcat鏡像+一個war包鏡像,經過pod方式

單獨給WAR包和Tomcat分別作成鏡像,而後放在一個Pod容器裏組合在一塊兒, 利用Init Container解決順序和依賴關係,
initContainers會先啓動,按順序 tomcat和initContainer的容器聲明瞭一樣的Volume,而後Container容器啓動後,volume就已經存在程序了,tomcat就能夠直接執行
這樣只須要在tomcat或者WAR更新的時候,單獨更新相應的鏡像,yaml以下docker

apiVersion: v1
kind: Pod
metadata:
  name: javaweb-2
spec:
  initContainers:
  - image: xxx/sample:v2
    name: war
    command: ["cp", "/sample.war", "/app"]
    volumeMounts:
    - mountPath: /app
      name: app-volume
  containers:
  - image:xxx/tomcat:7.0
    name: tomcat
    command: ["sh","-c","/root/apache-tomcat-7.0.42-v2/bin/start.sh"]
    volumeMounts:
    - mountPath: /root/apache-tomcat-7.0.42-v2/webapps
      name: app-volume
    ports:
    - containerPort: 8080
      hostPort: 8001 
  volumes:
  - name: app-volume
    emptyDir: {}

3、 K8s中的Volume

K8s的volume和mountPath是bind mount的方式,功能就是把文件或目錄綁定掛載在一塊兒,bind mount的掛載點是容器volume在宿主機上的目錄
k8s項目只要把全部Volume的定義都設計在Pod層級,一個Volume對應的宿主機目錄對於Pod來講只有一個,只要聲明掛載了這個Volume,就能夠共享這個Volume對應的宿主機目錄apache

apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:
  restartPolicy: Never
  volumes:
  - name: shared-data
    hostPath:      
      path: /data
  containers:
  - name: nginx-container
    image: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  - name: debian-container
    image: debian
    volumeMounts:
    - name: shared-data
      mountPath: /pod-data
    command: ["/bin/sh"]
    args: ["-c", "echo Hello from the debian container > /pod-data/index.html"]

debin-container和nginx-conntainer都聲明掛載了shared-data這個Volume,shared-data是hostPath類型,對應宿主機的/data,同時被綁定掛載進了兩個容器中,這就是爲何nginx-container能夠從它的/usr/share/nginxapi

4、總結

形象的說,雲計算機的操做系統是K8S,容器至關於進程,而Pod則是進程組(可使用pstree -g查看)
Pod扮演的是傳統基礎設施的「虛擬機」的角色,容器則是虛擬機的應用程序,要完成虛擬機應用到微服務架構的遷移,核心思想是:tomcat

  1. 分析應用組成(組件、進程)
  2. 拆分紅松耦合的容器(以容器鏡像方式分發)
  3. 利用Init Container解決順序和依賴關係
相關文章
相關標籤/搜索