涨薪技术|Kubernetes(k8s)之认识Pod

01了解Pod

Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。

一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。它可能由单个容器或多个容器共享组成的资源。

Kubernetes中的Pod使用可分两种主要方式:

  • Pod中运行一个容器。"one-container-per-Pod"模式是Kubernetes最常见的用法; 在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。

  • Pods中运行多个需要一起工作的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,这些容器可以形成一个单一的内部service单位 - 一个容器共享文件,另一个"sidecar"容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。

每个Pod都是运行应用的单个实例,如果需要水平扩展应用(例如,运行多个实例),则应该使用多个Pods,每个实例一个Pod。在Kubernetes中,这样通常称为Replication。Replication的Pod通常由Controller创建和管理。

02Pod结构和定义

Kubernetes 添加了一个 Pod 来托管你的应用实例。Pod 是 Kubernetes 抽象出来的,表示一组一个或多个应用程序容器(如 Docker),以及这些容器的一些共享资源。

这些资源包括:

  • 共享存储,当作卷

  • 网络,作为唯一的集群 IP 地址

  • 有关每个容器如何运行的信息,例如容器镜像版本或要使用的特定端口

Pod 为特定于应用程序的"逻辑主机"建模,并且可以包含相对紧耦合的不同应用容器。例如,Pod 可能既包含带有 Node.js 应用的容器,也包含另一个不同的容器,用于提供 Node.js 网络服务器要发布的数据。Pod 中的容器共享 IP 地址和端口,始终位于同一位置并且共同调度,并在同一工作节点上的共享上下文中运行。

Pod是Kubernetes 平台上的原子单元。当我们在 Kubernetes 上创建 Deployment 时,该Deployment 会在其中创建包含容器的 Pod (而不是直接创建容器)。每个 Pod 都与调度它的工作节点绑定,并保持在那里直到终止重启策略)或删除。如果工作节点发生故障,则会在集群中的其他可用工作节点上调度相同的 Pod。

Pod资源清单:

复制代码
apiVersion: v1 #必选,版本号,例如v1king: Pod #必选,资源类型,例如Podmetadata:name: string #必选,pod名称namespace: string #pod所属的命名空间,默认为"default"labels:- name: stringspec: #必选,pod中容器的详细定义containers: #必选,pod中容器列表- name: string #必选,容器名称image: string #必选,容器镜像名称imagePullPolicy: [Always|Never|IfNotPresent] #获取镜像的策略command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令args: [string] #容器的启动命令参数列表workingDir: string #容器的工作目录volumeMounts: #挂载到容器内部的存储卷配置- name: string #引用pod定义的共享数据卷的名称,需用volumes[]部分定义的卷名mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符readOnly: boolean #是否为只读模式ports: #需要暴露的端口库号列表- name: string #端口的名称containerPort: int #容器需要监听的端口号hostPort: int #容器所在主机需要监听的端口号,默认与Container相同protocol: string #端口协议,支持TCP和UDP,默认TCP env: #容器运行前需要设置的环境变量列表 - name: string #环境变量名称 value: string #环境变量的值resources: #资源限制和请求的设置 limits: #资源限制的设置......

可以发现,pod的资源非常繁多,因此要一个一个记住是不现实,所以k8s提供了能够查看每种资源的配置项的命令​​​​​​​

复制代码
#kubectl explain 资源类型 #查看某种资源可以配置的一级属性#kubectl explain 资源类型.属性 #查看属性的子属性

查看pod资源的一级属性

复制代码
[root@master ~]# kubectl explain pod

03Pod之镜像拉取策略

Pod的核心是运行容器,必须指定容器引擎,比如Docker,启动容器时需要拉取镜像,k8s的镜像拉取策略可以由用户指定:

  • IfNotPresent:在镜像已经存在的情况下,kubelet将不再去拉取镜像,仅当本地缺失时才会从仓库中拉取,默认的镜像拉取策略

  • Alaways:每次创建Pod都会重新拉取一次镜像

  • Never:Pod不会主动拉取这个镜像,仅使用本地镜像

注意:对于标签为latest的镜像文件,其默认的镜像获取策略即为Always;而对于其他标签的镜像,其默认策略则为IfNotPresent。​​​​​​​

复制代码
apiVersion: v1kind: Podmetadata:name: mypodspec:containers:- name: nginximage: nginximagePullPolicy: Always

04Pod启动命令

创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数。如果要设置命令,就填写在配置文件的 command 字段下,如果要设置命令的参数,就填写在配置文件的 args 字段下。一旦 Pod 创建完成,该命令及其参数就无法再进行更改。

参数command相当于docker中的ENTRPOINT命令,args相当于docker中的CMD命令。本示例中,将创建一个只包含单个容器的 Pod。在 Pod 配置文件中设置了一个命令与两个参数:​​​​​​​

复制代码
# cat commands.yamlapiVersion: v1kind: Podmetadata:name: command-demolabels:purpose: demonstrate-commandspec:containers:- name: command-demo-containerimage: debiancommand: ["printenv"]args: ["HOSTNAME", "KUBERNETES_PORT"]restartPolicy: OnFailure

运行yaml文件并查看pod节点的日志信息​​​​​​​

复制代码
kubectl apply -f commands.yaml# kubectl get pods# kubectl logs command-demo## 日志中显示了 HOSTNAME 与 KUBERNETES_PORT 这两个环境变量的值:command-demotcp://10.3.240.1:443

如果要覆盖默认的 ENTRPOINT 与 CMD,需要遵循如下规则:

  1. 如果在容器配置中没有设置 command 或者 args,那么将使用 Docker 镜像自带的命令及其参数。

  2. 如果在容器配置中只设置了 command 但是没有设置 args,那么容器启动时只会执行该命令,Docker 镜像中自带的命令及其参数会被忽略。

  3. 如果在容器配置中只设置了 args,那么 Docker 镜像中自带的命令会使用该新参数作为其执行时的参数。

  4. 如果在容器配置中同时设置了 command 与 args,那么 Docker 镜像中自带的命令及其参数会被忽略。容器启动时只会执行配置中设置的命令,并使用配置中设置的参数作为命令的参数。

相关推荐
hi,编程哥1 小时前
Docker、ECS 与 K8s 网段冲突:解决跨服务通信中的路由问题
docker·容器·kubernetes
How_doyou_do2 小时前
项目全栈实战-基于智能体、工作流、API模块化Docker集成的创业分析平台
运维·docker·容器
代码的奴隶(艾伦·耶格尔)2 小时前
微服务!!
微服务·云原生·架构
Cloud Traveler4 小时前
Kubernetes vs. OpenShift:深入比较与架构解析
架构·kubernetes·openshift
是垚不是土5 小时前
探秘高可用负载均衡集群:企业网络架构的稳固基石
运维·服务器·网络·云原生·容器·架构·负载均衡
杰克逊的日记5 小时前
大规模k8s集群怎么规划
云原生·容器·kubernetes
luck_me56 小时前
K8S已经成为了Ai应用运行的平台工具
人工智能·容器·kubernetes
.Vcoistnt6 小时前
Codeforces Round 1024 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划·图论
大G哥7 小时前
实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API
云原生·serverless·云计算·gateway·aws
matrixlzp7 小时前
K8S Ingress、IngressController 快速开始
云原生·容器·kubernetes