【云原生_K8S系列】什么是 Kubernetes Pod?用实际例子解释

ops/2024/10/15 22:13:29/

Kubernetes(简称K8S)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。在Kubernetes中,Pod是最小的部署单元。理解Pod的概念对于掌握Kubernetes至关重要。本篇文章将详细解释什么是Kubernetes Pod,并通过实际例子帮助读者更好地理解这一概念。

Pod_5">什么是 Kubernetes Pod

在了解 Kubernetes Pod 概念之前,先来了解容器

容器,众所周知,是一个自包含的环境,用于打包应用程序及其依赖项。通常,一个容器运行单个进程(尽管也有方法可以运行多个进程)。每个容器都有一个IP地址,并且可以附加存储卷以及控制CPU和内存资源等。这些都是通过命名空间和控制组(namespaces and control groups)的概念实现的。

Kubernetes 是一个用于部署、扩展和管理容器化应用程序的容器编排系统,它有自己运行容器的方式,我们称之为 PodPod 是 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 的信息:

  1. Pod 是 Kubernetes 中最小的可部署单元。
  2. Pod 具有短暂性;它们可以被创建、删除和更新。
  3. 一个 Pod 可以有多个容器;没有限制一个 Pod 中可以运行多少个容器
  4. 每个 Pod 都有一个唯一的 IP 地址。
  5. Pod 之间通过 IP 地址进行通信。
  6. Pod 内的容器使用 localhost 通过不同的端口进行连接。
  7. Pod 内运行的容器应该有不同的端口号,以避免端口冲突。
  8. 你可以为 Pod 内运行的每个容器设置 CPU 和内存资源。
  9. Pod 内的容器共享相同的存储卷挂载。
  10. Pod 内的所有容器都调度到同一个节点上;它不能跨多个节点。
  11. 如果有多个容器,在 Pod 启动期间,所有主要容器并行启动。而 Pod 内的 init 容器按顺序运行。

Pod_YAML_45">Pod YAML

现在我们已经对 Pod 有了基本的了解,接下来看看如何定义 PodPod 是原生的 Kubernetes 对象,如果你想创建一个 Pod,需要以 YAML 格式声明 Pod 的需求。你也可以使用 kubectl 命令创建 Pod,这将在后面的主题中介绍。
以下是一个创建 Nginx Web 服务器 PodPod YAML 示例。这个 YAML 文件只是一个 Pod 的声明性期望状态。

apiVersion: v1
kind: Pod
metadata:name: web-server-podlabels:app: web-serverenvironment: productionannotations:description: This pod runs the web server
spec:containers:- name: web-serverimage: nginx:latestports:- containerPort: 80

让我们来了解这个 Pod YAML。一旦你理解了基本的 YAML 格式,就会更容易操作 Pod 和相关对象,如 Deployment、DaemonSet、StatefulSet 等。
每个 Kubernetes 对象都有一些通用的参数。这些参数的值会根据我们创建的对象类型而变化。让我们看看 Kubernetes Pod 对象。

参数描述
apiVersionpod的API版本。在我们的例子中是v1
kind对象类型,这里是Pod
metadata元数据用于唯一地标识和描述pod- 标签(表示pod的键值对的集合)。这类似于云环境中的标记。每件物品都必须贴上标准标签。它有助于对对象进行分组。- name (pod的名称) - namespace (pod的命名空间)-注释(key-value格式的附加数据)
spec在spec 部分,我们声明pod的所需状态。这些是我们想要在pod中运行的容器的规范。
containers在containers下,我们声明pod中容器的所需状态。容器映像、暴露的端口等。

我们现在已经看到了一个基本的Pod YAML清单。需要注意的是,这个清单文件支持许多参数。我们将逐步探索这些额外的参数与实践的方法。

现在我们对Pod有了一些基本的了解,让我们创建一个Pod

Pod_79">创建Pod

你可以用两种方法创建pod

  • 使用kubectl命令式命令:主要用于学习和测试目的。命令式命令有其自身的局限性。
  • 声明式方法:使用YAML方式。在开发项目时,YAML清单文件用于部署pods。

让我们看看这两个方式。我们将使用以下内容创建一个NGINX pod

  • pod的名称是web-server-pod
  • 它应该有标签:app: web-serverenvironment: production
  • 添加一个注释来描述pod。
  • 使用nginx:1.14.2容器镜像。
  • 暴露集装箱端口80

Pod_93">方法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"

在这里,pod被部署在默认命名空间中。你可以获得部署的pod kubectl的状态。

kubectl get pods

部署pod后,您将看到pod的运行状态,如下所示。在我们的例子中,pod中只有一个容器。所以它显示1/1就绪并运行。

如果你想知道运行pod的所有细节,可以使用kubectl describe pod

kubectl describe pod web-server-pod

在下面的输出中,你可以看到pod的所有细节。它的IP地址、命名空间、容器细节、QoS类等。

这里是描述命令显示的所有重要pod信息的图形视图。

现在让我们使用以下命令删除pod。

kubectl delete pod web-server-pod

