一、基础概念
Kubernetes(k8s)中,Pod 是最小的可部署单元。它是一个由一个或多个容器组成的组。这些容器会共享网络和存储,并在同一主机上运行。Pod 提供了一种部署、扩展和管理容器的方式。
以下是关于 Kubernetes 中的 Pod 的一些重要概念:
容器共享网络和存储:
在同一个 Pod 中的容器可以通过
localhost
相互通信,它们共享相同的网络命名空间。所有容器都可以访问 Pod 共享的存储卷,这在容器之间共享数据时非常有用。
生命周期和终止:
Pod 是一个临时的、可以替换的实例。如果一个 Pod 被删除,Kubernetes 将创建一个新的 Pod 替代它。
Pod 中的容器可以通过 Kubernetes API 请求自己的终止。Kubernetes 会向 Pod 发送一个终止信号,容器在接收到信号后有一定时间来完成未完成的工作,然后正常退出。
标签和选择器:
Pod 可以使用标签进行标识和选择。标签是键值对,可以附加到 Pod 上。
选择器(Selector)允许你按标签选择一组 Pod,以便进行操作,如部署、暴露服务等。
多容器 Pod:
Pod 可以包含多个容器。这些容器在同一网络命名空间中运行,共享相同的存储。
这种模式在容器之间需要共享文件或者紧密协同工作的场景中很有用。
Pod 状态和事件:
Pod 有一个状态(Pending、Running、Succeeded、Failed、Unknown),表示当前 Pod 所处的状态。
事件记录了 Pod 生命周期中的重要事件,可以用于故障排除和监控。
Pod 控制器:
Pod 通常由控制器(例如 Deployment、StatefulSet)创建和管理。这些控制器负责确保 Pod 的副本数目,支持滚动更新等功能。
生命周期钩子:
Pod 提供了生命周期钩子,允许在容器启动前或终止后运行命令。这对于执行初始化任务或清理任务非常有用。
资源和限制:
可以为 Pod 中的容器设置资源请求和限制,以确保它们得到足够的计算资源,并防止资源耗尽。
总体而言,Pod 提供了一种组织和部署容器的灵活且强大的方式。在实际应用中,通常使用 Pod 控制器(如 Deployment、StatefulSet)来管理 Pod 的创建、复制和伸缩。
二、Pod常用命令
1、查看所有pods
kubectl get pods
[root@jdmaster ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
k8s-nginx-6d779d947c-jkwh5 1/1 Running 0 26s
k8s-nginx-6d779d947c-lgbfx 1/1 Running 0 26s
复制
2、查看特定命名空间中的 Pods:
kubectl get pods -n <namespace>
替换 <namespace>
为实际的命名空间名称。
3、查看详细信息:
kubectl describe pod <pod-name>
替换 <pod-name>
为实际的 Pod 名称。这会显示有关 Pod 的详细信息,包括事件、标签和容器信息等。
4、查看 Pod 的日志:
kubectl logs <pod-name>
替换 <pod-name>
为实际的 Pod 名称。这会显示 Pod 中容器的日志。
kubectl logs k8s-nginx-6d779d947c-jkwh5
替换 <pod-name>
为实际的 Pod 名称,<container-name>
为容器名称。这对于多容器 Pod 很有用。
[root@jdmaster ~]# kubectl logs k8s-nginx-6d779d947c-jkwh5
/docker-entrypoint.sh: docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in docker-entrypoint.d/
/docker-entrypoint.sh: Launching docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh: Sourcing docker-entrypoint.d/15-local-resolvers.envsh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh: Configuration complete; ready for start up
2023/11/16 05:24:57 [notice] 1#1: using the "epoll" event method
2023/11/16 05:24:57 [notice] 1#1: nginx/1.25.3
2023/11/16 05:24:57 [notice] 1#1: built by gcc 12.2.0 (Debian 12.2.0-14)
2023/11/16 05:24:57 [notice] 1#1: OS: Linux 5.10.134-13.an8.x86_64
2023/11/16 05:24:57 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
2023/11/16 05:24:57 [notice] 1#1: start worker processes
2023/11/16 05:24:57 [notice] 1#1: start worker process 28
2023/11/16 05:24:57 [notice] 1#1: start worker process 29
复制
5、查看 Pod 内部容器的日志:
kubectl logs <pod-name> -c <container-name>
替换 <pod-name>
为实际的 Pod 名称,<container-name>
为容器名称。这对于多容器 Pod 很有用。
6、执行命令在 Pod 内部容器中
kubectl exec -it <pod-name> -- /bin/sh
这将在指定的 Pod 内部的一个容器中打开一个交互式终端。替换 <pod-name>
为实际的 Pod 名称。
7、删除 Pod:
kubectl delete pod <pod-name>
替换 <pod-name>
为要删除的 Pod 的名称。这会删除 Pod,并在需要时创建一个新的 Pod。
8、删除 Pod:
删除:kubectl delete deployment k8s-nginx
[root@jdmaster ~]# kubectl delete deployment k8s-nginx
deployment.apps "k8s-nginx" deleted
复制
强制删除:
kubectl delete pod <pod-name> --force --grace-period=0
kubectl delete pod k8s-nginx-6d779d947c-jtshd --force --grace-period=0
[root@jdmaster ~]# kubectl delete pod k8s-nginx-6d779d947c-xv22q --force --grace-period=0
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
pod "k8s-nginx-6d779d947c-xv22q" force deleted
复制
9、查看 Pod 状态:
kubectl get pods --output=custom-columns=NAME:.metadata.name,STATUS:.status.phase

[root@jdmaster ~]# kubectl get pods --output=custom-columns=NAME:.metadata.name,STATUS:.status.phase
NAME STATUS
k8s-nginx-6d779d947c-jkwh5 Running
k8s-nginx-6d779d947c-lgbfx Running
复制
10、使用标签选择 Pods:
kubectl get pods -l <label-key>=<label-value>
使用标签选择器查找具有特定标签的 Pods。替换 <label-key>
和 <label-value>
为实际的标签键和值。
