Kubernetes Pod

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 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


相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
5天前
|
运维 Kubernetes 网络协议
Kubernetes详解(十六)——Pod容器探测
Kubernetes详解(十六)——Pod容器探测
28 1
|
6天前
|
运维 Kubernetes 网络协议
Kubernetes详解(十六)——Pod容器探测
Kubernetes详解(十六)——Pod容器探测
16 0
|
10天前
|
Kubernetes API 调度
Kubernetes详解(十五)——Pod对象创建过程
Kubernetes详解(十五)——Pod对象创建过程
24 4
|
5天前
|
运维 Kubernetes 网络协议
Kubernetes详解(十八)——Pod就绪性探针实战
Kubernetes详解(十八)——Pod就绪性探针实战
34 5
|
5天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes详解(十七)——Pod存活性探针应用实战
Kubernetes详解(十七)——Pod存活性探针应用实战
18 4
|
6天前
|
运维 Kubernetes 网络协议
Kubernetes详解(十八)——Pod就绪性探针实战
Kubernetes详解(十八)——Pod就绪性探针实战
26 3
|
6天前
|
Kubernetes 网络协议 应用服务中间件
Kubernetes详解(十七)——Pod存活性探针应用实战
Kubernetes详解(十七)——Pod存活性探针应用实战
22 3
|
7天前
|
Kubernetes API 调度
Kubernetes详解(十五)——Pod对象创建过程
Kubernetes详解(十五)——Pod对象创建过程
26 5
|
7天前
|
Kubernetes API 调度
Kubernetes详解(十四)——Pod对象生命周期
Kubernetes详解(十四)——Pod对象生命周期
16 2
|
7天前
|
Kubernetes Linux 调度
Kubernetes详解(十三)——Pod详解
Kubernetes详解(十三)——Pod详解
21 2