0%

Kubernetes基本概念之Pod

这里介绍Kubernetes中基本概念——Pod

abstract.png

Pod基本操作

在Kubernetes中,Pod是能够创建、调度、管理的最小部署单元。其通常是一组容器的集合

创建Pod

这里我们可以通过YAML配置文件来进行配置、创建,如下所示。需要注意的是,在Pod的配置文件中定义容器端口纯粹是展示性的,仅便于其他人了解该容器所使用的端口信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 示例1: 创建Pod

# API 版本
apiVersion: v1
# 资源类型
kind: Pod
# Pod元数据
metadata:
# Pod 名称
name: my-bootcamp-pod-2
# Pod规格
spec:
# 容器信息
containers:
# 一个名为my-bootcamp-2的容器
- name: my-bootcamp-2
# 镜像信息
image: jocatalin/kubernetes-bootcamp:v1
# 仅用于展示容器所使用的端口
ports:
- containerPort: 8080
protocol: TCP

然后通过kubectl create -f 命令实现创建该Pod即可

figure 1.jpeg

查看Pod

kubectl提供了非常丰富的命令、选项用于查看Pod资源,具体如下所示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看全部Pod资源的描述
kubectl describe pod

# 查看指定名称的Pod资源的描述
kubectl describe pod <Pod名称>

# 查看全部Pod资源的信息
kubectl get pod

# 查看全部Pod资源的更多信息
kubectl get pod -o wide

# 以Yaml格式查看全部Pod的信息
kubectl get pod -o yaml

# 以Json格式查看全部Pod的信息
kubectl get pod -o json

# 查看指定名称的Pod资源的信息
kubectl get pod <Pod名称>

# 查看指定名称的Pod资源的信息, 并以Yaml格式展示
kubectl get pod <Pod名称> -o yaml

删除Pod

1. 按名删除

1
2
# 删除指定名称的Pod
kubectl delete pod <Pod名称>

效果如下所示

figure 2.jpeg

2. 利用标签选择器删除Pod

1
2
3
4
5
# 删除指定标签条件的Pod
kubectl delete pod -l <标签选择条件>

# 删除包含名为author的标签的Pod
kubectl delete pod -l author

效果如下所示

figure 3.jpeg

3. 删除命名空间下的所有Pod

通过—all选项实现删除命名空间下的所有Pod实例。如若未指定命名空间的名称,则删除的是默认命名空间下的所有Pod。

1
2
# 删除命名空间下的所有Pod
kubectl delete pod --all -n <命名空间的名称>

效果如下所示

figure 4.jpeg

调试Pod

查看Pod日志

可以通过kubectl logs查看Pod中容器的日志。如果一个Pod中包含多个容器时,必须使用-c选项指定相应的容器名称

1
2
3
4
5
# 查看Pod日志
kubectl logs <Pod名称>

# 查看Pod中指定容器的日志
kubectl logs <Pod名称> -c <容器名称>

效果如下所示

figure 5.jpeg

端口转发

端口转发是一种测试、调试指定Pod的有效方法。具体地,通过kubectl port-forward命令实现将本地网络端口转发到指定Pod的端口

1
kubectl port-forward <Pod名称> <本地端口>:<Pod的端口>

这样即可非常方便在宿主机发送请求HTTP请求到Pod当中。对于名为my-bootcamp-pod-2的Pod而言,其在8080端口上提供了一个HTTP服务。故我们先在左侧终端通过kubectl port-forward命令,将宿主机的12345端口映射、转发到该Pod的8080端口。然后在右侧终端利用curl命令直接访问localhost的12345端口,即可实现将请求转发至该Pod的8080端口。效果如下所示

figure 6.jpeg

端口转发的示意图如下所示。此时相信大家就不难理解了

figure 7.jpeg

在容器中执行命令

调试时,有时候我们需要进入Pod的容器中执行命令。我们可以直接通过kubectl exec对已存在Pod的容器远程执行命令

1
2
# 在指定Pod内中执行命令, -- 用于分隔kubectl exec命令、Pod容器内执行的命令
kubectl exec <Pod的名称> -- <Pod容器内执行的命令>

效果如下所示

figure 8.jpeg

如果需要执行的命令较多,我们还可以直接进入该Pod的容器来执行命令

1
2
# 进入Pod的容器
kubectl exec -it <Pod的名称> -- bash

效果如下所示

figure 9.jpeg

需要注意的是,当Pod中存在多个容器时,上述两个命令需要使用-c(或—container)选项来指定期望操作的容器

1
2
3
4
5
6
7
8
9
10
11
# 在指定Pod的指定容器中执行命令
# 形式1
kubectl exec <Pod的名称> --container <容器的名称> -- <Pod的容器内执行的命令>
# 形式2
kubectl exec <Pod的名称> -c <容器的名称> -- <Pod的容器内执行的命令>

# 进入指定Pod的指定容器
# 形式1
kubectl exec -it <Pod的名称> --container <容器的名称> -- /bin/sh
# 形式2
kubectl exec -it <Pod的名称> -c <容器的名称> -- /bin/sh

其中,该Pod中各容器的名称,可通过如下方式查看

1
2
# 查看指定Pod中各容器的名称
kubectl get pod <Pod的名称> -o jsonpath='{.spec.containers[*].name}'

参考文献

  1. Kubernetes in Action中文版 Marko Luksa著
  2. 深入剖析Kubernetes 张磊著
请我喝杯咖啡捏~
  • 本文作者: Aaron Zhu
  • 本文链接: https://xyzghio.xyz/PodInK8s/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-ND 许可协议。转载请注明出处!

欢迎关注我的微信公众号:青灯抽丝