简介
Pod是kubernetes集群能够调度的最小单元,Pod是容器的封装,这些容器共享存储、网络和命名空间,以及如何运行的规范。在Pod中,所有容器都被同一安排和调度,并运行在共享的上下文中。对于具体应用而言,Pod是它们的逻辑主机,Pod包含业务相关的多个应用容器。

为什么不直接调度container
如果调度的基本单元就是容器,对于一个非常简单的应用可以直接被调度使用,没有什么问题,但是实际的很多应用程序是由多个进程组成的,如果都部署到一个容器中,由于Docker管理的进程是pid=1的主进程,其他进程没办法进行管理了,而且一个容器最好只干一件事情,所以在真实的环境中不会使用这种方式。
如果将程序拆分成很多容器进行部署,就可能出现一个应用下面的关联的容器被调度到了不同的节点上,无法实现本地通信。
所以通过Pod将这些容器绑定在一起,并将他们作为一个整体进行管理,这样就可以保证这些容器始终在同一个节点上面,这也就是Pod设计的初衷。
原理
在同一个Pod中的容器是共用了存储、网络和命名空间的,具体实现原理如图:

对于容器来说,两个或多个容器想要共用一个网络,需要在启动时增加参数--net=container:目标容器名,实现网络共享。这个参数表示要和哪个容器共享网络,缺点是这个目标容器必须先启动。
Pod也是通过这种方式实现的共享,在Pod创建时第一个创建的容器就是Pause容器(因为使用的镜像是pause),全称 infrastucture container,所以也叫Infra 容器。Pod中其他容器只需要在启动时指定使用Infra容器的网络即可实现共享,多个容器之间可以通过localhost进行访问,需要注意端口号不能冲突。
默认情况下容器的文件系统是互相隔离的,要实现共享只需要在Pod的顶层声明一个Volume,然后在需要共享这个Volume的容器中声明挂载即可。
常用命令
GET命令:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| # 查看集群状态信息 kubectl cluster-info # 查看集群状态 kubectl get cs # 查看集群节点信息 kubectl get nodes # 查看集群命名空间 kubectl get ns # 查看指定命名空间的服务 kubectl get svc -n kube-system # 以纯文本输出格式列出所有 pod。 kubectl get pods # 以纯文本输出格式列出所有 pod,并包含附加信息(如节点名)。 kubectl get pods -o wide # 以纯文本输出格式列出具有指定名称的副本控制器。提示:您可以使用别名 'rc' 缩短和替换'replicationcontroller' 资源类型。 kubectl get replicationcontroller <rc-name> # 以纯文本输出格式列出所有副本控制器和服务。 kubectl get rc,services # 以纯文本输出格式列出所有守护程序集,包括未初始化的守护程序集。 kubectl get ds --include-uninitialized # 列出在节点 server01 上运行的所有 pod kubectl get pods --field-selector=spec.32 nodeName=server01
|
describe命令:
1 2 3 4 5 6 7 8 9
| # 显示名称为 <node-name> 的节点的详细信息。 kubectl describe nodes <node-name> # 显示名为 <pod-name> 的 pod 的详细信息。 kubectl describe pods/<pod-name> # 显示由名为 <rc-name> 的副本控制器管理的所有 pod 的详细信息。 # 记住:副本控制器创建的任何 pod 都以复制控制器的名称为前缀。 kubectl describe pods <rc-name> # 描述所有的 pod,不包括未初始化的 pod kubectl describe pods --include-uninitialized=false
|
delete命令:
1 2 3 4 5 6 7 8 9 10 11
| # 使用 pod.yaml 文件中指定的类型和名称删除 pod。 kubectl delete -f pod.yaml # 删除标签名= <label-name> 的所有 pod 和服务。 kubectl delete pods,services -l name=<label-name> # 删除所有具有标签名称= <label-name> 的 pod 和服务,包括未初始化的那些。 kubectl delete pods,services -l name=<label-name> --include-uninitialized # 删除所有 pod,包括未初始化的 pod。 kubectl delete pods --all
# 强制删除一个pod # --force --grace-period=0
|
进入容器:
1 2 3 4 5 6
| # 从 pod <pod-name> 中获取运行 'date' 的输出。默认情况下,输出来自第一个容器。 kubectl exec <pod-name> date # 运行输出 'date' 获取在容器的 <container-name> 中 pod <pod-name> 的输出。 kubectl exec <pod-name> -c <container-name> date # 获取一个交互 TTY 并运行 /bin/bash <pod-name >。默认情况下,输出来自第一个容器。 kubectl exec -ti <pod-name> /bin/bash
|
日志:
1 2 3 4
| # 从 pod 返回日志快照。 kubectl logs <pod-name> # 从 pod <pod-name> 开始流式传输日志。这类似于 'tail -f' Linux 命令。 kubectl logs -f <pod-name>
|
格式化输出:
1 2
| # 将pod信息格式化输出到一个yaml文件 kubectl get pod web-pod-13je7 -o yaml
|
获取帮助文档:
资源清单
资源清单就是一个符合k8s要求的yaml配置文件,用于生成各种K8s资源。
Pod的yaml格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| apiVersion: group/apiversion kind: Pod metadata: name: xx namespace: xx labels: app: xxx annotations: xx: xx spec: containers: - name: xx image: xx imagePullPolicy: IfNotPresent command: ['sh','-c','echo test'] ports: - containerPort: 80 readinessProbe: httpGet: port: 80 path: /index1.html initialDelaySeconds: 1 periodSeconds: 3 livenessProbe: exec: command: ["test","-e","/tmp/livenesspod"] httpGet: port: 80 path: /index.html tcpSocket: port: 8080 timeoutSeconds: 10 initialDelaySeconds: 1 periodSeconds: 3 lifecycle: postStart: exec: command: ['mkdir','-p','/var/k8s/index.html'] preStop: exec: command: ['rm','-f','/var/k8s/index.html'] restartPolicy: Always initContainers: - name: xxx image: xxx imagePullPolicy: IfNotPresent status:
|