Kubernetes 同Pod內(nèi)的容器使用共享卷通信

2022-06-16 09:28 更新

同 Pod 內(nèi)的容器使用共享卷通信

本文旨在說明如何讓一個 Pod 內(nèi)的兩個容器使用一個卷(Volume)進行通信。

在開始之前

你必須擁有一個 Kubernetes 的集群,同時你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個節(jié)點的集群上運行本教程,且這些節(jié)點不作為控制平面主機。 如果你還沒有集群,你可以通過 Minikube 構建一個你自己的集群,或者你可以使用下面任意一個 Kubernetes 工具構建:

要獲知版本信息,請輸入 ?kubectl version?。

創(chuàng)建一個包含兩個容器的 Pod

在這個練習中,你會創(chuàng)建一個包含兩個容器的 Pod。兩個容器共享一個卷用于他們之間的通信。 Pod 的配置文件如下:

apiVersion: v1
kind: Pod
metadata:
  name: two-containers
spec:

  restartPolicy: Never

  volumes:
  - name: shared-data
    emptyDir: {}

  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"]

在配置文件中,你可以看到 Pod 有一個共享卷,名為 ?shared-data?。

配置文件中的第一個容器運行了一個 nginx 服務器。共享卷的掛載路徑是 ?/usr/share/nginx/html?。 第二個容器是基于 debian 鏡像的,有一個 ?/pod-data? 的掛載路徑。第二個容器運行了下面的命令然后終止。

echo Hello from the debian container > /pod-data/index.html

注意,第二個容器在 nginx 服務器的根目錄下寫了 ?index.html? 文件。

創(chuàng)建一個包含兩個容器的 Pod:

kubectl apply -f https://k8s.io/examples/pods/two-container-pod.yaml

查看 Pod 和容器的信息:

kubectl get pod two-containers --output=yaml

這是輸出的一部分:

apiVersion: v1
kind: Pod
metadata:
  ...
  name: two-containers
  namespace: default
  ...
spec:
  ...
  containerStatuses:

  - containerID: docker://c1d8abd1 ...
    image: debian
    ...
    lastState:
      terminated:
        ...
    name: debian-container
    ...

  - containerID: docker://96c1ff2c5bb ...
    image: nginx
    ...
    name: nginx-container
    ...
    state:
      running:
    ...

你可以看到 debian 容器已經(jīng)被終止了,而 nginx 服務器依然在運行。

進入 nginx 容器的 shell:

kubectl exec -it two-containers -c nginx-container -- /bin/bash

在 shell 中,確認 nginx 還在運行。

root@two-containers:/# ps aux

輸出類似于這樣:

USER       PID  ...  STAT START   TIME COMMAND
root         1  ...  Ss   21:12   0:00 nginx: master process nginx -g daemon off;

回憶一下,debian 容器在 nginx 的根目錄下創(chuàng)建了 ?index.html? 文件。 使用 ?curl ?向 nginx 服務器發(fā)送一個 GET 請求:

root@two-containers:/# curl localhost

輸出表示 nginx 提供了 debian 容器寫的頁面:

Hello from the debian container

討論

Pod 能有多個容器的主要原因是為了支持輔助應用(helper applications),以協(xié)助主應用(primary application)。 輔助應用的典型例子是數(shù)據(jù)抽取,數(shù)據(jù)推送和代理。輔助應用和主應用經(jīng)常需要相互通信。 就如這個練習所示,通信通常是通過共享文件系統(tǒng)完成的,或者,也通過回環(huán)網(wǎng)絡接口 localhost 完成。 舉個網(wǎng)絡接口的例子,web 服務器帶有一個協(xié)助程序用于拉取 Git 倉庫的更新。

在本練習中的卷為 Pod 生命周期中的容器相互通信提供了一種方法。如果 Pod 被刪除或者重建了, 任何共享卷中的數(shù)據(jù)都會丟失。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號