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

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

什么是 Kubernetes Pod?

在了解 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 的信息:

  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

现在我们已经对 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版本。在我们的例子中是v1
kind对象类型,这里是Pod
metadata元数据用于唯一地标识和描述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-serverenvironment: 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"

在这里,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

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

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

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

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

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:1.14.2
    ports:
    - 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 中运行的应用程序

现在我们有了一个运行中的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

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

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

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

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

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

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

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

Pod 的生命周期

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

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

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

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-myservice
    image: busybox:1.28
    command: ['sh', '-c', 'echo "Init container started!"']
  containers:
  - name: web-server
    image: nginx:latest
    ports:
    - containerPort: 80
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
    - name: secret-volume
      mountPath: /etc/my-secret
    - name: configmap-volume
      mountPath: /etc/config
    securityContext:
      capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
    readinessProbe:
      httpGet:
        path: /index.html
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
    livenessProbe:
      httpGet:
        path: /index.html
        port: 80
      initialDelaySeconds: 15
      periodSeconds: 20
    startupProbe:
      httpGet:
        path: /index.html
        port: 80
      failureThreshold: 30
      periodSeconds: 10
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo 'PostStart'"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo 'PreStop'"]
  serviceAccountName: nginx-service-account   
  securityContext:                        
    runAsUser: 1000
    runAsGroup: 3000
    fsGroup: 2000
  shareProcessNamespace: true
  volumes:
  - name: shared-data
    emptyDir: {}
  - name: secret-volume
    secret:
      secretName: nginx-secret
  - name: configmap-volume
    configMap:
      name: nginx-configmap

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系列】文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/679713.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】LoRA:大语言模型中低秩自适应分析

LoRA:大型语言模型中的低秩自适应调优策略 一、LoRA的原理与优势二、LoRA在编程和数学任务中的性能表现四、总结与展望 随着人工智能技术的飞速发展,大型语言模型已成为自然语言处理领域的明星技术。然而,这些模型通常拥有数以亿计的参数&…

vivado BD_PIN、BD_PORT

BD_PIN 描述 块设计引脚或bd_pin对象是块设计上的逻辑连接点 单间牢房块设计引脚允许抽象单元的内部逻辑,并且 简化以便于使用。引脚可以是标量引脚或总线引脚,并且可以出现在层次结构上 块设计单元或叶级单元。 相关对象 如图所示,块设计引脚…

Mac保姆级配置jdk环境

1.找到下载的jdk环境 通常是这个。留作备用 /Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home/bin 然后新开一个终端下执行以下命令 sudo vim ~/.bash_profile 进入编辑模式后 按 i 开始添加内容结束编辑模式按 ESC结束后保存输入 :wq!不保存输入 :q! 注意…

react native中内容占位效果

react native中内容占位效果 效果实例图实例代码skeleton.jsx 效果实例图 实例代码skeleton.jsx import React, { useEffect, useRef } from "react"; import { Animated, StyleSheet, View } from "react-native"; import { pxToPd } from "../../.…

【Lua】IntelliJ IDEA 写注释或选中变量单词时偶尔会选中相邻的内容或下一行内容

例如: --UI代码local a 0 当你想在a变量上方加一行 --UI代码注释时,会发现敲打daima中文拼音时(还未按回车)就会选中当前行以及下一行前半部分。 打完按空格就会变成这样子! 原因是因为开启了英文检测,需要关掉它。 …

LabVIEW实现汽车逆变器功能测试系统

​介绍了如何利用LabVIEW开发汽车逆变器(包括功率板和控制板)的自动测试设备(ATE),实现对额定800V电压、300A电流的逆变器进行功能测试。系统通过CAN2.0通讯协议,实现电机控制、温度传感器监测、电压校验和…

js中弹框有那些,提示框、请求成功弹窗、请求失败弹框等

我这里写的是个人推荐仅供参考&#xff1a; 效果图&#xff1a; 代码实现 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><script src"js/jquery-3.6.3.js"></script><style&g…

el-table的一些操作

1.el-table实现全部选择和全部取消 其实非常简单&#xff0c;el-table自带的都有方法toggleAllSelection()和clearSelection() 表格数据&#xff1a; <el-button clickcheckAll>全选</el-button> <el-button clickcancelAll>反选</el-button>// 全…

SQL进阶day10————多表查询

1嵌套子查询 1.1月均完成试卷数不小于3的用户爱作答的类别 我的代码&#xff1a;思路就是这么个思路&#xff0c;反正没有搞出来当月均完成试卷数 select tag,count(submit_time) tag_cnt from exam_record er join examination_info ei on er.exam_id ei.exam_id where uid…

