什么是 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 将这些容器和存储资源打包为一个可管理的实体。
- 将多个并置、同管的容器组织到一个 Pod 中是一种相对高级的使用场景。只有在一些场景中,容器之间紧密关联时你才应该使用这种模式。
- 每个 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