k8s in action—Pod
本章用到的三个 YAML 描述文件如下:
kubia-manual.yaml
1 | apiVersion: v1 |
kubia-manual-with-labels.yaml
1 | apiVersion: v1 |
kubia-gpu.yaml
1 | apiVersion: v1 |
apiVersion 描述文件遵循什么版本的 Kubernetes API;
kind 指定资源类型,这里为 pod;
metadata 中的字段描述 pod 名称、标签、注解;
spec 中的字段描述创建容器所需要的镜像、容器名称、监听端口等。
创建 pod
使用 kubectl create -f 命令从 YAML 文件创建 pod
1 | kubectl create -f kubia-manual.yaml |
得到运行中 pod 的完整定义
1 | # YAML 格式 |
查看 pod
1 | kubectl get pods |
查看日志
1 | kubectl logs kubia-manual |
将本机的 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 | # 显示 pod 标签 |
使用标签选择器列出 pod
筛选指定值的 pod
1 | # 筛选 env 为 debug 的 pods |
使用标签和选择器约束 pod 调度
使用标签分类工作节点
1 | kubectl label node gke-kubia 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 | apiVersion: v1 |
创建资源时在 metadata.namespace 中指定资源的命名空间
1 | apiVersion: v1 |
使用 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 | # 按名称删除 pod |
k8s in action—Pod