【从零开始部署SAM(Segment Anything Model )大模型 3 Ubuntu20 离线部署 C++】

这里是目录 总览环境配置模型准备Moble SAM onnx模型获取Moble SAM pre onnx模型获取 运行cmakelist 运行结果 总览 相比于使用python离线部署SAM大模型&#xff0c;C要麻烦的多&#xff0c;本篇的部署过程主要基于项目&#xff1a;https://github.com/dinglufe/segment-anyth…

Python中上下文管理器解析

文章目录 基本原理上下文管理器的工作原理自定义上下文管理器enter和exitcontextlib 模块 异常处理 Python中的上下文管理器&#xff08;Context Manager&#xff09;是一种用于管理资源的机制&#xff0c;特别是在文件操作、数据库连接和锁定等场景中非常有用。上下文管理器通…

python替换“${}“占位符为变量,实现读取配置文件

文章目录 背景1、定义正则表达式2、替换变量占位符3、实现功能 背景 使用python编写小工具&#xff0c;有一个配置文件&#xff0c;希望实现类似shell命令的&#xff0c;定义变量并且使用${}或者$来引用。如果有好的建议欢迎讨论。 配置文件示例内容如下: D:\project\test\pr…

Windows下通过Ollama部署使用本地模型

Windows下通过Ollama部署使用本地模型 下载Ollama 安装主程序 Ollama下载exe&#xff0c;直接下一步下一步没有设置可以更改 windows默认安装路径在C盘 安装后会自动将该路径加入环境变量 双击图标运行后状态栏会出现小图标&#xff0c;右键有退出、打开日志文件夹按钮 通过…

mac配置Personal Access Tokens

背景 在macbook环境中&#xff0c;使用idea、android studio、xcode时&#xff0c;使用gitlab需要登录&#xff0c;而直接使用文明密码是不允许登录的&#xff0c;这时就需要换种方式&#xff0c;这里有两种&#xff1a;ssh、Access Tokens&#xff0c;在公用电脑上推荐使用Ac…

Linux网络的DHCP配置

文章目录 DHCP配置DHCP流程简述DHCP优点DHCP的分配方式DHCP的租约过程DHCP配置实验实验1实验2 DHCP配置 DHCP&#xff1a;动态主机配置协议 服务端和客户端 服务端&#xff1a;server&#xff0c;提供某种特定的服务 客户端&#xff1a;client&#xff0c;使用服务端提供的服…

R语言探索与分析18-基于时间序列的汇率预测

一、研究背景与意义 汇率是指两个国家之间的货币兑换比率&#xff0c;而且在国家与国家的经济交流有着举足轻重的作用。随着经济全球化的不断深入&#xff0c;在整个全球经济体中&#xff0c;汇率还是一个评估国家与国家之间的经济状况和发展水平的一个风向标。汇率的变动会对…

Thread Local六连问,你扛得住吗?

一、Thread Local 是什么? 线程本地变量。当使用ThreadLocal维护变量时&#xff0c;ThreadLocal为每个使用该变量的线程提供独立的变量副本&#xff0c;所以每个线程都可以独立地改变自己的副本&#xff0c;而不影响其他线程&#xff0c;做到了线程隔离。 二、Thread Local …

HTB 靶场 Mailing 未完待续

访问网页 在/etc/hosts 添加ip和域名 hosts 文件包含ip地址与主机名之间的映射&#xff0c;还包括主机的别名。 Linux系统所有程序查询/etc/hosts文件解析对主机名或者域名的IP地址。没有找到就需要使用DNS服务器解释域名。 DNS原理 1 输入域名&#xff0c;在本地缓存服务…

【工具】Vmware17 安装mac(13.6.7)虚拟机

目录 0.简介 1.环境 2.详细步骤 2.1下载mac镜像&#xff08;可以选择你所需要的&#xff09; 2.2 VMware安装 1&#xff09;创建新的虚拟机 2&#xff09;选择【典型】&#xff0c;点击下一步 3&#xff09;选择【安装程序光盘映像文件】&#xff0c;点击浏览&#xff…

公派/自费访问学者申请出国访学的常见问题解答(下)

06、学术背景和研究成果要求&#xff1f; 访学是面向学术单位和企事业单位开放的。 针对学术单位&#xff0c;比如高校与科研院所&#xff0c;学科内涉及的论文发表&#xff0c;课题研究&#xff0c;专利&#xff0c;著作&#xff0c;含金量较高的奖项等背景都是国外比较看重…