Kubernetes Pod

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: Kubernetes Pod

什么是 Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod(就像在鲸鱼荚或者豌豆荚中)是一组(一个或多个)容器。这些容器共享存储、网络、以及怎样运行这些容器的声明。Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。简言之如果用 Docker 的术语来描述,Pod 类似于共享名字空间并共享文件系统卷的一组容器。

Pod 是 Kubernetes 中最小的可调度和可管理的部署单元。Pod 是一组相关的容器的抽象。通常这组容器一起运行在同一个节点上,并且共享相同的网络命名空间、存储资源和其他运行时上下文。每个 Pod 被视为一个逻辑主机,它可以包含一个或多个容器,Pod 提供容器间的协作和共享资源。

Pod 怎样管理多个容器

Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。例如,你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 ”边车“(sidercar)容器负责从远端更新这些文件,如下图所示:

Pod 天生地为其成员容器提供了两种共享资源:网络和存储。

如何使用 Pod

通常不需要直接创建 Pod,甚至单实例 Pod。相反,你会使用诸如 Deployment 或 Job 这类工作负载资源来创建 Pod。如果 Pod 需要跟踪状态,可以考虑 StatefulSet 资源。

Kubernetes 集群中的 Pod 主要有两种用法:

单容器 Pod

“每个 Pod 一个容器” 模型是最常见的 Kubernetes 用例;在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。

多容器 Pod

Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序。这些位于同一位置的容器可能形成单个内聚的服务单元。一个容器将文件从共享卷提供给公众,而另一个单独的 “边车”(sidecar)容器则刷新或更新这些文件。Pod 将这些容器和存储资源打包为一个可管理的实体。

  1. 将多个并置、同管的容器组织到一个 Pod 中是一种相对高级的使用场景。只有在一些场景中,容器之间紧密关联时你才应该使用这种模式。
  2. 每个 Pod 都旨在运行给定应用程序的单个实例。如果希望横向扩展应用程序(例如运行多个实例以提供更多的资源),则应该使用多个 Pod,每个实例使用一个 Pod。在 Kubernetes 中,这通常被称为副本(Replication)。通常使用一种工作负载资源及其控制器来创建和管理一组 Pod 副本。

Pod 基本操作命令

K8s 默认会有两个命名空间,分别是 default 和 kube-system。使用命名空间可以对 Pod 进行隔离,而且很多 K8s 的很多命令都需要使用 -n 来指定命名空间参数。

查看 Pod

官网参考地址: https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/pod-v1/

# 查看默认命名空间的 pod
kubectl get pods|pod|po
# 查看所有命名空间的 pod
$ kubectl get pods|pod -A
kubectl get pods|pod|po -n 命名空间名称
# 查看默认命名空间下 pod 的详细信息
kubectl get pods -o wide 
# 查看所有命名空间下 pod 的详细信息
kubectl get pods -o wide -A
# 实时监控 pod 的状态
kubectl get pod -w

创建 Pod

通过命令创建 Pod(不推荐)
kubectl run xw-nginx --image=nginx:1.19

上面的命令类似于 Docker 中的 docker run --name nginx nginx:1.19

通过配置文件创建 Pod(推荐)

官网参考地址: https://kubernetes.io/zh-cn/docs/reference/kubernetes-api/workload-resources/pod-v1/

下面的示例就是一个 nginx 的配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.19
      ports:
        - containerPort: 80
      imagePullPolicy: IfNotPresent
  restartPolicy: Always
  • apiVersion:使用的 api 版本,写死 v1
  • kind:创建类型,写死 Pod
  • metadata:标准的对象元数据
  • name:指定 Pod 名称
  • namespace:指定命名空间
  • spec:对 Pod 预期行为的规约
  • containers:容器
  • name:容器名称
  • image:镜像以及版本
  • ports:端口
  • imagePullPolicy:镜像下载策略,推荐使用 IfNotPersent
  • restartPolicy:容器重启策略,推荐使用 Always
通过配置文件创建 create Pod(不推荐)
kubectl create -f nginx-pod.yml

create 仅仅是不存在时创建,如果已经存在则报错!

通过配置文件创建 apply Pod(推荐)
kubectl apply -f nginx-pod.yml

使用 apply 时,重新执行并不会报错。

删除 Pod

kubectl delete pod 名称
kubectl delete -f 配置文件.yml

进入 Pod

# 进入第一个容器
kubectl exec -it <Pod名称> -- bash
# 进入指定容器
kubectl exec -it <Pod名称> -c <容器名称> -- bash
# 退出容器
exit

