日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Kubernetes中的多容器Pod和Pod內(nèi)容器間通信

Kubernetes中的多容器Pod和Pod內(nèi)容器間通信

作者:Sammy Liu 2019-11-20 09:15:53

云計(jì)算 容器(Container)常被用來(lái)解決比如微服務(wù)的單個(gè)問(wèn)題,但在實(shí)際場(chǎng)景中,問(wèn)題的解決往往需要多容器方案。本文會(huì)討論將多個(gè)容器整合進(jìn)單個(gè)Kubernetes Pod 中,以及Pod中的容器之間是如何通信的。

成都創(chuàng)新互聯(lián)公司成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目網(wǎng)站設(shè)計(jì)、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元鄂托克前做網(wǎng)站,已為上家服務(wù),為鄂托克前各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792

 容器(Container)常被用來(lái)解決比如微服務(wù)的單個(gè)問(wèn)題,但在實(shí)際場(chǎng)景中,問(wèn)題的解決往往需要多容器方案。本文會(huì)討論將多個(gè)容器整合進(jìn)單個(gè)Kubernetes Pod 中,以及Pod中的容器之間是如何通信的。

1. 關(guān)于Kubernetes Pod

1.1 Kubernetes Pod 是什么?

首先我們來(lái)探討下什么是Pod。Pod是Kubernetes中最小的可部署和管理單元。換句話講,如果需要在Kubernetes中運(yùn)行單個(gè)容器,那么你就得為這個(gè)容器創(chuàng)建一個(gè)Pod。同時(shí),一個(gè)Pod可以包含多個(gè)容器,這些容器往往是緊耦合的。怎么樣個(gè)緊耦合法呢?試著想象這么一個(gè)場(chǎng)景,一個(gè)Pod中的多個(gè)容器代表需要運(yùn)行在同一個(gè)服務(wù)器上的多個(gè)進(jìn)程。這種類比是合理的,因?yàn)樵谠S多方面,Pod就類似于一臺(tái)服務(wù)器。比如,通過(guò)localhost每個(gè)容器可以訪問(wèn)它所在Pod中的其它容器。

1.2 為什么Kubernetes將Pod而不是單個(gè)容器作為最小可部署單元呢?

盡管直接部署單個(gè)容器也許會(huì)更容易,但增加Pod這個(gè)新的抽象層會(huì)帶來(lái)新的好處。容器是一個(gè)真實(shí)存在的實(shí)體,它代表一個(gè)具體的東西。這個(gè)“東西”可以是一個(gè)Docker容器,也可以是一個(gè)rkt容器。每種“東西”都有不同的用途。為了管理容器,Kubernetes需要更多的信息,比如重啟策略(restart policy),它定義了當(dāng)容器終止了時(shí)怎樣重啟容器;還有活性檢測(cè)(liveness probe),它定義了如何從應(yīng)用視角去檢測(cè)容器中的進(jìn)程是否活著,比如Web服務(wù)器進(jìn)程是否能響應(yīng)HTTP請(qǐng)求。

為了避免在容器這個(gè)已有的實(shí)體上增加這些新的屬性,Kubernetes架構(gòu)師們決定使用一個(gè)新的實(shí)體,那就是Pod。它邏輯地包含一個(gè)或多個(gè)容器。

1.3 為什么Kubernetes允許Pod中存在一個(gè)或多個(gè)容器?

Pod中的容器們運(yùn)行在一個(gè)邏輯“主機(jī)”上。他們使用同一個(gè)網(wǎng)絡(luò)命名空間(network namespace,換句話講,就是同樣的IP地址和端口空間),以及同樣的IPC(inter-process communication,進(jìn)程間通信)命名空間,他們還使用共享卷(shared volume)。這些特征使得Pod內(nèi)的容器能互相高效地通信。同時(shí),Pod使得你可以將多個(gè)緊耦合的應(yīng)用容器當(dāng)做一個(gè)實(shí)體來(lái)管理。

那么,如果一個(gè)應(yīng)用需要在同一臺(tái)服務(wù)器上運(yùn)行多個(gè)容器,為什么不把所有東西放在一個(gè)容器里面呢?好吧,首先,這會(huì)違反“一個(gè)容器一個(gè)進(jìn)程”規(guī)范。這個(gè)規(guī)范很重要,因?yàn)楫?dāng)一個(gè)容器中有多個(gè)進(jìn)程時(shí),調(diào)試會(huì)變得非常困難,因?yàn)椴煌M(jìn)程的日志會(huì)混在一起,而且很難去管理這些進(jìn)程的生命周期。其次,為一個(gè)應(yīng)用使用多個(gè)容器會(huì)更簡(jiǎn)單、更直接、能解耦軟件依賴。而且,更細(xì)粒度的容器可以在團(tuán)隊(duì)間復(fù)用。

