k8s in action—Pod

本章用到的三个 YAML 描述文件如下:

kubia-manual.yaml

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual
spec:
containers:
- image: luksa/kubia
name: kubia
ports:
- containerPort: 8080
protocol: TCP

kubia-manual-with-labels.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual-v2
labels:
creation_mrthod: manual
env: prod
spec:
containers:
- image: luksa/kubia
name: kubia
ports:
- containerPort: 8080
protocol: TCP

kubia-gpu.yaml

1
2
3
4
5
6
7
8
9
10
apiVersion: v1
kind: Pod
metadata:
name: kubia-gpu
spec:
nodeSelector:
gpu: "true"
containers:
- image: luksa/kubia
name: kubia

apiVersion 描述文件遵循什么版本的 Kubernetes API;
kind 指定资源类型,这里为 pod;
metadata 中的字段描述 pod 名称、标签、注解;
spec 中的字段描述创建容器所需要的镜像、容器名称、监听端口等。

创建 pod

使用 kubectl create -f 命令从 YAML 文件创建 pod

1
kubectl create -f kubia-manual.yaml

得到运行中 pod 的完整定义

1
2
3
4
5
# YAML 格式
kubectl get pod kubia-manual -o yaml

# JSON 格式
kubectl get pod kubia-manual -o json

查看 pod

1
kubectl get pods

查看日志

1
2
3
4
kubectl logs kubia-manual

# 获取多容器 pod 的日志时指定容器名称
kubectl logs kubia-manual -c kubia

将本机的 8888 端口转发至 kubia-manual pod 的 8080 端口

1
kubectl port-forward kubia-manual 8888:8080

使用标签组织 pod

标签时可以附加到资源的任意键值对,用以选择具有该确切标签的资源。

创建带标签的 pod

1
kubectl create -f kubia-manual-with-labels.yaml

基于标签的 pod 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 显示 pod 标签
kubectl get pods --show-labels

# 只显示 env 标签
kubectl get pods -L env

# 为指定的 pod 资源添加新标签
kubectl label pod kubia-manual env=debug

# 修改标签
kubectl label pod kubia-manual env=online --overwrite=true

# - 号删除标签
kubectl label pod kubia-manual env-

使用标签选择器列出 pod

筛选指定值的 pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 筛选 env 为 debug 的 pods
kubectl get pods -l env=debug

# 筛选 creation_method 不为 manual 的 pods
kubectl get pods -l creation_method!=manual

# 筛选不含 env 标签的 pods
kubectl get pods -l '!env'

# in 筛选
kubectl get pods -l 'env in (debug)'

# not in 筛选
kubectl get pods -l 'env notin (debug,online)'

使用标签和选择器约束 pod 调度

使用标签分类工作节点

1
2
kubectl label node gke-kubia gpu=true
kubectl get nodes -l gpu=true

在 kubia-gpu.yaml 中的 spec 添加了 nodeSelector 字段。创建该 pod 时,调度器将只在包含标签 gpu=true 的节点中选择。

注解 pod

注解也是键值对,但与标签不同,不用作标识,用作资源说明,注解可以包含相对更多的数据。

使用 kubectl annotate 添加注解

1
kubectl annotate pod kubia-manual mycompany.com/someannotation="foo bar"

查看注解

1
kubectl describe pod kubia-manual

命名空间

标签会导致资源重叠,可用 namespace 将对象分配到集群级别的隔离区域,相当于多租户的概念,以 namespace 为操作单位。

获取所有 namespace

1
kubectl get ns

获取属于 kube-system 命名空间的 pod

1
kubectl get pods -n kube-system

创建 namespace 资源

1
2
3
4
apiVersion: v1
kind: Namespace
metadata:
name: custom-namespace

创建资源时在 metadata.namespace 中指定资源的命名空间

1
2
3
4
5
6
apiVersion: v1
kind: Pod
metadata:
name: kubia-manual
namespace: custom-namespace
...

使用 kubectl create 命令创建资源时指定命名空间

1
kubectl create -f kubia-manual.yaml -n custom-namespace

切换命名空间

1
kubectl config set-context $(kubectl config current-context) --namespace custom-namespace

删除 pod

删除原理:向 pod 所有容器进程定期发送 SIGTERM 信号,使其正常关闭。如果没有及时关闭,则发送 SIGKILL 强制终止。进程需要正确处理信号,如 Go 注册捕捉信号 signal.Notify() 后 select 监听该 channel。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 按名称删除 pod
kubectl delete po kubia-gpu

# 删除指定标签的 pod
kubectl delete po -l env=debug

# 通过删除整个命名空间来删除 pod
kubectl delete ns custom-namespace

# 删除当前命名空间下的所有 pod(慎用)
kubectl delete pod --all

# 删除当前命名空间的所有资源(慎用)
kubectl delete all --all
Author

王亮

Posted on

2022-01-30

Licensed under