Kubernetes之pod

Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解 YAML语法规范;在kubernetes k8s中如何通过yaml文件创建pod,以及pod常用字段详解 阅读详情

Kubernetes之pod

在通过docker运行程序时,我们通常会制作Dockerfile文件构建镜像。也可以基于某个镜像运行容器在容器中安装组件之后,再基于容器生成镜像

使用如下命令可生成镜像,想了解更多参数请添加–help

docker build -f Dockerfile路径 -t tag名称 .

在制作好镜像之后,可以使用docker命令运行镜像。命令如下,参数含义请添加–help了解

docker run --name kubia -p 8080:8080 -d kubia

当使用docker管理部署应用时,如果应用较多、环境较多管理相当麻烦,且对于扩容、缩容、环境稳定性等也极不好处理。借助Kubernetes 容器编排我们可以方便的管理这些容器,实现高可用、动态伸缩、滚动升级等等特性

使用如下指令,通过kubectl命令运行镜像

kubectl run kubia --image=luksa/kubia --port=8080

–image=luksa/kubia指定要运行的镜像,run后指定的kubia为运行镜像产生的pod名称

可以通过如下指令查看pod列表

kubectl get pods

下面我们来详细介绍Kubernetes中pod的概念

pod介绍

Kubernetes并不会直接管理单个容器。而是以容器组的形式管理,一个pod就是一组紧密相关的容器组。通常情况下一个pod中只会有一个容器,但有些时候我们需要一些辅助容器才能完成需要提供的功能,例如docker in docker方案中我们可以在pod中运行一个官方提供的docker容器,此docker容器中包含docker服务端,我们业务容器可以通过docker客户端连接到同pod中的docker容器制作镜像

在同一个pod中运行的容器总是运行在一起,并且运行在同一个工作节点上,以及同一个Linux命名空间。每个pod就像一个独立的逻辑主机,拥有自己的IP、主机名、进程等

通过如下命令可以查看指定命名空间下的pod列表,如果不指定命名空间则查询默认命名空间下pod列表

kubectl get pods -n 命名空间

当pod久久没有达到running状态,或者出现异常时,我们可以执行如下指令查看原因

kubectl describe pod 名称 -n 命名空间

在Kubernetes中运行容器镜像其内部流程如下
在这里插入图片描述

访问pod

在pod就绪之后,我们需要访问pod,每个pod都有自己的IP地址,这个地址是集群内部的地址,如果想要外部访问pod,需要通过service资源暴露pod。我们可以通过service类型的yaml描述文件创建。也可以简单通过kubectl expose命令创建,详细的参数配置可以添加–help了解

运行如下指令暴露上面创建的pod资源

kubectl expose pod pod名称 --type=LoadBalancer --name kubia-http -n 命名空间

service type支持ClusterIP、NodePort、LoadBalancer、ExternalName。LoadBalancer类型并不是所有集群都支持,如果不支持可以使用NodePort类型暴露pod

通过如下命令可以查询指定命名空间下service资源类型

kubectl get services -n 命名空间名称

在列出的service资源列表的port列可以查看端口情况,例如8080:30545/TCP,其中8080为应用程序的容器端口,30545为映射的节点端口。可以通过节点ip:节点端口 访问应用程序

pod的必要性

多个容器单进程&单个容器多进程

如果一个应用由多个进程组成,无论通过ipc(进程间通信)还是本地存储文件进行通信,都要求这些进程运行在同一台机器上。在Kubernetes中,我们通常在容器中运行进程,由于每个容器都像一台独立的主机,因此认为在单个容器中运行多个进程是合理的,但事实恰恰相反

容器被设计为只运行单个进程。如果在单个容器中运行多个不相关进程,那么保持这些进程运行、管理他们的日志等将会是K8s的责任。例 我们需要一种在进程崩溃时能自动重启的机制。同时这些进程产生的日志都将记录到相同的标准输出中,此时我们将很难确定每个进程分别记录了什么

因此我们需要让每个进程运行在单个容器中,这也正是docker和k8s期望的方式。由于不能将多个进程放在一个容器中运行,因此我们需要一种更高级的结构来将容器绑定在一起,作为一个单元进行管理。在一个pod中,我们可以同时运行一组密切相关的进程,并为这些进程提供相同的环境,每个进程都在一个单独的容器中运行,这些进程好像全部运行在一个容器中一样,同时又保持着隔离性。这样既能全面利用容器的特性,又能使这些进程像运行在一起

同pod容器之间的部分隔离

在K8S中我们期望以容器组的维度去隔离,而不是以单个容器维度隔离。一个pod就是一组紧密相关的容器,容器组中的容器共享一些资源,但不是共享所有资源。K8S通过配置Docker来让一个pod内的所有容器共享相同的Linux命名空间,而不是每个容器都有自己的一组命名空间