Pod_123">方法2:使用声明式YAML创建Pod

在实际项目中,你将不得不通过声明的方法来创建pods。

让我们看看如何使用YAML清单文件创建pod。

创建名为nginx的文件。内容如下。

apiVersion: v1
kind: Pod
metadata:name: web-server-podlabels:app: web-serverenvironment: productionannotations:description: This pod runs the web server
spec:containers:- name: web-serverimage: nginx:1.14.2ports:- containerPort: 80

现在,要部署清单文件,您需要使用文件名执行以下kubectl命令。

kubectl create -f nginx.yaml

我们应该记住创建YAML时的每个参数吗?不用。你可以使用--dry-run标志创建YAML文件。

kubectl run nginx-pod --image=nginx:1.14.2 --dry-run=client -o yaml

Pod__155">访问在 Pod 中运行的应用程序

现在我们有了一个运行中的pod和Nginx web服务器。整个想法是部署和访问在pod中运行的应用程序。

Kubectl提供了一个port-forward命令来从本地工作站访问Kubernetes集群中运行的pods。

我们有一个名为web-server-pod的运行pod。让我们通过port-forward命令访问它。

现在,如果您打开浏览器并访问http://localhost:8080,您应该会看到如下所示的Nginx主页。网页由我们的Nginx web服务器pod提供服务。

现在你可以按CTRL+C断开端口转发。
以下是运行kubectl port-forward时发生的情况

  • Kubectl绑定本地系统中的指定端口。在我们的例子中是8080。
  • 然后,它与Kubernetes集群API通信,以建立到所需节点的隧道(单个HTTP连接),然后到指定的pod和容器端口(80)。

注意:kubectl端口转发更多的是一个调试实用程序。你需要使用Kubernetes服务对象来公开在pod中运行的应用程序。我们将在另一个博客中实际地研究Kubernetes service 的概念。

Pod_Shell_172">访问 Pod Shell

我们已经学习了如何访问在pod中运行的应用程序。

现在如果你想进入Pod shell怎么办?

有许多用例需要终端访问pod。一个主要用例是调试和故障排除。

这就是kubectl exec命令派上用场的地方。

您可以使用以下命令访问web-server-pod的shell。

kubectl exec -it web-server-pod -- /bin/sh

在下面的输出中,我正在pod内执行whoami命令。

Pod__187">Pod 的生命周期

关于pod你应该知道的另一个重要概念是它的生命周期。
pod通常由ReplicaSet controller、Deployment controller等控制器管理。当您使用YAML创建单个pod时,它不受任何控制器的管理。在这两种情况下,pod都会经历不同的生命周期阶段。
Pod的生命周期包括以下几个阶段:

  1. PendingPod已被Kubernetes API Server接受,但还没有被调度到Node上。
  2. RunningPod已被调度到Node上,所有容器都已启动。
  3. SucceededPod中的所有容器都正常终止,且不会再被重启。
  4. FailedPod中的某个容器意外终止,且不会再被重启。
  5. Unknown:由于某种原因,无法获取Pod的状态。

如果你通过kubectl describe pod命令查看Pod的详细信息,你可以看到Pod的状态。这里有一个例子。

Pod__200">Pod 功能

我们已经部署了一个简单的Nginx pod,配置非常少。但是,pod具有许多用于资源管理、配置、机密、可用性、安全性等方面的特性。

如果你是初学者,一次性学习所有这些概念将是多余的。在使用与pod相关的对象(如具有实际用例的Deployment)时,学习所有这些概念更有意义。

此外,您需要通过实际用例详细了解每个特性。

以下是与pod相关的主要特性。

  1. Resource Requests and Limits: Pod CPU/内存分配
  2. Labels: 附加在pod上的键值对,用于对资源进行分类。
  3. Selectors: 根据标签对资源进行分组。
  4. Liveness, ReadinessStartup Probes: 容器运行状况检查
  5. ConfigMaps: 用于配置管理
  6. Secrets: 用于秘密管理
  7. Volumes: 持久数据存储
  8. Init Containers: 在主容器之前运行的容器
  9. Ephemeral Containers: 添加到pod中的临时容器,用于调试或故障排除。
  10. Service Account: :用于限制对Kubernetes对象和资源的访问。
  11. SecurityContext: 主机权限和特权。
  12. Affinity and Anti-Affinity Rules: 跨节点的Pod放置控制。
  13. Pod Preemption & Priority: 设置Pod调度和驱逐的优先级。
  14. Pod Disruption Budget: 在自愿中断期间需要运行的Pod副本的最小数量。
  15. Container Life Cycle Hooks:根据pod的生命周期阶段变化执行自定义脚本。

全面的 Pod YAML 配置
如果您添加我上面列出的pod特性,您将得到一个全面的pod YAML配置,如下所示。此外,这些选项将与Deployment、Statefulset等对象一起使用。

