document.write('
')

成语大全-成语接龙-成语文章-成语词典

容器与 Pod 有什么区别和联系?这篇文章告诉你

容器与 Pod 有什么区别和联系?这篇文章告诉你

2022-04-18 07:10 来源: 联动企业实验室

原标题:容器与 Pod 有什么区别和联系?这篇文章告诉你

容器与 Pod 有什么区别和联系?这篇文章告诉你

容器本可以成为轻量级虚拟机的替代品。但是,由于 Docker/OCI 的标准化,最广泛使用的容器形式是每个容器只有一个进程服务。这种方法有很多优点——增加隔离性、简化水平扩展、更高的可重用性等。但是,它也有一个很大的缺点——正常情况下,虚拟(或物理)机器很少只运行一个服务。

虽然 Docker 试图提供一些变通方法来创建多服务容器,但 Kubernetes 迈出了更大胆的一步,并选择了一组称为 Pod 的内聚容器作为最小的可部署单元。

几年前,当我偶然发现 Kubernetes 时,我之前的虚拟机和裸机经验让我很快就了解了 Pod。

刚开始接触 Kubernetes 时,你学到的第一件事就是每个 Pod 都有一个唯一的 IP 和主机名,并且在同一个 Pod 中,容器可以通过 localhost 相互通信。所以,显而易见,一个 Pod 就像一个微型的服务器。

但是,过段时间,你会发现 Pod 中的每个容器都有一个隔离的文件系统,并且从一个容器内部,你看不到在同一 Pod 的其他容器中运行的进程。好吧!也许 Pod 不是一个微型的服务器,而只是一组具有共享网络堆栈的容器。

但随后你会了解到,Pod 中的容器可以通过共享内存进行通信!所以,在容器之间,网络命名空间不是唯一可以共享的东西……

基于最后的发现,所以,我决定深入了解:

Pod 是如何在底层实现的

Pod 和 Container 之间的实际区别是什么

如何使用 Docker 创建 Pod

在此过程中,我希望它能帮助我巩固我的 Linux、Docker 和 Kubernetes 技能。

1、探索 Container

OCI 运行时规范并不将容器实现仅限于 Linux 容器,即使用 namespace 和 cgroup 实现的容器。但是,除非另有明确说明,否则本文中的容器一词指的是这种相当传统的形式。

设置实验环境(playground)

在了解构成容器的 namespace 和 cgroups 之前,让我们快速设置一个实验环境:

$ cat > Vagrantfile <<EOF # -*- mode: ruby -*- # vi: set ft=ruby :

Vagrant.configure("2") do |config|config.vm.box = "debian/buster64"config.vm.hostname = "docker-host"config.vm.define "docker-host"config.vagrant.plugins = ['vagrant-vbguest']

config.vm.provider "virtualbox" do |vb|vb.cpus = 2vb.memory = "2048"end

config.vm.provision "shell", inline: <<-SHELLapt-get updateapt-get install -y curl vimSHELL

config.vm.provision "docker"endEOF

$ vagrant up$ vagrant ssh

最后让我们启动一个容器:

$ docker run --name foo --rm -d --memory='512MB' --cpus='0.5' nginx

探索容器的 namespace

首先我们来看一下,当容器启动后,哪些隔离原语(primitives)被创建了:

# Look up the container in the process tree.$ ps auxfUSER PID ... COMMAND...root 4707 /usr/bin/containerd-shim-runc-v2 -namespace moby -id cc9466b3e...root 4727 \_ nginx: master process nginx -g daemon off;systemd+ 4781 \_ nginx: worker processsystemd+ 4782 \_ nginx: worker process

# Find the namespaces used by 4727 process.$ sudo lsnsNS TYPE NPROCS PID USER COMMAND...4026532157 mnt 3 4727 root nginx: master process nginx -g daemon off;4026532158 uts 3 4727 root nginx: master process nginx -g daemon off;4026532159 ipc 3 4727 root nginx: master process nginx -g daemon off;4026532160 pid 3 4727 root nginx: master process nginx -g daemon off;4026532162 net 3 4727 root nginx: master process nginx -g daemon off;

我们可以看到用于隔离以上容器的命名空间是以下这些:

mnt(挂载): 容器有一个隔离的挂载表。

uts(Unix 时间共享): 容器拥有自己的 hostname 和 domain。

ipc(进程间通信): 容器内的进程可以通过系统级 IPC 和同一容器内的其他进程进行通信。

pid(进程 ID): 容器内的进程只能看到在同一容器内或拥有相同的 PID 命名空间的其他进程。

net(网络): 容器拥有自己的网络堆栈。