管理 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将指定的envcreation_method两个标签列出来,会作为2列输出,没有打上该标签的Pod,则会显示<none>

根据标签查看Pod

主要通过-l来实现,可以从现有pods中筛选出指定标签条件下的Pods,主要可以有三种筛选方法:

  1. 包含(或不包含)使用特定键的标签;

     kubectl get pods -l creation_method
  2. 包含具有特定键和值的标签;

     kubectl get pods -l creation_method=manual
  3. 包含具有特定键的标签,但其值与我们指定的不同;

     kubectl get pods -l creation_method!=manual

同样可以使用innotin!进行匹配:

  • !creation_method,匹配不包含creation_method这个标签的Pods;

  • creation_method in (manual, half-auto),匹配带有creation_method标签,并且值为manualhalf-auto的Pods;

  • creation_method notin (manual, half-auto),匹配带有creation_method标签,但是值不是manualhalf-auto的Pods;

Tips:-L不同的是,-l得到的结果仅包含满足条件的Pods,而-L得到的是所有的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最长等待其结束的时间,如果超过该时间,则强制结束,具体可见 生命周期 一节)

Tips:可以使用kubectl explain查看配置文件中的属性的详情,会展示出对应属性的详细解释,比如查看pod下的spec中的属性详情:

kubectl explain pod.spec

删除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

有两种方式:

  1. 通过删除整个命名空间的方式,删除Pod;

  2. 仅删除Pod,不删除命名空间;

删除命名空间

可以通过删除命名空间的方式,删除这个命名空间中的所有的Pod。例如删除custom-namespace这个命名空间:

kubectl delete ns custom-namespace

保留命名空间

通过--all的方式,可以删除指定命名空间下的所有Pod。例如删除custom-namespace命名空间下的所有Pod:

kubectl delete pod --all --namespace custom-namespace

Tips:如果不指定命名空间,则默认是default命名空间。

删除命名空间中的几乎所有资源

通过all指定所有资源类型的方式,再配合--all可以删除指定的命名空间中的几乎所有资源。例如删除custom-namespace命名空间下的几乎所有资源:

kubectl delete all --all

Tips:default命名空间中,默认有一个名为kubernetes的Service资源,而使用上面的命令后,虽然会同时删除该资源,但是过几分钟会自动重新创建。

Last updated

Was this helpful?