1.4 多容器Pod的用例

多容器Pod的主要目的是為了支持同時(shí)存在的(co-located)及同時(shí)被管理的(co-managed)幫助進(jìn)程(helper process)。幫助進(jìn)程有幾種通用場(chǎng)景:

邊車容器(sidecarcontainer):比如日志或數(shù)據(jù)變化監(jiān)視器等。一個(gè)團(tuán)隊(duì)創(chuàng)建日志監(jiān)視器(log watcher)后,它可以被各種應(yīng)用使用。另一個(gè)邊車容器的例子是文件或數(shù)據(jù)加載器,它負(fù)責(zé)為主容器產(chǎn)生數(shù)據(jù)。

代理(Proxy)、橋(bridge)和適配器(adapter):它們將主容器連接到外部世界。比如,Apache HTTP 服務(wù)器或nginx 會(huì)讀取靜態(tài)文件。它們還能被用作主容器中的web應(yīng)用的反向代理(reverseproxy)。

當(dāng)你在Pod中運(yùn)行多層應(yīng)用(比如WordPress)時(shí),推薦的方式是為每層使用單獨(dú)的Pod。最簡(jiǎn)單的理由是這樣你就可以獨(dú)立地?cái)U(kuò)展每層,并將他們分布在不同節(jié)點(diǎn)上。

2. Pod 中容器間的通信

在Pod中運(yùn)行多個(gè)容器,使得它們之間的通信非常直接。他們自己的通信有幾種方法。

2.1 通過(guò)共享卷通信

在Kubernetes中,Pod中的容器可以將共享卷當(dāng)做一種簡(jiǎn)單和高效的共享數(shù)據(jù)方式。在大多數(shù)場(chǎng)景中,使用主機(jī)上的一個(gè)目錄,并在多個(gè)容器間共享,是一種高效的方式。

Kubernetes volume(卷)使得在容器重啟后數(shù)據(jù)能被保存下來(lái)。卷具有和Pod一樣的生命周期。這意味著,只要Pod存在,卷就存在。如果Pod被刪除了,即使一模一樣的Pod被創(chuàng)建出來(lái),原來(lái)Pod的共享卷也會(huì)被銷毀,一個(gè)新的共享卷會(huì)被創(chuàng)建出來(lái)。

Pod中的多個(gè)容器使用共享卷的一個(gè)標(biāo)準(zhǔn)用例是,當(dāng)一個(gè)容器向共享目錄寫(xiě)入日志或其它文件時(shí),其它容器從共享目錄中讀取數(shù)據(jù)。比如我們創(chuàng)建一個(gè)下面的Pod:

  
 
 
 
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.  name: mc1
  5. spec:
  6.  volumes:
  7.   -name: html
  8.    emptyDir: {}
  9.  containers:
  10.   -name: 1st
  11.    image: nginx
  12.    volumeMounts:
  13.     -name: html
  14.      mountPath: /usr/share/nginx/html
  15.   -name: 2nd
  16.    image: debian
  17.    volumeMounts:
  18.     -name: html
  19.      mountPath: /html
  20.    command: ["/bin/sh", "-c"]
  21.    args:
  22.      - while true; do
  23.          date >> /html/index.html;
  24.          sleep 1;
  25.        done

本例中,定義了一個(gè)名為html的卷。它的類型是 emptyDir,這意味著當(dāng)Pod被分配到一個(gè)節(jié)點(diǎn)上時(shí),卷會(huì)被基于一個(gè)空目錄創(chuàng)建出來(lái),只要該P(yáng)od一直運(yùn)行著,這個(gè)卷就會(huì)一直存在。1st容器運(yùn)行nginx服務(wù)器,它將共享卷掛載到/usr/share/nginx/html 目錄。2nd容器使用Debian鏡像,它將共享卷掛載到 /html目錄。每秒鐘,2nd容器會(huì)將當(dāng)前日期和時(shí)間寫(xiě)入到共享卷之中的index.html文件。當(dāng)用戶向Pod發(fā)送HTTP請(qǐng)求時(shí),Nginx讀取這個(gè)文件的內(nèi)容并返回給用戶。