查看 Pod 日志

# 查看第一个容器日志
kubectl logs [-f](可选,实时) <Pod名称> --tail <行数>
# 查看指定容器日志
kubectl logs [-f](可选,实时) <Pod名称> -c <容器名称> --tail <行数>

查看 Pod 详情

kubectl describe pod <Pod名称>

Pod 运行多个容器

创建 pod

创建 myapp.yml,输入以下内容:

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
    - name: nginx
      image: nginx:1.19
      ports:
    - containerPort: 80
      imagePullPolicy: IfNotPresent
    - name: redis
      image: redis:5.0.10
      ports:
    - containerPort: 6379
      imagePullPolicy: IfNotPresent

查看容器日志

使用 apply 运行容器:

kubectl apply -f myapp.yml

# 查看容器日志
kubectl logs -f myapp -c nginx
kubectl logs -f myapp -c redis

进入容器

# 进入指定容器
kubectl exec -it myapp -c nginx -- bash
kubectl exec -it myapp -c redis -- bash

Pod 的 Labels

标签(Labels)是附加到 Kubernetes 对象(比如 Pod)上的键值对。标签旨在用于指定对用户有意义且相关的对象的标识属性。标签可以在创建时附加到对象,随后可以随时添加和修改。每个对象都可以定义一组键值标签,但是每个键对于给定对象必须是唯一的。

就是用来给 K8s 中的对象起别名, 有了别名可以过滤和筛选。

标签语法

标签由键值对组成,其有效标签值有以下约束:

  • 必须为 63 个字符或更少(可以为空)
  • 除非标签值为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾
  • 包含破折号(-)、下划线(_)、点(.)和字母或数字

标签示例

apiVersion: v1
kind: Pod
metadata:
  name: myapp
  labels:
    name: myapp # 创建时添加
spec:
  containers:
    - name: nginx
      image: nginx:1.21
      imagePullPolicy: IfNotPresent
    - name: redis
      image: redis:5.0.10
      imagePullPolicy: IfNotPresent
  restartPolicy: Always

标签基本操作

# 查看标签
kubectl get pods --show-labels
# 添加标签
kubectl label pod <Pod名称> <键>=<值>
# 覆盖标签
kubectl label --overwrite pod <Pod名称> <键>=<值>
# 删除标签 -号代表删除标签
kubectl label pod <Pod名称> <键>-
# 根据标签筛选 env=test/env  > = < 
kubectl get po -l env=test
kubectl get po -l env
kubectl get po -l '!env' # 不包含的 pod
kubectl get po -l 'env in (test,prod)' #选择含有指定值的 pod
kubectl get po -l 'env notin (test,prod)' #选择含有指定值的 pod


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 Kubernetes 调度
【赵渝强老师】什么是Kubernetes的Pod
Pod 是 Kubernetes 中的基本逻辑单位,代表集群上的一个应用实例。它可以由一个或多个容器组成,并包含数据存储和网络配置等资源。Pod 支持多种容器执行环境,如 Docker。Kubernetes 使用 Pod 管理容器,具有简化部署、方便扩展和调度管理等优点。视频讲解和图示详细介绍了 Pod 的组成结构和使用方式。
|
2月前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
2月前
|
Prometheus Kubernetes 监控
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
深入探索Kubernetes中的Pod自动扩展(Horizontal Pod Autoscaler, HPA)
|
2月前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
2月前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 &quot;busybox-container&quot; 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
2月前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
2月前
|
弹性计算 Kubernetes Perl
k8s 设置pod 的cpu 和内存
在 Kubernetes (k8s) 中,设置 Pod 的 CPU 和内存资源限制和请求是非常重要的,因为这有助于确保集群资源的合理分配和有效利用。你可以通过定义 Pod 的 `resources` 字段来设置这些限制。 以下是一个示例 YAML 文件,展示了如何为一个 Pod 设置 CPU 和内存资源请求(requests)和限制(limits): ```yaml apiVersion: v1 kind: Pod metadata: name: example-pod spec: containers: - name: example-container image:
323 1
|
2月前
|
存储 Kubernetes 调度
深入理解Kubernetes中的Pod与Container
深入理解Kubernetes中的Pod与Container
94 0
|
2月前
|
Kubernetes Java 调度
Kubernetes中的Pod垃圾回收策略是什么
Kubernetes中的Pod垃圾回收策略是什么
|
2月前
|
存储 Kubernetes 调度
深度解析Kubernetes中的Pod生命周期管理
深度解析Kubernetes中的Pod生命周期管理