pod中的容器都在相同的network和UTS命名空间运行,所以这些容器共享相同的主机名和网络接口。同时这些容器也在相同的IPC命名空间下运行,因此也能通过IPC进行通信。在新版本的Kubernetes和docker版本中,也能共享相同的PID命名空间,但默认是未开启的,如果开启则在同一pod中的任一容器可以通过ps aux看到该pod中所有容器运行的进程

容器的文件系统来自容器镜像,因此默认情况下,每个容器的文件系统与其他容器完全隔离,但可以使用Volume来在容器之间共享文件目录

容器IP和端口空间共享

同一个pod中运行的容器共享相同的网络命名空间,因此他们共享相同的IP和端口空间。如果同一个pod中的多个容器,运行的进程有绑定相同的端口号,则会出现端口冲突的问题。对于不同pod则不会有这个问题,因为每个pod都有独立的端口空间。同时一个pod中的容器也有相同的loopback网络接口,因此可以通过localhost与同一pod中的其它容器进行通信

pod间网络

K8S中所有pod都在同一个共享网络地址空间中,每个pod都可以通过其它pod的IP地址实现相互访问,它们之间没有NAT网关,不会进行网络地址转换。当两个pod彼此之间发送网络数据包时,它们都将对方的实际IP地址视为数据包中的源IP

不论两个pod是否在同一个工作节点,不论节点间的网络拓扑结构如何,pod中的容器都可以像在无网络地址转换的扁平网络中那样相互通信,每个pod都有一个K8S集群内的IP地址,pod间可以通过K8S提供的网络模型相互访问

合理规划pod

K8S中pod作为最小管理单元,尽管每个pod可以包含多个容器,但并不建议将所有应用放入同一个pod中,我们推荐将紧密相关的一组容器放入一个pod中,所谓的紧密相关是指两个容器互相依赖缺一不可,而且紧密协作,必需放在一起运行

对于一个由前端和后端数据库组成的应用程序,尽管两者之间也是紧密协作实现功能,但二者并不是必需运行在一起才行,如果我们其放入同一个pod中会导致哪些问题?

从资源利用率考虑

同一个pod中的容器总是一起运行在相同节点上,而对于由多个节点组成的K8S集群来说,这并不能最大效率的利用各节点的计算资源。合理的做法是尽量拆分到多个pod中

从扩缩容考虑

K8S中扩缩容的基本单位是pod,但不同应用服务其需求不同,扩缩容策略也不同。例如对于前端服务这种无状态的服务,对于用户访问量加大时,需要多运行些;而像后端数据库这种有状态服务,其扩容相对来说要复杂些,而且其扩容的策略也与前端不同。因此尽量拆分到多个pod中

多容器pod

如果在考虑是否需要将两个容器放到同一个pod中时,可以参考以下几点

  • 是否必须要在同一个主机上运行

  • 是否二者在一起才是一个整体,还是是相互独立的组件

  • 是否必需一起扩缩容,还是有不同的扩缩容策略

总是应该考虑在每个pod中运行一个容器,而不是多个。但如果一个应用是由一个主进程和子进程辅助完成用户需要但功能,那么他们应该放在同一个pod中,例如开发一个流水线工具,此工具需要使用docker命令制作镜像,则在pod中除流水线工具容器,还需要一个官方提供的docker命令容器,实现docker in docker

通过描述文件定义pod

在上面我们通过kubectl run命令运行快速运行了一个pod,但通过命令只能支持有限的属性。除了使用命令我们还可以通过yaml或json描述文件来管理pod,其实不只是pod,包括其他各种类型的资源都可以使用yaml或json文件描述。通过向Kubernetes REST API提供yaml或json文件即可完成对资源的创建或更新。通过描述文件管理资源还可以存储在版本系统中,充分利用版本管理工具的版本控制

要使用yaml或json描述文件定义各种资源,需要知道每种资源对象可以使用的属性,通过查看Kubernetes API
对象定义我们可以了解这些信息。我们也可以拉取Kubernetes客户端代码查看各资源对象的属性https://github.com/kubernetes/kubernetes.git

查看现有pod的描述文件

依然通过使用kubernetes get命令来获取pod的描述文件,其他类型资源也可以使用此命令获取其描述文件

kubernetes get pod pod名称 -n 命名空间 -o yaml

通过以上命令获取的pod资源描述文件包含的内容较多,但通过描述文件创建pod时并不用给出所有的字段,其中有些字段是Kubernetes设置的,比如status下的字段描述的是当前pod的状态,这些字段不需要我们设置

pod描述文件中的主要内容

