pod內部網絡實現


k8s主題系列:
一、k8s網絡之設計與實現
二、k8s網絡之pod內部網絡
三、k8s網絡之Flannel網絡
四、k8s網絡之Calico網絡

pod特性

Pod 是 K8S 的最小工作單元。每個 Pod 包含一個或多個容器。K8S 管理的也是 Pod 而不是直接管理容器。Pod 中的容器會作為一個整體被 Master 調度到一個 Node 上運行。
Pod 的設計理念是支持多個容器在一個 Pod 中共享網絡地址和文件系統,可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。

一個 Pod 中可以包含多個容器,而一個 Pod 只有一個 IP 地址。那么多個容器之間互相訪問和訪問外網是如何使用這一個 IP 地址呢?
答案是:多個容器共享同一個底層的網絡命名空間 Net(網絡設備、網絡棧、端口等)。

共享網絡探究

下面以一個小例子說明,創建一個 Pod 包含兩個容器,yaml 文件如下:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: Pod-two-container
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: busybox
        image: busybox
        command:
        - "/bin/sh"
        - "-c"
        - "while true;do echo hello;sleep 1;done"
      - name: nginx
        image: nginx


創建 1 個 Pod 中包含 2 個 Container,實際會創建 3 個 Container。多出的一個是“Pause”容器。

該 Container 是 Pod 的基礎容器,為其他容器提供網絡功能。


查看 Pause 容器的基礎信息:

使用命令 docker inspect 容器 _ID 查看 Nginx 詳細信息,其網絡命令空間使用了 Pause 容器的命名空間,同樣還有進程間通信的命名空間。

再查看 Busybox,可以發現其網絡命令空間使用了 Pause 容器的命名空間,進程通信的命名空間也是 Pause 容器的命名空間。


實現方式:Nginx 和 Busybox 之所以能夠和 Pause 的命名空間連通是因為 Docker 有一個特性:能夠在創建時使用指定 Docker 的網絡命名空間。

在 Docker 的官網上有一段描述:

https://docs.docker.com/engine/reference/run/

手動實現pod網絡

所以如果要手動完成一個上面的 Pod,可以先創建 Pause,再創建 Nginx 和 Busybox,同時將網絡指定為 Pause 的網絡命名空間即可。

docker run --name pause mirrorgooglecontainers/pause-amd64:3.1
docker run --name=nginx --network=container:pause  nginx 
docker run --name=busybox --network=container:pause  busybox

上述步驟由 K8S 幫助我們完成,所以 Pod 命名空間應該是這樣的:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM