简介

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

为什么不直接调度container

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

原理

  在同一个Pod中的容器是共用了存储、网络和命名空间的,具体实现原理如图:
pod.png

  对于容器来说,两个或多个容器想要共用一个网络,需要在启动时增加参数--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

获取帮助文档:

1
kubectl explain pod

资源清单

  资源清单就是一个符合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 # 默认为 v1,可以使用 kubectl apiversions 获取当前 k8s 版本上所有的 apiVersion 版本信息
kind: Pod #资源类别,Pod、Deployment、ConfigMap、Service等
metadata: #资源元数据
name: xx
namespace: xx
labels:
app: xxx
annotations: # 主要目的是方便用户阅读查找
xx: xx
spec: # 期望的状态(disired state)
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: # http请求方式
port: 80
path: /index.html

tcpSocket: # 端口检测方式
#监测8080端口,如果8080端口没有反馈信息,重启pod
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: # initC
- name: xxx
image: xxx
imagePullPolicy: IfNotPresent
status: # 当前状态,本字段有 Kubernetes 自身维护,用户不能去定义