不只是pod大部分Kubernetes中的资源都包含如下几部分

  • apiVersion:api版本,由分组和版本组成,例如batch/v1,当资源是核心组(core)下,则无需给出分组,例如 v1。详细参考https://kubernetes.io/zh-cn/docs/reference/using-api/

  • kind:资源类型,例如 pod

  • metadata:元数据,主要包含名称、命令空间、标签、注解、版本等信息

  • spec:包含实际内容,如容器的镜像、卷、资源需求等

  • status:资源当前运行状态信息,例如状态、内部IP等。不需要用户指定,由Kubernetes管理

通过YAML资源描述文件创建pod

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP

可以看到这里的描述文件比通过get命令获取的要简单很多

  • apiVersion:资源对象遵循Kubernetes v1版本,并且此资源是core组下的资源,大家如果想知道各资源的具体字段及版本等可以直接查看kubernetes客户端源码

  • kind:指出描述的是pod类型的资源

  • metadata.name:指定资源名称

  • spec.containers[0].image:指定拉取的镜像,这里没有指定镜像仓库,将从公共仓库 拉取

  • spec.containers[0].name:指定容器名称为kubia

  • spec.containers[0].ports[0].containerPort:指定容器的端口是8080

  • spec.containers[0].ports[0].protocol:指定容器的端口使用的协议是TCP,另外也支持UDP、SCTP

kubectl create根据描述文件创建pod

kubectl create -f 存放资源描述文件的路径 -n 命名空间

以上命令可以创建一个或多个资源,多个资源组织方式遵循yaml语法, 可以不使用-n 指定命名空间,默认为default命名空间,命名空间是对资源进行分类管理。其他kubectl命令可以产考官方文档

可以使用如下命令创建一个namespace

kubectl create namespace 命名空间名称
查询Pod描述文件

创建完pod之后可以使用上面介绍的命令获取描述文件,通过命令获取的描述文件比上面自定义的用于创建资源的描述文件要复杂很多

kubectl get pod kubia-manual -n 命名空间
查看命名空间下Pod列表

使用如下命令可以查看命名空间下所有Pod的概要信息,以列表展示

kubectl get pods -n 命名空间
查看Pod中容器日志

运行如下命令查看Pod中容器日志

kubectl logs pod名称 -n 命名空间

如果Pod中包含多个容器,则需要指定容器的名称

kubectl logs pod名称 -c 容器名称 -n 命名空间

注意:每天或每当日志文件达到10MB时,容器日志就会自动轮替,kubectl logs命令仅显示最后一次轮替后的日志条目

我们只能获取仍然存在的pod的日志,不能获取已经删除pod的日志,当pod删除时其日志也会随着删除,如果希望在pod删除之后仍然可以获取日志,则需要配置中心化的、集群范围的日志系统,将日志都存储到中心存储中

访问pod资源

上面我们介绍过使用service资源暴露pod,除此之外也可以通过ingress资源暴露服务。但在平时验证、测试时我们只想简单验证,则可以使用kubectl port-forward命令,通过端口转发的方式访问pod。在Kubernetes集群某台主机执行如下指令
在这里插入图片描述

kubectl port-forward --address 0.0.0.0 pod名称 8888:8080 -n 命名空间
  • 上述命令可以将指定命名空间下,指定pod,通过执行指令主机8888端口转发到pod 8080端口

  • –address:指定0.0.0.0表示监听主机所有地址,可以在本地浏览器通过http://主机所有IP:8888访问;也可以指定主机具体某个IP地址,可以本地浏览器通过http://指定的监听IP:8888访问;如果不指定–address,则默认为localhost,只能在执行转发指令的主机通过curl http://localhost:8888访问

除了在Kubernetes集群某台主机执行端口转发指令外,也可以先配置好本地连接目标Kubernetes集群,在本地执行命令完成端口转发
在这里插入图片描述

kubectl port-forward pod名称 8888:8080 -n 命名空间
  • 本地执行此指令后,即可在本地浏览器通过http://localhost:8888访问

标签

Kubernetes可以使用标签对资源进行管理,不只是pod资源,很多资源都可以设置标签,标签是可以附加到资源上的任意键值对。通过标签可以按照需要的维度对资源进行管理,避免资源混乱。例如可以给资源附加版本标签,标注不同版本;同时可以附加环境标签,标注资源是开发环境还是测试环境;不同资源可能对硬件要求不同,有的自需要普通磁盘,有的可能需要SSD磁盘,可以打上标签进行区别

在创建资源时可以设置标签,在更新资源时也可以设置更新标签,也可以单独附加或修改、删除标签。可以通过标签维护对资源进行查询过滤

创建Pod时指定标签

apiVersion: v1
kind: Pod
metadata:
  name: kubia-manual-labels
  labels:
    env: prod
    creation_method: manual
