Kubernetes Pod

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,标准版 2GB
推荐场景:
搭建游戏排行榜
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 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搭建和管理企业级网站应用
相关文章
|
6天前
|
JSON Kubernetes Shell
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
【Azure K8S | AKS】在不丢失文件/不影响POD运行的情况下增加PVC的大小
|
6天前
|
Kubernetes Shell Perl
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况
|
8天前
|
Kubernetes Docker Perl
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
在K8S中,如果是因为开发写的镜像问题导致pod起不来该怎么排查?
|
8天前
|
Kubernetes 安全 Docker
在K8S中,在服务上线的时候Pod起不来怎么进行排查?
在K8S中,在服务上线的时候Pod起不来怎么进行排查?
|
8天前
|
存储 Kubernetes 调度
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
在K8S中,⼀个pod的不同container能够分开被调动到不同的节点上吗?
|
8天前
|
消息中间件 Kubernetes 容器
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
在K8S中,同⼀个Pod的不同容器互相可以访问是怎么做到的?
|
8天前
|
存储 Kubernetes 数据中心
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
在K8S中,同⼀个Pod内不同容器哪些资源是共用的,哪些资源是隔离的?
|
8天前
|
Kubernetes 负载均衡 网络协议
在K8S中,Pod的探针有哪些及用途?
在K8S中,Pod的探针有哪些及用途?
|
8天前
|
Kubernetes 监控 Perl
在K8S中,Pod⼀直处于Init状态,如何排查?
在K8S中,Pod⼀直处于Init状态,如何排查?
|
8天前
|
Prometheus Kubernetes 监控
在K8S中,Pod处于OOM状态如何排查?
在K8S中,Pod处于OOM状态如何排查?

推荐镜像

更多
下一篇
云函数