在了解 Kubernetes Pod 概念之前,先来了解容器
容器,众所周知,是一个自包含的环境,用于打包应用步调及其依赖项。通常,一个容器运行单个历程(只管也有方法可以运行多个历程)。每个容器都有一个IP地址,并且可以附加存储卷以及控制CPU和内存资源等。这些都是通过定名空间和控制组(namespaces and control groups)的概念实现的。
Kubernetes 是一个用于部署、扩展和管理容器化应用步调的容器编排系统,它有本身运行容器的方式,我们称之为 Pod。Pod 是 Kubernetes 中最小的可部署单元,代表一个应用步调的单个实例。
例如,假如你想运行 Nginx 应用步调,你可以将它运行在一个 Pod 中。
那么,Pod 与容器有何不同呢?
容器是一个单独的单位。然而,Pod 可以包含多个容器。你可以将 Pod 想象成一个可以同时容纳一个或多个容器的盒子。
Pod 提供了更高层次的抽象,允许你将多个容器作为一个单元进行管理。在这里,每个容器不再单独得到 IP 地址,而是 Pod 得到一个唯一的 IP 地址,并且运行在 Pod 内的容器通过 localhost 在不同端口上相互连接。
这意味着 Kubernetes Pod 内的容器共享以下内容:
网络定名空间:Pod 内的全部容器通过 localhost 进行通信。
IPC 定名空间:全部容器利用共享的历程间通信定名空间。
UTS 定名空间:全部容器共享相同的主机名。
Pod 内的容器不共享什么?
默认环境下,PID 定名空间不共享,但 Kubernetes 提供选项,通过 shareProcessNamespace 选项在 Pod 内启用历程共享。
假如有多个容器,在 Pod 启动期间,全部主要容器并行启动。而 Pod 内的 init 容器按顺序运行。
Pod YAML
如今我们已经对 Pod 有了基本的了解,接下来看看怎样定义 Pod。Pod 是原生的 Kubernetes 对象,假如你想创建一个 Pod,需要以 YAML 格式声明 Pod 的需求。你也可以利用 kubectl 命令创建 Pod,这将在后面的主题中介绍。
以下是一个创建 Nginx Web 服务器 Pod 的 Pod YAML 示例。这个 YAML 文件只是一个 Pod 的声明性期望状态。
apiVersion: v1
kind: Pod
metadata:
name: web-server-pod
labels:
app: web-server
environment: production
annotations:
description: This pod runs the web server
spec:
containers:
- name: web-server
image: nginx:latest
ports:
- containerPort: 80
复制代码
让我们来了解这个 Pod YAML。一旦你理解了基本的 YAML 格式,就会更容易利用 Pod 和相关对象,如 Deployment、DaemonSet、StatefulSet 等。
每个 Kubernetes 对象都有一些通用的参数。这些参数的值会根据我们创建的对象类型而变化。让我们看看 Kubernetes Pod 对象。
参数描述apiVersionpod的API版本。在我们的例子中是v1kind对象类型,这里是Podmetadata元数据用于唯一地标识和描述pod- 标签(表示pod的键值对的集合)。这类似于云环境中的标志。每件物品都必须贴上标准标签。它有助于对对象进行分组。- name (pod的名称) - namespace (pod的定名空间)-注释(key-value格式的附加数据)spec在spec 部分,我们声明pod的所需状态。这些是我们想要在pod中运行的容器的规范。containers在containers下,我们声明pod中容器的所需状态。容器映像、暴露的端口等。 我们如今已经看到了一个基本的Pod YAML清单。需要注意的是,这个清单文件支持许多参数。我们将渐渐探索这些额外的参数与实践的方法。
如今我们对Pod有了一些基本的了解,让我们创建一个Pod。
创建Pod
你可以用两种方法创建pod
利用kubectl命令式命令:主要用于学习和测试目的。命令式命令有其自身的局限性。
声明式方法:利用YAML方式。在开发项目时,YAML清单文件用于部署pods。
让我们看看这两个方式。我们将利用以下内容创建一个NGINX pod
pod的名称是web-server-pod
它应该有标签:app: web-server和environment: production
添加一个注释来描述pod。
利用nginx:1.14.2容器镜像。
暴露集装箱端口80。
方法1:利用Kubectl命令创建Pod
对于讨论的pod需求,这里是kubectl命令。
kubectl run web-server-pod \
--image=nginx:1.14.2 \
--restart=Never \
--port=80 \
--labels=app=web-server,environment=production \
--annotations description="This pod runs the web server"