spec:
  containers:
  - image: luksa/kubia
    name: kubia
    ports:
    - containerPort: 8080
      protocol: TCP
  • metadata.labels:指定标签,可以指定多个,键、值可以是任意字符串。标签限制要求可查看官方文档https://kubernetes.io/zh-cn/docs/concepts/overview/working-with-objects/labels/

查看资源列表并展示标签

kubectl get pod --show-labels -n 命名空间
  • –show-labels:使用此参数,打印资源标签

通过-L选项可以指定需要展示的标签,这些标签将作为列表展示。而不是展示所有的标签

kubectl get pod -L creation_method,env -n 命名空间

修改标签

在已有资源上添加新标签可以执行如下指令

kubectl label pod pod名称 disk=ssd -n 命名空间
  • 将在pod上添加新标签disk=ssd

对于已经存在的标签可以通过如下指令更新

kubectl label --overwrite pod pod名称 env=dev -n 命名空间
  • 指定pod上的env标签将被更新为dev

删除已有标签可以执行如下指令

kubectl label pod pod名称 env- -n 命名空间
  • 指定pod上的env标签将被删除

更多kubectl label指令参数详情可以运行如下指令查看

kubectl label --help

标签选择器

上面介绍了如何查看及创建、更新、删除标签,目前可能觉得标签并没有实际用处,但配合之后讲的Kubernetes的其他知识,我们会发现标签不可或缺,在Kubernetes中有重要作用

想要对资源按标签进行检索,可以使用标签选择器,通过指定需要过滤的标签,可以检索出我们关心的资源

  • 可以检索出包含或不包含特定键的标签

  • 可以检索出特定键值对的标签

  • 可以检索出具有特定键的标签,但其值与我们指定的不同

查询具有指定键值对的Pod

kubectl get pods -l disk=ssd -n 命名空间
  • 查询出命名空间下,包含键值对disk=ssd的pod列表

查询具有指定键的Pod

kubectl get pods -l disk -n 命名空间
  • 查询出命名空间下,包含disk键的pod列表

查询没有指定键的Pod

kubectl get pods -l '!disk' -n 命名空间
  • 查询命名空间下,不包含键disk的pod列表

查询具有指定键但值不相同的Pod

kubectl get pods -l disk!=ssd -n 命名空间
  • 查询命名空间下,具有disk键但值不为ssd的pod列表

查询具有指定键并且值在某个集合范围的Pod

kubectl get pods -l 'disk in (hdd, ssd)' -n 命名空间
  • 查询命名空间下,具有disk键并且值为hdd或ssd的pod列表

查询具有指定键并且值不在某个集合范围的Pod

kubectl get pods -l 'disk notin (hdd, ssd)' -n 命名空间
  • 查询命名空间下,具有disk键但值不为hdd或ssd的pod列表

多条查询Pod

kubectl get pods -l creation_method=manual,disk=ssd -n 命名空间
  • 查询指定命名空间下,包含creation_method=manual,disk=ssd标签的pod列表。必需全部匹配筛选规则

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

在通常情况下并不关心pod会被调度到kubernetes集群的哪个工作节点,这正是Kubernetes作为一个云"操作系统"的职责,将所有节点抽象为一个大型部署平台

但在某些时候我们希望能对pod的调度做一定的指导,根据pod的特点将pod调度到最适合的节点上运行。例如pod对磁盘要求较高,希望将pod调度到SSD固态硬盘上。但并不会直接指名需要调度的节点,因为节点有可能移除,也有可能会添加新的节点,并且也违背了Kubernetes屏蔽基础设施提供同一部署平台的理念,因此会通过节点标签和节点标签选择器来完成对pod调度节点的指导。资源通过节点标签选择器描述其对节点的需求,例如需要SSD磁盘节点,而节点则通过节点标签描述自己能提供的特性,例如给节点打上SSD的标签,表示节点是SSD磁盘节点,Kubernetes可以根据资源对节点的要求,调度到满足需求的节点上

通过标签分类工作节点

标签并不是只能添加到pod上,Kubernetes中的资源都可以添加标签。在像集群添加新节点时,可以给节点附加标签,表示节点能提供的功能特性,例如新添加的节点提供SSD固态硬盘,可以给节点添加disk=SSD的标签

# 查询集群节点
kubectl get nodes

# 给节点添加disk=SSD标签
kubectl label node 节点名称 disk=SSD

# 查询节点列表并显示节点标签
kubectl get nodes --show-labels

为节点添加完标签之后,可以列出指定标签的节点列表

kubectl get nodes -l disk=SSD

也可以列出所有节点,并显示disk标签列

kubectl get nodes -L disk

将pod调度到特定节点

现在有一个pod需要在SSD固态硬盘节点上运行,因为其对硬盘读写有要求。可以在pod资源描述文件中添加节点选择器,告诉Kubernetes集群需要将pod调度到SSD节点上

