Kubernetes之pod

news2024/12/26 3:54:47

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资源需要明确指定才行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/617676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(超超详!!)Linux进程间通信-----管道 + 共享内存详解

索引 通信背景管道匿名管道命名管道 共享内存基本概念共享内存如何管理共享内存的相关函数共享内存的删除共享内存的使用 通信背景 进程是具有独立性的,每个进程都有独立的PCB,独立的数据和数据结构,因此进程间想要交互数据,成本会非常高,但有时候需要多进程协同处理同一件事情…

java设计模式(十五)责任链模式

目录 定义模式结构角色职责代码实现适用场景优缺点 定义 责任链模式(Chain of Responsibility) 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有对象能够处理…

deque介绍

目录 简介&#xff1a; 初识deque deque的底层实现 deque插入 deque的operator[] deque的迭代器 deque的缺陷 与vector比的缺陷 与list相比的缺陷 deque的优势 简介&#xff1a; 这一节不会进行模拟实现&#xff0c;只会聊聊deque的底层 原因是我们学习deque是为了…

RabbitMQ中的AMQP协议与核心组成介绍

前言 在RabbitMQ中为了传输数据&#xff0c;使用的是基于TCP/IP协议构造的AMQP协议。RabbitMQ的核心组成部分包括&#xff1a;Server、Connection、Channel、Message、ExChange、Virtual Host、Bingings、Routing key、Queue AMQP协议 AMQP协议全称&#xff1a;Advanced Mes…

RK3588平台开发系列讲解(驱动基础篇)信号驱动 IO 实验

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、信号驱动 IO 简介二、实验程序2.1、应用程序2.2、驱动程序沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 信号驱动 IO 不需要应用程序查询设备的状态,一旦设备准备就绪,会触发 SIGIO 信号,进而调用注…

论文中文翻译——kAFL Hardware-Assisted Feedback Fuzzing for OS Kernels

本论文相关内容 论文下载地址——26th USENIX Security Symposium论文中文翻译——kAFL Hardware-Assisted Feedback Fuzzing for OS Kernels 文章目录 本论文相关内容前言kAFL&#xff1a;操作系统内核的硬件辅助反馈Fuzzing作者信息论文来源主办方信息摘要1 引言2 技术背景2…

系统U盘制作随记

随身系统U盘制作 最近花了好多时间&#xff0c;废了好多U盘才把这东西搞明白了。 主要是自己的笔记本问题比较多&#xff0c;用实验室的Hp机一下就弄好了。 用这篇博客总结一下自己&#xff0c;然后附上详细的流程以免大家踩坑。 Windows to Go 这个比较容易上手 1. 准备…

EIoT能源物联网在工厂智能照明系统改造项目的应用 安科瑞 许敏

【摘要】&#xff1a;随着物联网技术的发展&#xff0c;许多场所针对照明合理应用物联网照明系统&#xff0c;照明作为工厂的重要能耗之一&#xff0c;工厂的照明智能化控制&#xff0c;如何优化控制、提高能源的利用率&#xff0c;达到节约能源的目的。将互联网的技术应用到工…

MySQ基本操作详解

MySQL的基本操作 首先sql操作中的关键字的是大小写不敏感的&#xff0c;create 和CREATE是一样的。 1.库操作 1. 1查看数据库 show databases;show 和databases 之间有一个或者多个空格注意是databases而不是database结尾分号是英文形式&#xff0c;分号在SQL中是表示一行执…

第三节 循环结构

文章目录 1. while循环1.1 什么是循环?1.2 while 循环1.2.1 语法结构1.2.2 循环中的异类 1.3 while循环使用案例1.3.1 求1~100之间的和1.3.2 求1~100之间偶数之和1.3.3 循环中的"标志变量" 1.4 嵌套循环使用1.4.1 嵌套循环语法结构1.4.2 嵌套练习 1.5 知识扩展 --最…

Mobx+Mobx-React快速上手 简单可扩展的状态管理解决方案

