涨薪技术|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 镜像中自带的命令及其参数会被忽略。容器启动时只会执行配置中设置的命令,并使用配置中设置的参数作为命令的参数。

相关推荐
悬弧23 分钟前
第2章:工作负载管理 - 可视化应用部署
kubernetes·k8s
一条懒鱼6661 小时前
K8S-Ingress资源对象
云原生·容器·kubernetes
luback1 小时前
前端对Docker简单了解
运维·docker·容器
帷幄庸者2 小时前
记一次Kubernetes“僵尸”挖矿病毒的排查与歼灭全录
云原生·容器·kubernetes
eventer1233 小时前
在国产ARM64环境下从源码编译Greptime DB及构建Docker镜像实践
数据库·docker·容器
川石课堂软件测试3 小时前
自动化测试的基本概念及常用框架
数据库·python·功能测试·测试工具·单元测试·自动化·流程图
楓叶子4 小时前
K8S部署
云原生·容器·kubernetes
川石课堂软件测试5 小时前
使用loadrunner调用mysql API进行性能测试
服务器·数据库·python·selenium·mysql·单元测试·自动化
Ribou5 小时前
LDAP安装docker版
运维·docker·容器
一只栖枝5 小时前
K8s 认证级别怎么选?适配不同运维场景
云原生·容器·kubernetes·k8s·cka