apiVersion: v1
kind: Pod
metadata:
  name: kubia-ssd
spec:
  nodeSelector:
    disk: SSD
  containers:
  - image: luksa/kubia
    name: kubia

将上面pod资源描述文件放到kubia-ssd.yaml中,执行如下指令完成pod创建

# 首先创建一个命名空间,pod资源属于命名空间下的资源,如果不指定pod资源命名空间,则在default命名空间下
kubectl create namespace 命名空间

# 使用资源描述文件创建资源
kubectl create -f kubia-disk.yaml -n 命名空间名称

# 创建完pod之后,可以查看pod列表确定pod被调度到哪个节点
kubectl get pods -n 命名空间 -o wide

调度到指定的节点

查看节点所有标签时,会发现每个节点都有一个kubernetes.io/hostname标签,这个标签记录节点的名称,在同一个集群中唯一。对于需要调度到指定节点的资源可以通过节点选择指定kubernetes.io/hostname: 节点名称,将资源调度到指定节点。但如果节点处于离线状态,则会导致资源无法调度,无法运行。因此不推荐直接指定调度节点,而是描述需求,由Kubernetes集群决定调度到哪个节点

注解pod

注解与标签类似,也是键值对,但注解并不是为了保存标识信息,不能像标签一样对资源进行分组,当然也没有注解选择器。注解可以容纳更多信息,并且注解主要用于工具使用,kubernetes也会将一些注解添加到资源对象中,但如果用户想要设置自己的注解则需要自己手动添加

Kubernetes引入新特性时,通常会借助于注解。对于新功能的alpha、beta版本不会向API对象引入新的字段,而是借助于注解,但新特性变得稳定并且得到所有相关人员的认可,就会引入新的字段废弃相关注解

大量使用注解可以资源添加说明,例如指定创建对象便于使用快速知道是谁在负责

查看资源对象注解

通过kubectl get或kubectl describe指令都可以查看资源的注解信息

# 先使用ReplicationController创建pod
cat <<EOF> kubia.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: kubia
spec:
  replicas: 1
  selector:
    app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
        ports:
        - containerPort: 8080
EOF

# 执行命令创建pod
kubectl create -f kubia.yaml -n 命名空间

kubectl get pod pod名称 -n 命名空间 -o yaml
  • 在获取的yaml描述文件中,metadata.annotations下有很多kubernetes自动添加的注解

  • 对于1.8之前版本的Kubernetes可以看到kubernetes.io/created-by的注解,此注解记录了创建pod的来源,例如上面pod来源是ReplicationController资源,及其信息。通常标签会简短一些,而注解则可以包含更多的信息,但最多不超过256KB

  • 对于1.9版本之后的Kubernetes已经将kubernetes.io/created-by注解内容放到metadata.ownerReferences下,作为字段显示,注解中已被移除

添加和修改注解

注解既可以在创建资源时添加,也可以在之后单独添加或修改

kubectl annotate pod pod名称 aim.com/testannotation="a b c d" -n 命名空间
  • 将在指定pod中添加aim.com/testannotation="a b c d"注解

需要修改已有注解则可以添加–overwrite参数

kubectl annotate --overwrite pod pod名称 aim.com/testannotation="a b c d e" -n 命名空间

命名空间

首先Kubernetes中的命名空间不同于Linux中的命名空间。Kubernetes中分为集群级别的资源对象,例如StorageClass不属于任何命名空间;以及命名空间级的资源对象,例如Pod、Deployment、RS、RC资源等,它们总是属于某个命名空间,如果不指定则是系统默认的命名空间,即default命名空间。那为什么需要命名空间呢?前面介绍了标签,每个资源对象都可以包含多个标签,可以从不同维度对资源进行划分,当我们不使用标签选择器时,会看到所有的对象,这些资源对象如果是同种类型的则不能取相同的名字,当我们想将资源对象进行划分成完全独立且不重叠的组时,使用标签则不能做到,并且可能我们需要在一个小组内进行资源对象的操作,因此Kubernetes通过命名空间来给资源对象添加作用域,将资源按命名空间进行分组。在部署环境时,通常会按命名空间进行划分,例如开发环境需要部署的资源对象,可以放到一个叫dev的命名空间中;测试环境需要部署的资源对象,可以放到一个叫test的命名空间下。两个环境互不影响

查询集群下命名空间及命名空间下Pod

通常一个Kubernetes集群中会创建多个命名空间,通过下面命令可以查看当前集群所有的命名空间