Mobx是Redux之后的一个状态管理库&#xff0c;基于响应式状态管理&#xff0c;整体是一个观察者模式的架构&#xff0c;存储state的store是被观察者&#xff0c;使用store的组件是观察者。Mobx可以有多个store对象&#xff0c;store使用的state也是可以变对象&#xff0c;这些都…

LNMP架构搭建实操(终有弱水替沧海,再无相思寄巫山”大概意思就是,你会遇到很多人,但不会有人像我那么爱你了。)

文章目录 一、安装Nginx服务1.安装依赖包2.创建Nginx运行用户3.编译安装Nginx源码包4.优化路径便于使用5、添加 Nginx 系统服务 二、安装Mysql服务1.安装Mysql环境依赖包2.创建Mysql运行用户3.编译安装4.修改mysql配置文件5.更改mysql安装目录和配置文件的属主属组6.设置路径环…

【Leetcode】77 组合 | 掌握回溯的力量吧!

【1】限制&#xff1a;数字只能够使用一次。 77 组合 栗子&#xff0c;从 { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } \{1,2,3,4,5,6,7,8,9,10\} {1,2,3,4,5,6,7,8,9,10}中选择4个数&#xff1a; 选择1&#xff0c;从 { 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } \{2,3,4,5,6…

电力需求侧管理和电力负荷管理数字化解决方案 安科瑞 许敏

摘要&#xff1a;近年来全国用电负荷特别是居民用电负荷的快速增长&#xff0c;全国范围内夏季、冬季用电负荷“双峰”特征日益突出&#xff0c;恶劣气候现象多发增加了电力安全供应的压力。具有随机性、波动性、间歇性特征的可再生能源大规模接入电网对电力系统的稳定性带来新…

视频观看行为高级分析(大数据分析)

今天介绍一下我们的视频观看行为高级分析功能。 一、观看行为分析 观看行为分析&#xff0c;基于Polyv大数据分析&#xff0c;能够以秒为粒度展示观众如何观看您的视频。 视频观看热力图是单次观看行为的图形化表示&#xff0c;Polyv云点播视频的每一次播放&#xff0c;都会产…

基于jupyter的多分类问题练习

文章目录 练习3&#xff1a;多分类问题介绍1 多分类1.1 数据集1.2 数据可视化1.3 逻辑回归的向量化1.3.1 代价函数的向量化1.3.2 梯度的向量化1.3.3 正则化逻辑回归的向量化 1.4 多分类-分类器 1.5 使用分类器进行预测 总结 练习3&#xff1a;多分类问题 介绍 在本练习中&…

Leetcode周赛348

第一题&#xff1a;最小化字符串长度 思路分析 通过分析我们可以发现&#xff0c;只要存在重复的元素就可以继续进行操作所以这里本质上是一道去重的题目去重我们可以使用双指针算法和Set&#xff1b;我们选择使用Set进行去重 class Solution {public int minimizedStringLengt…

Vue2 vue-cli

安装与卸载vue脚手架 npm i -g vue/cli vue --version 查看vue脚手架版本 vue -V 查看vue脚手架版本 npm uninstall -g vue/cli 卸载 创建项目 vue create 项目名 选择项目 &#xff08;Default 为快速创建项目&#xff09; 选择最后一下&#xff0c;回车 上下键选择 Rou…

shell脚本:函数

shell脚本-函数 一、函数&#xff1a;1.定义&#xff1a;2.作用&#xff1a;3.格式&#xff1a; 二、函数传参&#xff1a;1.定义&#xff1a;2.函数变量&#xff1a;3.递归&#xff1a;4.函数库&#xff1a; 一、函数&#xff1a; 1.定义&#xff1a; &#xff08;1&#xf…

Internal error. Please report to https://jb.gg/ide/critical-startup-errors

大佬的解决方式&#xff1a;PyCharm 2023 启动报错的处理 部分同学&#xff0c;发现在安装 PyCharm 2023.1.2 以及 PyCharm 2023.2 的抢先体验版之后&#xff0c;运行的时候愣是直接弹出了类似上面的报错。 反正&#xff0c;别慌&#xff01; 是的&#xff0c;他们有 bug。 …