apiVersion: v1
kind: Pod
metadata:name: web-server-pod
spec:initContainers:- name: init-myserviceimage: busybox:1.28command: ['sh', '-c', 'echo "Init container started!"']containers:- name: web-serverimage: nginx:latestports:- containerPort: 80volumeMounts:- name: shared-datamountPath: /usr/share/nginx/html- name: secret-volumemountPath: /etc/my-secret- name: configmap-volumemountPath: /etc/configsecurityContext:capabilities:add: ["NET_ADMIN", "SYS_TIME"]resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"readinessProbe:httpGet:path: /index.htmlport: 80initialDelaySeconds: 5periodSeconds: 5livenessProbe:httpGet:path: /index.htmlport: 80initialDelaySeconds: 15periodSeconds: 20startupProbe:httpGet:path: /index.htmlport: 80failureThreshold: 30periodSeconds: 10lifecycle:postStart:exec:command: ["/bin/sh", "-c", "echo 'PostStart'"]preStop:exec:command: ["/bin/sh", "-c", "echo 'PreStop'"]serviceAccountName: nginx-service-account   securityContext:                        runAsUser: 1000runAsGroup: 3000fsGroup: 2000shareProcessNamespace: truevolumes:- name: shared-dataemptyDir: {}- name: secret-volumesecret:secretName: nginx-secret- name: configmap-volumeconfigMap:name: nginx-configmap

Pod__300">Pod 关联对象

当谈到在Kubernetes上运行应用程序时,我们不会运行单个pod。因为Kubernetes是关于扩展和维护pod可用性的。
所以如果你运行一个单独的pod,它将是一个单点故障。因为Pod本身不能直接缩放。
正如我们在Kubernetes架构中讨论的那样,我们需要像Replicaset这样的控制器来确保始终运行所需数量的pod。
针对不同的用例,Kubernetes有不同类型的对象与pod相关联。

以下是与pod相关的重要对象:

  1. Replicaset: 维护一组稳定的pod副本在任何给定时间运行。
  2. Deployment: 运行无状态应用程序,如web服务器、api等
  3. StatefulSets: 运行有状态的应用程序,如分布式数据库。
  4. Daemonsets: 在所有Kubernetes节点上运行代理。
  5. Jobs: 用于批处理
  6. CronJobs: 计划的作业

总结

Kubernetes Pod容器编排的基本单元,包含一个或多个共享网络和存储的容器。通过理解Pod的概念和生命周期,我们可以更有效地在Kubernetes中部署和管理应用。本文通过一个简单的Nginx Pod示例展示了如何创建和访问Pod,希望能帮助读者更好地理解Kubernetes Pod的基本原理。

如果你对云原生和Kubernetes感兴趣,欢迎关注我们后续的【云原生|K8S系列】文章。


http://www.ppmy.cn/ops/47857.html

相关文章

网络安全第一课

网络设备、 交换机,路由器,网线,防火墙。 虚拟化技术分为哪两大类 交换机是组建局域网,内网的重要设备,但是交换机依赖路由器的内网外网 局域网一般称为内网 路由器两个口,一个连接内网,一…

Spark Streaming 概述及入门案例

一、介绍 1. 不同的数据处理 从数据处理的方式: 流式数据处理(Streaming)批量数据处理(Batch) 从数据处理的延迟: 实时数据处理(毫秒级别)离线数据处理(小时或天级别) 2. 简介 SparkStreaming 是一个准实时(秒或分钟级别)、微批量的数据处理框架Spa…

JVM 虚拟机

JVM 是 Java Virtual Machine 的简称,意为 Java 虚拟机,虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机有:JVM、VMwave、Virtual Box等。JVM 是一台被定制过的现实当中不存在的计算…

酒茶元宇宙 - 探索味觉与科技的融合奇迹

在追求创新和完美体验的新时代,酒茶文化也迎来了前所未有的变革——"酒茶元宇宙"。这一概念不仅重新定义了我们对于酒茶享受的理解,更为酒茶爱好者及业界人士提供了一个独特的交流平台。让我们一起探索这个将传统饮品与现代科技完美融合的全新…

python tqdm怎么安装

tqdm是一个显示循环的进度条的库。taqadum, تقدّم)在阿拉伯语中的意思是进展。tqdm可以在长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator),是一个快速、扩展性强的进度条工具库。 tqdm库的安装 在CMD窗口下输…

区块链简要介绍及运用的技术

一、区块链的由来 区块链概念最早是从比特币衍生出来的。 比特币(Bitcoin)诞生于2008年,是由一个名叫中本聪(Satoshi Nakamoto)的人首次提出,这个人非常神秘,至今没有他的任何准确信息。在提出…

2024河南高考作文ChatGPT

阅读下面的材料,根据要求写作。(60分) 随着互联网的普及、人工智能的应用,越来越多的问题能很快得到答案。那么,我们的问题是否会越来越少? 以上材料引发了你怎样的联想和思考?请写一篇文章。 要…

Windows系统电脑本地部署AI音乐创作工具并实现无公网IP远程使用

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 本文主要介绍如何在Windows系统电脑上快速本地部署一个文字生成音乐的AI创作工具MusicGPT,并结合cpolar内网穿透工具实现随时随地远程访问使用。 MusicG…