kubectl get namespaces
  • 在列出的命名空间列表中,可以看到default的命名空间,这个命名空间是集群部署时系统创建的。当操作命名空间级别的资源对象时如果不指定命名空间则会在default命名空间中进行

  • 除default集群创建的命名空间,kube-public、kube-system等命名空间也是集群创建的,并且在这些集群创建的命名空间里运行着集群的基础组件,例如etcd、kube-apiserver、kube-controller-manager、kube-proxy、kube-scheduler等

运行下面指令,查询指定命名空间包含哪些Pod

kubectl get pods -n kube-system
  • 列出kube-system命名空间下所有pod,其实集群中所有资源都可以使用kubectl get指令获取,只需将pods换成需要查询的资源对象的类型(kind)即可

  • kube-system是集群创建用于部署系统组件的命名空间

命名空间的意义一方面对资源进行了分组,隔离资源,同名资源可以分布在不同的命名空间;另一方面可以限制用户对某些特定资源访问,限制单个用户可用计算资源

创建命名空间

通过资源描述文件创建命名空间

cat <<EOF> namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: custom-namespace
EOF

# 执行如下指令创建命名空间
kubectl create -f namespace.yaml

通过指令创建命名空间

kubectl create namespace custom-namespace

相较于使用资源描述文件创建命名空间,使用指令更加方便。对于命名空间名称要求可以查看官方文档

使用命名空间

对于命名空间级别的资源,可以通过资源描述文件中metadata.namespace指定所属的命名空间,不同命名空间之间是隔离的,同种类型的资源可以有相同名称。也可以通过指令指定资源所属的命名空间,通常在指令结尾通过-n 命名空间名称 指定

kubectl create -f 资源描述文件路径 -n 命名空间名称
  • 执行指令将在命名空间下创建资源描述文件中定义的资源对象

在get、describe、edit、delete等指令执行命名空间级别资源时,可以通过-n指定命名空间,如果不指定将在上下文配置的默认命名空间(default)中执行。当前上下文命名空间及当前上下文都可以通过kubectl config命令进行更改

在上述所说的隔离是对命名空间下资源操作的隔离,在执行任何命名空间级别资源的操作时都应该指定命名空间。但其实不同命名空间下的资源是可以互相通信的,如果想要在命名空间维度对网络进行隔离,则需要Kubernetes使用的网络解决方案支持

管理Pod

按Pod名称删除Pod

kubectl delete pod pod名称1 pod名称2 -n 命名空间
  • 删除指定命名空间下指定名称Pod,可以指定多个pod名称

删除pod过程中,kubernetes会向进程发送一个SIGTERM信号并等待一定时间(默认30秒),使正常关闭,如果没有及时关闭,则通过SIGKILL终止该进程,为确保自己的应用进程总是正常关闭,进程需要能正确处理SIGTERM信号

使用标签选择器删除Pod

kubectl delete pod -l 标签键=标签值 -n 命名空间
  • 删除指定命名空间下包含指定标签的pod

删除命名空间及命名空间下所有资源

当不需要再使用某个命名空间时,可以直接删除命名空间,命名空间被删除时其下的所有资源也会被一起删除,所以删除命名空间需要谨慎

kubectl delete namespace 命名空间名称

删除命名空间下指定类型的所有资源对象

有些时候只想删除命名空间下指定类型的所有资源,而不是直接将命名空间删除

kubectl delete pod --all -n 命名空间
  • 将删除命名空间下所有pod

  • 需要注意的是如果pod是由deployment、RC、RS等资源派生的,当删除pod后,集群会重新创建pod以满足对副本数的设置。这时需要将派生处pod的父资源对象删除才可以

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

kubectl delete all --all -n 命名空间
  • 删除命名空间下所有类型资源对象

  • 但并非所有资源对象都会删除,Secret就不会被删除,要删除Secret资源需要明确指定才行

Kubernetes K8S之Pod生命周期与探针检测 K8S中Pod的生命周期与ExecAction、TCPSocketAction和HTTPGetAction探针检测 阅读详情

相关推荐

Kubernetes(k8s)之认识Pod

摘要:本文介绍了Kubernetes中的基本单元Pod的概念与使用方法。Pod是Kubernetes最小部署单位,封装一个或多个容器及其共享资源,包括存储、网络IP等。文章详细解析了Pod的两种使用模式(单容器和多容器)、结构定义、资源清单配置,并重点说明了镜像拉取策略(IfNotPresent/Always/Never)和容器启动命令设置规则。通过示例展示了如何通过command和args参数覆盖容器默认启动命令,为Kubernetes初学者提供了Pod基础知识的系统讲解。

m0_60889254的博客 773

k8s的pod暴露端口

1.某些场景下服务有很多端口,只需要暴露一个端口的情况下,使用Nodeport方式会把所有端口暴露出来。2.单独暴露某个pod的服务端口。

weixin_36709539的博客 987

k8s-kuboard标签配置

k8s-kuboard标签配置

