管理 Pod
在本节,将会介绍一些常用的管理pod的方式,包括查看、创建Pod等。
查看Pod
针对pod的查看可以使用命令的方式,并且导出为YAML格式,命令为:
kubectl get pods healthcheck -o yaml
healthcheck为Pod的名字
若导出为JSON格式,则使用-o json
即可。
不使用-o
则直接展示。
使用-o wide
可以展示更全的信息,比如Pod所在的Node、Pod的标签信息等。
使用--namespace
可以指定查看哪个命名空间下的Pods。
查看Pod标签
通过--show-labels
可以查看Pods的所有标签:
kubectl get pods --show-labels
如果只对某几个标签感兴趣,可以使用-L env,creation_method
将指定的env
和creation_method
两个标签列出来,会作为2列输出,没有打上该标签的Pod,则会显示<none>
。
根据标签查看Pod
主要通过-l
来实现,可以从现有pods中筛选出指定标签条件下的Pods,主要可以有三种筛选方法:
包含(或不包含)使用特定键的标签;
kubectl get pods -l creation_method
包含具有特定键和值的标签;
kubectl get pods -l creation_method=manual
包含具有特定键的标签,但其值与我们指定的不同;
kubectl get pods -l creation_method!=manual
同样可以使用in
、notin
、!
进行匹配:
!creation_method
,匹配不包含creation_method
这个标签的Pods;creation_method in (manual, half-auto)
,匹配带有creation_method
标签,并且值为manual
或half-auto
的Pods;creation_method notin (manual, half-auto)
,匹配带有creation_method
标签,但是值不是manual
或half-auto
的Pods;
多标签条件查看
通过,
分割的标签,可以同时匹配多个标签:
kubectl get pods -l creation_method=manual,env=prod
查看Pod日志
kubectl logs kubia-manual
kubia-manual是pod的名字
Pod中可能会有多个容器,此时可以使用-c
查看具体容器的日志信息:
kubectl logs kubia-manual -c kubia
kubia为容器的名字
创建Pod
创建Pod主要使用YAML配置文件创建。
使用YAML创建Pod
先给一个简单的版本:
apiVersion: v1 # 遵循的Kubernetes API版本
kind: Pod # 资源类型
metadata:
name: kubia-manual
spec:
containers:
- image: luksa/kubia # 创建容器所用的镜像
name: kubia # 容器的名称
ports: # 应用监听的端口
- containerPort: 8000
protocol: TCP
然后使用-f
根据配置文件生成指定资源:
kubectl apply -f kubia.yaml
kubia.yaml为配置文件的名字
下面给一个详细的版本:
apiVersion: v1
kind: Pod
metadata:
labels: # Pods的标签
test: healthcheck
env: prod
name: healthcheck
spec: # Pods的规格
nodeSelector: # Node选择器,将该Pod部署至包含标签gpu=true的Node上
gpu: "true"
serviceAccountName: foo # 这个Pod使用foo SA,而不是默认的SA
imagePullSecrets: # 用来从私有镜像仓库中拉取容器镜像时指定,name是Secret资源的name(需另外创建),这个Secret资源中包含了登录私有镜像仓库的登录信息
- name: mydockerhubsecret
restartPolicy: OnFailure
containers: # (必须)
- name: healthcheck
image: busybox
ports:
- containerPort: 80 # 容器暴露的Port,其实这里只是一个类似于声明的,这里即使不写,容器的应用可能也暴露该端口(也就是说只是用来给管理员看的)
hostPort: 9000 # 在宿主机上开一个真实的 9000 端口,然后通过 iptables 将其与容器的 80 端口进行映射,该端口只会处于容器被调度的宿主机上,其他宿主机上不会有,这需要与 Service 的 nodePort 进行区分
protocol: TCP
command: ["/bin/sh"] # 覆盖了DOCKERFILE中定义的ENTRYPOINT(命令)
args: # 覆盖了DOCKERFILE中定义的CMD(参数)
- -c
- sleep 10; exit 1
env: # 容器的环境变量
- name: FIRST_VAR
value: "30"
- name: SECOND_VAR
value: "$(FIRST_VAR)bar" # 在一个环境变量中引用令一个环境变量
activeDeadlineSeconds: 60 # 限制pod的运行时间,为了防止pod无休止的卡死,此处生效,会将pod退出(通俗的说,是 Pod 从创建时起,能够持续的时间,即 get pods 命令显示的最后一列的时间超过该值后,该 Pod 立刻被标记为 DeadlineExceeded,并停止运行)
terminationGracePeriodSeconds: 30 # 容器的终止宽限期(容器内进程收到结束指令,K8S最长等待其结束的时间,如果超过该时间,则强制结束,具体可见 生命周期 一节)
删除Pod
我们可以使用kubectl delete
命令删除Pod。
根据名称删除
删除名为kubia-gpu
的Pod:
kubectl delete pod kubia-gpu
删除带指定标签的Pod
可以配合-l
,使用标签选择器,删除带指定(或不带指定)标签的Pod。例如,删除带creation_method
标签,并且其值为manual
的Pods:
kubectl delete pod -l creation_method=manual
删除一个命名空间中的所有Pod
有两种方式:
通过删除整个命名空间的方式,删除Pod;
仅删除Pod,不删除命名空间;
删除命名空间
可以通过删除命名空间的方式,删除这个命名空间中的所有的Pod。例如删除custom-namespace
这个命名空间:
kubectl delete ns custom-namespace
保留命名空间
通过--all
的方式,可以删除指定命名空间下的所有Pod。例如删除custom-namespace
命名空间下的所有Pod:
kubectl delete pod --all --namespace custom-namespace
删除命名空间中的几乎所有资源
通过all
指定所有资源类型的方式,再配合--all
可以删除指定的命名空间中的几乎所有资源。例如删除custom-namespace
命名空间下的几乎所有资源:
kubectl delete all --all
Last updated
Was this helpful?