kubernetes-Pod
Pod作为k8s的核心对象,所有的k8s功能都必须通过Pod来实现。
如何使用YAML描述Pod
Pod是一个API对象,它必然具有apiVersion、kind、metadata、spec这四个字段
apiVersion: v1
kind: Pod
metadata:
name: busy-pod
labels:
owner: robot
env: demo
apiVersion、kind、metadata有以上信息就足够了,metadata里应该有name和labels这两个字段。spec字段由于需要管理、维护pod这个k8s的基本调度单元,里面有非常多的关键信息。
我们在创建Pod的时候必须要有一个名字,这也是k8s里所有资源对象的一个约定。lables给Pod贴上标签,结合name就更方便识别和管理了。
spec
spec字段由于需要管理、维护Pod这个k8s的基本调度单元,里面有非常多的关键信息,这里主要说一下containers。
containers是一个数组,里面的每一个元素又是一个container对象。container对象必须有name表示名字,还有image字段来说明它使用的镜像,不然k8s会在验证时报错。
container
- name
- image
- ports:容器对外暴露端口
- imagePullPolicy:Always/Never/IfNotPresent,一般默认是IfNotPresent
- env:定义Pod的环境变量
- command:定义容器启动时要执行的命令
- args:command运行时的参数
spec:
containers:
- image: busybox:lastest
name: busy
imagePullPolicy: IfNotPresent
env:
- name: os
value: "ubuntu"
- name: debug
value: "on"
command:
- /bin/echo
args:
- "$(os), $(debug)"
如何使用kubectl操作Pod
# 创建
kubectl apply -f busy-pod.yml
# 删除
kubectl delete -f busy-pod.yml
# 通过名字删除
kubectl delete pod busy-pod
# Pod只能后台运行,查看输出信息
kubectl logs busy-pod
# 查看pod列表
kubectl get pod [-n ... 指定名字空间] [--all-namespaces 指定所有名字空间]
# 查看pod详细状态
kubectl describe pod busy-pod
# 本地文件拷贝到Pod中
kubectl cp a.txt ngx-pod:/tmp
# 进入Pod
kubectl exec -it ngx-pod -- sh
其他
- Pod内部有一个名为infra的容器,它实际上代表了Pod,维护着Pod内多容器共享的主机名、网络和存储。infra容器的镜像叫“pause”,非常小,只有不到500KB。
- 对于确实不需要重启的Pod,可以配置字段“re-startPolicy: Never”
- “kubectl get pod”的“READY”栏显示的Pod内部的容器状态,格式是“x/y”,表示Pod里总共定义了y个容器,其中x是正常的(ready)
- 准确的说“kubectl cp”,“kubectl exec”操作的应该是Pod里的容器,需要用“-c”参数指定容器名,不过因为大多数Pod里只有一个容器,所以就省略了。
少壮不努力,老大徒伤悲