anguoan的博客 588

Kubernetes:(四)常用命令

YAML,即YAMLAin’taMarkupLanguage(YAML不是一种标记语言)的递归缩写。YAML其实意思是YetAnotherMarkupLanguage(仍是一种标记语言)。它主要强度这种语言是以数据为中心,而不是以标记为中心,而像XML语言就使用了大量的标记。YAML可读性高,易于理解,用来表达数据序列化的格式。它的语法和其他高级语言类似,还可以简单表达数组、散列表,标量等数据形态。.yml,例如application.yml●port。...

ver_mouth__的博客 7660

西门子V90 PN伺服控制核心:FB284功能块详解与实战

在工业自动化中,伺服定位控制是运动控制的基础环节,其本质是PLC通过PROFINET协议与伺服驱动器实现高速、确定性数据交互。FB284作为西门子为V90 PN定制的标准化功能块,封装了GSD映射、状态机管理与周期性PDO同步机制,将底层寄存器操作抽象为高可靠调用接口。相比MOVE指令或MC_MoveAbsolute等通用方案,FB284显著降低时序错乱风险,提升多轴同步精度与故障响应能力。它广泛应用于包装、灌装、装配等中端产线,尤其适配S7-1200/1500平台下的快速部署与现场维护。本文聚焦V90 P

weixin_42696271的博客 300

告别混乱代码!在Arduino IDE中管理多文件项目的5个必备技巧

本文分享了在Arduino IDE中管理多文件项目的5个必备技巧,帮助开发者告别混乱代码。通过代码分割和模块化设计,提升编译效率、降低内存占用,并实现功能解耦。重点介绍了头文件设计、CPP文件实现、调试技巧和工业级目录结构,让你的Arduino项目像乐高积木一样清晰易维护。

fun88的博客 361

Kubernetes学习笔记-了解kubernetes机理-同节点/不同节点pod通信20220723

同节点pod通信,跨节点pod通信

wwxsoft的专栏 1448

智能车赛道识别:八邻域算法的实战解析与优化

本文深入解析了智能车赛道识别中八邻域算法的核心原理与实战优化。作为兼顾性能与稳定性的经典方案,该算法通过模拟探险家环顾八方的策略,能精准追踪弯道与直道边界。文章详细拆解了代码逻辑,并提供了边界平滑、异常处理及应对十字路口、环岛等复杂场景的关键优化策略,助力开发者提升智能车视觉系统的鲁棒性与实时性。

weixin_29228781的博客 264

cocoapods导致的符号重复问题分析和解决

xplayer工程用了Pods,xplayerdemo_pods工程引用xplayer时又用了Pods,导致如下的链接错误: duplicate symbol _OBJC_METACLASS_$_PodsDummy_Pods 如图: **********************尝试删除********************** 一种办法是把demo工程里L

龙思 1万+

【C语言学习疑难杂症】第20期:0x00007FF7F2821964处引发的异常0xC0000005写入位置 0x0000000000000

检查代码中是否存在野指针访问的情况,确保在进行写入操作之前,内存已经被正确分配或初始化,并且在使用完毕后进行了正确的释放。空指针访问:代码尝试在空指针地址(0x0000000000000000)处进行写入操作,导致访问冲突。检查代码中是否存在数组越界的情况,确保在进行写入操作之前,数组的索引值在合法范围内。检查代码中是否存在空指针访问的情况,确保在进行写入操作之前,指针已经被正确初始化。野指针访问:代码尝试在已释放或未初始化的内存地址进行写入操作,导致访问冲突。

学无止境 828

Unity GameObject 核心机制深度解析:从底层结构到工程实践

从底层机制讲透 Unity GameObject:托管壳加原生芯的双层对象模型如何制造假 null 陷阱、Transform 层级与组件通信的原理、生命周期回调的确切顺序。文章同时给出 Instantiate 成本分析与对象池等高频场景的工程实践。

游戏人生 40

k8s 重启pod_如何重启 Kubernetes 中的 Pod?

在使用 Docker 时,我们可以使用 docker restart container_id 来非常方便的重启容器,但是在 kubernetes 中并没有重启 pod 的命令。有时 Pod 意外终止时,我们希望重启 pod,来进行排障或者尝试恢复服务。这时我们会发现蛋有点疼,没有一个很直观的方式来重启 pod。这里我总结了几种重启 Pod 的方式,分两种情况讨论如何重启 K8S 中的 Pod,希...

weixin_39768917的博客 8738

《30天入门 SAP BTP 开发》教程的目录和使用说明,建议收藏