你可以通過(guò)暴露nginx端口或使用瀏覽器訪問(wèn)它來(lái)檢查該P(yáng)od,或者直接查看容器額共享目錄:

  
 
 
 
  1. $ kubectl exec mc1 -c 1st -- /bin/cat/usr/share/nginx/html/index.html
  2.  ...
  3.  FriAug 25 18:36:06 UTC 2019
  4.  
  5.  $kubectl exec mc1 -c 2nd -- /bin/cat /html/index.html
  6.  ...
  7.  FriAug 25 18:36:06 UTC 2019
  8.  FriAug 25 18:36:07 UTC 2019

2.2 進(jìn)程間通信(Inter-processCommunication,IPC)

Pod中的容器共享同一個(gè)IPC命名空間,這意味著它們可以使用標(biāo)準(zhǔn)的進(jìn)程間通信方式來(lái)互相通信,比如SystemV信號(hào)量和POSIX共享內(nèi)存。

在下面的例子中,我們會(huì)定義一個(gè)包含兩個(gè)容器的Pod。它們使用同樣的鏡像。第一個(gè)容器是生產(chǎn)者(producer),它會(huì)創(chuàng)建一個(gè)標(biāo)準(zhǔn)的Linux消息隊(duì)列,并向該隊(duì)列中寫(xiě)入一些隨機(jī)字符串,最后寫(xiě)入一個(gè)特定的退出字符。第二個(gè)容器是消費(fèi)者(consumer),它打開(kāi)同一個(gè)隊(duì)列,讀取字符,直到讀到特殊的退出字符為止。我們將Pod的重啟策略設(shè)置為“Never”,因此在兩個(gè)容器都終止后Pod會(huì)停止。

  
 
 
 
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.  name: mc2
  5. spec:
  6.  containers:
  7.   -name: producer
  8.    image: allingeek/ch6_ipc
  9.    command: ["./ipc", "-producer"]
  10.   -name: consumer
  11.    image: allingeek/ch6_ipc
  12.    command: ["./ipc", "-consumer"]
  13.  restartPolicy: Never

Pod 運(yùn)行后,查看每個(gè)容器的日志,確認(rèn)2nd容器收到了1st容器的全部消息,包括特定的退出消息:

  
 
 
 
  1. $ kubectl logs mc2 -c producer
  2. ...
  3. Produced: f4
  4. Produced: 1d
  5. Produced: 9e
  6. Produced: 27
  7. $ kubectl logs mc2 -c consumer
  8. ...
  9. Consumed: f4
  10. Consumed: 1d
  11. Consumed: 9e
  12. Consumed: 27
  13. Consumed: done

默認(rèn)情況下,Pod中的所有容器都是并行啟動(dòng)的,因?yàn)闆](méi)有辦法去指定一個(gè)容器在另一個(gè)容器啟動(dòng)后才啟動(dòng)。比如,在IPC例子中,有可能第二個(gè)容器在第一個(gè)容器啟動(dòng)完成并創(chuàng)建消息隊(duì)列前就啟動(dòng)完畢了。此時(shí),第二個(gè)容器會(huì)失敗,因此它需要消息隊(duì)列在其啟動(dòng)時(shí)就已經(jīng)存在了。

有一些方法去控制容器的啟動(dòng)順序,比如 Kubernetes Init Containers(初始化容器),初始化容器會(huì)被首先啟動(dòng)。但是在云原生環(huán)境中,最好能為所有不可控的失敗都做好準(zhǔn)備。比如,要修復(fù)上述問(wèn)題,最好的辦法是修改應(yīng)用去等待,直到消息隊(duì)列被創(chuàng)建出來(lái)為止。

2.3 容器間的網(wǎng)絡(luò)通信

Pod中的容器可以通過(guò)“l(fā)ocalhost”來(lái)互相通信,因?yàn)樗麄兪褂猛粋€(gè)網(wǎng)絡(luò)命名空間。而且,對(duì)容器來(lái)說(shuō),hostname就是Pod的名稱。因?yàn)镻od中的所有容器共享同一個(gè)IP地址和端口空間,你需要為每個(gè)需要接收連接的容器分配不同的端口。也就是說(shuō),Pod中的應(yīng)用需要自己協(xié)調(diào)端口的使用。

