K8S 之 Pod
摘要
-
本文介绍 K8S 的 Pod,本文以 CentOS 8 为例。
Pod 介绍
-
Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。
-
Pod(就像在豌豆荚中)是一组(一个或多个) 容器,这些容器共享存储、网络、以及怎样运行这些容器的规约。
-
Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。
-
Kubernetes 集群中的 Pod 主要有两种用法:
- 运行单个容器的 Pod: "每个 Pod 一个容器"模型是最常见的 Kubernetes 用例,在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。
- 运行多个协同工作的容器的 Pod: Pod 可以封装由紧密耦合且需要共享资源的多个并置容器组成的应用,这些位于同一位置的容器构成一个内聚单元。
Pod 管理
Pod 创建
-
run
创建
1 | kubectl run nginx --image=nginx |
-
pod.yaml
文件说明
1 | apiVersion: v1 # 必填。指定使用的 API 版本,Pod 是核心资源,使用 v1 |
-
Pod 通常不是直接使用
run
创建的,而是使用工作负载资源创建的,如 Deployment, StatefulSet, DaemonSet。
1 | # 创建 Pod |
-
deployment.yaml
文件说明
1 | apiVersion: apps/v1 # 指定使用的 API 版本,这里是 apps/v1,适用于 Deployment 资源 |
小贴士
- yaml 文件中,出现了
metadata.labels
,spec.selector.matchLabels
以及template.metadata.labels
,三者是什么关系?
- metadata.labels(Deployment 的标签)
给 Deployment 本身 打的标签, 和 Pod 没有直接管理关系
常用于资源分组、查找(比如:kubectl get deploy -l app=nginx)
1 | metadata: |
-
spec.selector.matchLabels(选择器)
指定 Deployment 要管理哪些 Pod
必须精确匹配 Pod 的标签
决定 Deployment 会不会“接管”某些 Pod
1 | spec: |
-
template.metadata.labels(模板中的 Pod 标签)
Pod 模板中定义的标签
Deployment 按这个模板创建 Pod
必须与 matchLabels 完全一致,否则会报错
1 | template: |
🔁 关系图示意:
1 | Deployment |
查看 Pod
1 | # 查看 Pod,默认显示 default 命名空间下的 Pod |
查看 Pod 详情
-
当 pod 运行错误时,可以通过该命令查看 pod 的详情,找到错误原因
1 | kubectl describe pod <pod-name> |
进入容器
1 | # kubectl exec -it <pod-name> -n <namespace-name> -- <command> |
删除 Pod
1 | kubectl delete pod <pod-name> |
查看 Pod 日志
1 | kubectl logs <pod-name> |
访问 Pod
-
我们刚刚创建了一个nginx的pod,该如何访问呢?
1 | # 获取pod的ip |
-
暂时我们还不能通过节点的 IP 访问 Pod,因为 Pod 运行在容器网络中,等我后面讲解 deployment 和 service 之后,会介绍如何通过 service 访问
一个 Pod 运行多个容器
-
yaml 文件
1 | apiVersion: v1 |
-
运行 pod
1 | kubectl apply -f multi_pod.yaml |
-
查看运行结果
1 | # 这里看到,READY 里有两个,表示两个容器都运行成功 |
-
访问nginx和tomcat
1 | # 访问nginx,ngxin默认端口是80 |
-
进入容器执行命令
1 | # 进入nginx容器,-c 指定容器名称 |