本教程分为两部分:第一部分为SAP BTP入门系列,包含从基础概念到操作步骤的系统性学习内容,建议零基础用户按顺序学习;第二部分为专题文章集合,涵盖SAP BTP的多个技术点,适合已有基础的用户按需查阅。教程包含账号申请、Global Account操作、Java应用开发、AI工具使用等丰富内容,同时解答常见问题并提供实战案例。所有文章均附带详细链接,便于读者系统学习或针对性查阅。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4410

Kubernetes(K8s)之Pod

Pod介绍 Pod是K8s的最小调度单位 内部是一组Container容器,根容器Pause和其他业务容器 拥有唯一Pod IP 小贴士: 在生产环境中,极少单独Pod的情况 一般都是使用Deployment等方式对Pod进行管理 Pod调度实例 1.编辑yaml文件 vim myweb1.yaml #添加以下内容 apiVersion: v1 #api版本 kind: Pod ...

NetRookieX的博客 2500

生成模型实战 | ProGAN详解与实现

Progressive GAN (ProGAN) 是一种通过渐进式增长网络结构来生成高分辨率、高保真图像的技术。传统 GAN 难以直接生成超过 256x256 分辨率的图像,而 ProGAN 创新性地从低分辨率开始训练生成器和判别器,逐步添加网络层以提高分辨率,直至达到1024x1024。该方法结合了像素归一化、小批次统计信息和均衡化学习率等关键技术,并使用 WGAN-GP 损失函数确保训练稳定性。ProGAN 是首个能生成1024x1024高保真人脸图像的模型,但其训练耗时较长,且对计算资源要求较高。

盼小辉丶的博客 1437

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【kubernetes】关于云原生之k8s集群的pod理论详解

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。

zzzxxx520369的博客 1446

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【Kubernetes】k8s集群Pod概述

例如:用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等。

qq_54188720的博客 1985

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

kubernetes(k8s)之pod管理

文章目录kubernetes(k8s)之pod管理及资源清单1 Pod管理2 pod的多种方式2.1 自主式的pod2.2 控制器pod(deployment模式pod)2.3 pod间相互访问2.4 外部访问集群ip2.5 pod的滚动更新和回滚 kubernetes(k8s)之pod管理及资源清单 1 Pod管理 2 pod的多种方式 2.1 自主式的pod kubectl指令集:https...

qq_36275923的博客 1014

k8s部署jenkins集群,配置集群kubernetes plugin的pod模板

填写k8s地址:https://kubernetes.default.svc.cluster.local命名空间:kubernetes-pluginJenkins地址:http://jenkins:18080Jenkins通道:jenkins:50000jenkins是容器别名。

天草二十六 2412

Kubernetes (k8s)环境重启Pod方式总结

在Kubernetes中,重启Pod需通过删除重建实现。推荐使用优雅的kubectl rollout restart命令(适用于Deployments/StatefulSets/DaemonSets),通过滚动更新减少服务中断。替代方法包括手动删除Pod或调整副本数强制重建,但可能造成服务不可用。注意:配置更新需先确保资源定义变更,重启操作依赖控制器管理,生产环境应优先选择滚动重启方式。裸Pod需直接删除后重新部署。最佳实践建议在变更前进行隔离测试。

lmzf2011的专栏 2037

【Kubernetes】k8s集群的pod基础

pod基础

weixin_68840588的博客 1049

【Kubernetes】(二)k8s基础——Node和Pod

ps:建议与【Kubernetes】2-2 结合进行理解。

lxyydh88888888的博客 1109

Kubernetes(k8s) pod 重启策略

修改静态Pod的Manifest后未自动重建,kubelet 使用inotify 机制检测 /etc/kubernetes/manifests 目录(可通过 kubelet 的 -pod-manifest-path 选项指定)中静态Pod的变化,并在文件发生变化后重新创建相应的 Pod。,且反复的重启操作的延迟时长为10s,20s,40s,80s,160s,300s,300s是最大延迟时长。在k8s集群中,当某个pod资源需要重启时,我们只会对其进行删除,由其pod控制器进行重新构建。...

weixin_56270746的博客 1万+

k8s 查看ip地址属于哪个pod_Kubernetes 服务中Pod的三种访问方式介绍

在Kubernetes 服务中创建的 Pod 对外提供网络访问的方式:直接使用Pod的IP地址和端口访问。使用与Pod绑定的ClusterIP和端口访问。使用K8S集群中的主机IP地址和端口访问。这三种情况,分别对应着K8S 服务中不同的网络设置。一、Deploy 中设置ContainerPort如果只在 Demployment 的 yaml 文件中配置ports:containerPort;不另...

weixin_39716417的博客 1569

Kubernetes—k8s集群的pod理论详解

Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能例如:用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等pause容器(基础容器/父容器/根容器)给Pod容器组做环境初始化。

aran2002的博客 1734
上一篇: Linux安装docker
下一篇: Kubernetes集群添加新集群节点
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值