在下面的例子中,我們會(huì)創(chuàng)建一個(gè)多容器Pod,其中一個(gè)容器中運(yùn)行Nginx,它作為另一個(gè)容器中運(yùn)行的web應(yīng)用的反向代理。

(1)步驟1,為nginx配置文件創(chuàng)建一個(gè)ConfigMap。從80端口進(jìn)來(lái)的HTTP請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到localhost上的5000端口。

  
 
 
 
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.  name: mc3-nginx-conf
  5. data:
  6.  nginx.conf: |-
  7.    user  nginx;
  8.    worker_processes  1;
  9.  
  10.    error_log /var/log/nginx/error.log warn;
  11.    pid        /var/run/nginx.pid;
  12.  
  13.    events {
  14.        worker_connections  1024;
  15.     }
  16.  
  17.    http {
  18.        include      /etc/nginx/mime.types;
  19.        default_type application/octet-stream;
  20.  
  21.        sendfile        on;
  22.        keepalive_timeout  65;
  23.  
  24.        upstream webapp {
  25.            server 127.0.0.1:5000;
  26.        }

(2)步驟2:創(chuàng)建一個(gè)兩容器Pod,一個(gè)容器運(yùn)行nginx,另一個(gè)容器運(yùn)行簡(jiǎn)單的web應(yīng)用。注意我們只為Pod定義了80端口。端口5000不能被從Pod外部訪問(wèn)到。

  
 
 
 
  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4.  name: mc3
  5.  labels:
  6.    app: mc3
  7. spec:
  8.  containers:
  9.   -name: webapp
  10.    image: training/webapp
  11.   -name: nginx
  12.    image: nginx:alpine
  13.    ports:
  14.     -containerPort: 80
  15.    volumeMounts:
  16.     -name: nginx-proxy-config
  17.      mountPath: /etc/nginx/nginx.conf
  18.      subPath: nginx.conf
  19.  volumes:
  20.   -name: nginx-proxy-config
  21.    configMap:
  22.      name: mc3-nginx-conf

查看pod中的端口空間,能看到有80 和 5000端口。

  
 
 
 
  1. # netstat -lntp
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
  4. tcp       0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -              
  5. tcp       0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      1/python

(3)步驟3:將Pod暴露為一個(gè) NodePort服務(wù)

  
 
 
 
  1. $ kubectl expose pod mc3 --type=NodePort--port=80
  2. service "mc3" exposed

(4)步驟4:確認(rèn)服務(wù)

  
 
 
 
  1. [root@master1 ~]# kubectl describe svc mc3
  2. Name:                    mc3
  3. Namespace:               testproject
  4. Labels:                   app=mc3
  5. Annotations:              
  6. Selector:                  app=mc3
  7. Type:                     NodePort
  8. IP:                       172.30.34.232
  9. Port:                       80/TCP
  10. TargetPort:                80/TCP
  11. NodePort:                   32728/TCP
  12. Endpoints:                10.130.0.190:80
  13. Session Affinity:           None
  14. External Traffic Policy:      Cluster
  15. Events:                   

現(xiàn)在,就可以使用瀏覽器或者curl工具來(lái)訪問(wèn)這個(gè)web應(yīng)用了。

  
 
 
 
  1. [root@master1 ~]# curl 10.70.209.68:32728
  2. Hello world!

nginx容器的80端口上收到的HTTP請(qǐng)求會(huì)被轉(zhuǎn)發(fā)到web應(yīng)用容器的5000端口。

上面的例子只展示了在Pod中一個(gè)容器去訪問(wèn)其它容器,實(shí)際上,更常見(jiàn)的是Pod中的多個(gè)容器會(huì)在不同的端口上監(jiān)聽(tīng),所有這些端口都會(huì)被暴露出去。要實(shí)現(xiàn)這種形式,要么你創(chuàng)建一個(gè)暴露多個(gè)端口的服務(wù),要么為每個(gè)要被暴露的端口創(chuàng)建一個(gè)服務(wù)。

3. 小結(jié)

通過(guò)創(chuàng)建Pod概念,Kubernetes為編排容器的行為以及容器間互相通信都提供了極大的便利。容器們可以共享存儲(chǔ)卷,以及可以通過(guò)網(wǎng)絡(luò)甚至IPC互相通信。

原文:https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/

原文作者:Pavel Chekin


網(wǎng)站欄目:Kubernetes中的多容器Pod和Pod內(nèi)容器間通信
地址分享:http://www.dlmjj.cn/article/cooioep.html