k8s 多个pod容器 共享数据 k8s pod和容器_容器

Pod 概述

  • Pod:是容器的集合
  • Pod 是 Kubernetes 中的最小调度单元,一个 Pod 封装一个容器(也可以封装多个容器),Pod 里的容器共享存储、网络等。也就是说,可以把整个 pod 看作虚拟机,然后每个容器相当于运行在虚拟机的进程。
  • 同一个 pod 里的所有容器都被统一安排和调度。

  • 可以把 pod 看成是一个“豌豆荚”,里面有很多“豆子”(容器)。一个豌豆荚里的豆子,它们吸收着共同的营养成分、肥料、水分等,Pod 和容器的关系也是一样,Pod 里面的容器共享 pod 的空间、资源、网络、存储等。

k8s 多个pod容器 共享数据 k8s pod和容器_docker_02

  • 网络: 每一个 Pod 都会被指派一个唯一的 Ip 地址,在 Pod 中的每一个容器共享网络命名空间,包括 Ip 地址和网络端口。在同一个 Pod 中的容器可以通过 locahost 进行互相通信。当 Pod 中的容器需要与 Pod 外的实体进行通信时,则需要通过端口等共享的网络资源进行通信。

  • 存储: 在 Pod 中所有的容器能够访问共享存储卷,允许这些容器共享数据。

pod 是 k8s 的最小调度单元,容器包含在 pod 中,一个 pod 中有一个 pause 容器和若干个业务容器,而容器是单独的一个容器,简而言之,pod 是一组容器的集合。
pod 相当于逻辑主机,每个 pod 都有自己的 ip 地址
pod 内的容器共享相同的 ip 和端口
默认情况下,每个容器的文件系统与其他容器完全隔离


什么是 pause 容器?

每个 Pod 里运行着一个特殊的被称之为 Pause 的容器,其他容器则为业务容器,这些业务容器共享Pause 容器的网络栈和 Volume 挂载卷,因此他们之间通信和数据交换更为高效,在设计时可以充分利用这一特性将一组密切相关的服务进程放入同一个 Pod 中。同一个 Pod 里的容器之间仅需通过localhost 就能互相通信。

pod、k8s 集群和容器有什么区别?

什么是容器?
容器的定义是一个包,其中有要执行的程序及其所有依赖关系,如操作系统、代码、运行时、系统库等,所有这些都绑定在一个盒子中。运行容器化的应用程序,尤其是在生产环境中,需要进行编排。这样就可以实现批量管理容器

Docker 是容器中的代表,当 Docker 容器最早流行时,它们主要运行在一台计算机上(个人电脑),当人们清楚地认识到可以用容器代替虚拟机来运行应用程序时,它们开始在许多计算机上运行,因此就产生了管理许多容器的需要。

像 Kubernetes 这样的容器编排工具,其作用是使你能够自动化管理和调度由单个容器定义的应用程序,尤其是在微服务架构中,你可能会运行几十个或数百个,甚至数千个临时容器。对于许多团队来说,手动完成这项工作并不可取。因此需要对这些容器进行编排。

什么是 pod?
在 Kubernetes 中部署应用时,都是以 pod 进行调度的,它们基本上是单个容器的包装或房子。从某种意义上说,容器的容器。 pod 是一个逻辑包装实体,用于在 K8s 集群上执行容器。可以把每个pod 想象成一个透明的包装,为容器提供一个插槽。pod 是 Kubernetes 最小的可部署单位。pod 是一组一个或多个容器,具有共享的存储/网络资源,以及如何运行容器的规范。因此,最简单地说,pod 是一个容器如何在 ubernetes 中“用起来”的机制。

什么是集群?
集群是 Kubernetes 基本架构的核心:如果运行 Kubernetes,那么至少运行一个集群。
它们有一种共生关系:容器→pod→集群。
——容器在 pod 中逻辑化地运行;
——集群上运行一组相关或无关的 pod。pod 是集群上的一个复制单元;
——一个集群可以包含许多相关或不相关的 pod,它们分组在被称为命名空间的逻辑边界里


什么是节点?
它存在于 pod 和集群之间。在 Kubernetes 中,节点本质上是托管 pod 的机器,可以是物理机也可以是虚拟机


  • Pod 如何管理多个容器

  • 在一个 Pod 中同时运行多个容器是一种比较高级的用法,只有当你的容器需要紧密配合协作的时候才考虑用这种模式。例如,一个 pod 里有两个容器,这两个容器是共享存储卷的,有一个容器作为 web服务器运行,另一个容器是为了给 web 服务提供配置文件的,如下图所示:

k8s 多个pod容器 共享数据 k8s pod和容器_docker_03

自主式 Pod 和控制器管理的 Pod


  • 自主式 pod:
    在 k8s 中,部署 pod 的时候,基本上都是使用控制器管理,那如果不使用控制器,也可以直接定义一个 pod 资源,那么就是 pod 自己去控制自己,这样的 pod 称为自主式 pod

  • K8s 集群一个节点最多可以运行多少 pod?
    默认为110 个 可以修改为200或更多(视服务器资源决定)

如何创建一个自主式 Pod?

  • vim pod.yaml
  • 上面定义的 pod.yaml 中,kind: Pod,这就是直接定义了一个 pod 资源,就是自主式 pod

  • 更新资源清单文件
  • kubectl apply -f pod.yaml
  • 如果不小心删除这个 pod 的话,会怎么样呢?
  • kubectl delete pod tomcat-pod
  • 可以看到,把 自主式 pod 删除之后, 不会再创建一个新的 pod,而是彻底从机器上删除了,这种自主式 pod 适合测试环境或者非核心业务场景,如果生产环境用自主式 pod 部署应用,那是存在风险的,所以,平时管理 Pod 都是通过控制器去管理。

控制器管理的 Pod


  • 生产环境中可以用控制器创建和管理多个 pod。

  • 控制器在 pod 失败的情况下可以处理副本、更新以及自动修复。

  • 控制器可以指定创建的 pod 副本数,使其管理的 pod 始终维持在指定副本数量,例如,如果某个节点发生故障,则控制器会注意到该节点上的 Pod 已停止工作,并创建一个新的 pod 替换有故障的 Pod。调度程序将替换的 Pod 放置到健康的节点上。

可以使用 Deployment、Statefulset、Daemonset、Job 等控制器管理 pod


  • 如何通过控制器管理 Pod?

  • 控制器是通过创建 pod 模板来创建和管理 pod 的,PodTemplate 是用于创建 pod 的规范,并且包含在 Deployment 等控制器中。每个控制器使用自己内部的 Pod 模板来创建实际的 Pod。

通过 Deployment 创建一个 pod 资源

  • vim deployment.yaml
  • kubectl apply -f deployment.yaml
  • 看到创建 deployment 资源的时候,会生成 rs 和相应的 pod
  • 假如误删除其中一个 pod:nginx-test-544744fc75-ssvpj
  • kubectl delete pods nginx-test-544744fc75-ssvpj
  • 通过上面可以发现,删除一个 pod 之后,控制器会自动生成一个新的 pod

如果创建失败,检查你的计算节点上是否有 相应的 image

k8s 多个pod容器 共享数据 k8s pod和容器_docker_04

k8s 多个pod容器 共享数据 k8s pod和容器_k8s 多个pod容器 共享数据_05

 注意如果删除了 Deployment,那么相应的pod也会自动删除,操作的时候要谨慎!!!

k8s 多个pod容器 共享数据 k8s pod和容器_kubernetes_06


Pod 资源清单的定义方法


  • pod 资源清单配置基础

  • 在创建 pod 的时候,可以通过写资源清单文件去实现,Pod 资源清单文件中有几个重要的部分:apiVersion、kind、metadata、spec 以及 status,其中 apiVersion 和 kind 是比较固定的,status是运行时的状态

所以最重要的就是 metadata 和 spec 两个部分


  • 查看 pod 中包含哪些字段,可以使用 kubectl explain 命令: 

  • kubectl explain pod
      KIND:     Pod    
    VERSION:  v1  

DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.

FIELDS:
   apiVersion    <string>

  • v1  #属性名:属性值;
    v1 表示我们定义的 pod 属于 k8s 哪个 api 的版本,一般 apiversion 后面的值的格式是 group/version,如果 group 省略,表示的是核心组,那么 v1 就是核心组上的资源。
    注意:
    :是英文输入法下的
    后面要有一个空格,然后再写对应的值
  • 资源类别,注明创建的资源是什么?是创建一个 pod ?还是 service? 还是 deployment?这里不能随意定义,一般都是内建或者用户自定义,属于固定语法格式。
     
    metadata    <Object>
  • metadata 元数据,元数据下面可以定义资源的名字和所属的名称空间,以及资源的标签
  • 查看元数据下的所有子字段:(这里列出常用的字段)
  • kubectl explain pods.metadata FIELDS:
       annotations    <map[string]string>  #资源的注解
    #标签,给定义的资源打个标签 
     #名字,给定义的资源起个名字
    #创建资源的时候分配的名称空间

  •    spec    <Object>
  • spec(非常重要的字段)
    spec 中需要嵌套很多二级字段和三级字段,不同的资源类型 spec 需要嵌套的字段各不相同如果某个字段的标题属性是 require(必选字段),剩下的都是可选字段,系统会给它赋予默认值,不同的资源类型 spec 值是各不相同的,它是用户定义的期望状态。
    kubectl explain pods.spec

       containers    <[]Object> -required- #比如   containers 字段就属于 required 必须字段,还有注意后面的 - 列表对象
         List of containers belonging to the pod. Containers cannot currently be
         added or removed. There must be at least one container in a Pod. Cannot be
         updated.
  •    status    <Object> 表示当前状态,有些内嵌的字段是系统自主维护的,只读属性,不能修改
         Most recently observed status of the pod. This data may not be up to date.
         Populated by the system. Read-only. More info:

查看 k8s 中有哪些 api 版本

  • kubectl api-versions

k8s 多个pod容器 共享数据 k8s pod和容器_kubernetes_07

  • 上面可以显示 api 的群组和版本,v1 是核心群组,同一个组有很多版本,为什么分组进行管理:如果不分组,那么更新一个,所有的都更新,分组以后,某一个组改变了,只需要改变一个,其他不需要改变;分组之后同一个群组的不通版本号也能并存;因为 pod 是最核心的资源,因此属于核心群组 v1。控制器 deployment,replicatset 都属于应用程序广义的核心资源,属于 apps/v1 这个群组
  • 注:apps 有下面三个版本,v1 是表示测试通过的稳定版本,beta1 是公测版本,不稳定,有可能被改变,alpha 内测版本,不能使用
    apps/v1 
    apps/v1beta1
    apps/v1beta2

资源清单文件编写技巧


  • 在 k8s 中,我们通过资源清单文件定义资源,需要写很多字段,那这些字段需要我们都记住吗?当然不需要,我们可以通过帮助命令 kubectl explain 查看具体字段如何定义:
    #查看 pod 资源包含哪些字段
  • kubectl explain pods
    KIND: Pod
    VERSION: v1
    DESCRIPTION:
     Pod is a collection of containers that can run on a host. This resource is
     created by clients and scheduled onto hosts.
    FIELDS:
     apiVersion <string>
     kind <string>
     metadata <Object> #object 表示对象,那么说明里面会嵌套很多字段
     spec <Object>
     status <Object> #状态,不需要我们定义

查看 pod 资源中 metadata 字段如何定义


  • # kubectl explain pods.metadata
  • KIND: Pod
    VERSION: v1
    RESOURCE: metadata <Object>
    DESCRIPTION:
     Standard object's metadata. More info:
     ObjectMeta is metadata that all persisted resources must have, which
     includes all objects users must create.
    FIELDS:
     annotations <map[string]string> 
    # <string,string>表示 key 和 value 都是 String 类型的,map 表示由众多的 key/value 组成一个 json 数组

     clusterName <string>
     creationTimestamp <string>
     deletionGracePeriodSeconds <integer> #整数型
     deletionTimestamp <string>
     finalizers <[]string>
     generateName <string>
     generation <integer>
     labels <map[string]string>
     managedFields <[]Object>
    #对象列表,每个对象可以有多个字段,这个对象也可以有多个

     name <string>
     namespace <string>
     ownerReferences <[]Object>
     resourceVersion<string>
     selfLink <string>
     uid <string>

查看 pod 资源中 spec 字段如何定义


  • # kubectl explain pods.spec
    KIND: Pod
    VERSION: v1
    DESCRIPTION:
     Specification of the desired behavior of the pod. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/apiconventions.md#spec-and-status  PodSpec is a description of a pod.
    FIELDS:
     activeDeadlineSeconds <integer> #整数
     affinity <Object>
     automountServiceAccountToken <boolean>
     containers <[]Object> -required-
     dnsConfig <Object>
     dnsPolicy <string>
     enableServiceLinks <boolean>
     ephemeralContainers <[]Object>
     hostAliases<[]Object>
     hostIPC <boolean>
     hostNetwork <boolean>
     hostPID <boolean>
     hostname <string>
     imagePullSecrets <[]Object>
     initContainers <[]Object>
     nodeName <string>
     nodeSelector <map[string]string>
     overhead <map[string]string>
     preemptionPolicy <string>
     priority <integer>
     priorityClassName <string>
     readinessGates <[]Object>
     restartPolicy <string>
     runtimeClassName <string>
     schedulerName <string>
     securityContext <Object>
     serviceAccount <string>
     setHostnameAsFQDN <boolean>
     shareProcessNamespace <boolean>
     subdomain <string>
     terminationGracePeriodSeconds <integer>
     tolerations <[]Object>
     topologySpreadConstraints <[]Object>
     volumes <[]Object>

查看 pod 资源中 spec.containers 字段如何定义


  • # kubectl explain pods.spec.containers
    KIND: Pod
    VERSION: v1
    RESOURCE: containers <[]Object>
    DESCRIPTION:
     List of containers belonging to the pod. Containers cannot currently be
     added or removed. There must be at least one container in a Pod. Cannot be
     updated.
     A single application container that you want to run within a pod.
    FIELDS:
     args <[]string>
     command <[]string>
     env <[]Object>
     envFrom <[]Object>
     image <string>
     imagePullPolicy <string>
     lifecycle <Object>
     livenessProbe <Object>
     name <string> -required-
     ports <[]Object>
     readinessProbe <Object>
     resources <Object>
     securityContext <Object>
     startupProbe <Object>
     stdin <boolean>
     stdinOnce <boolean>
     terminationMessagePath <string>
     terminationMessagePolicy <string>
     tty <boolean>
     volumeDevices <[]Object>
     volumeMounts <[]Object>
     workingDir <string>

查看 pod 资源中 spec.container.ports 字段如何定义


  • # kubectl explain pods.spec.containers.ports

    KIND: Pod
    VERSION: v1
    RESOURCE: ports <[]Object>
    DESCRIPTION:
     List of ports to expose from the container. Exposing a port here gives the
     system additional information about the network connections a container
     uses, but is primarily informational. Not specifying a port here DOES NOT
     prevent that port from being exposed. Any port which is listening on the
     default "0.0.0.0" address inside a container will be accessible from the
     network. Cannot be updated.
     ContainerPort represents a network port in a single container.
    FIELDS:
     containerPort <integer> -required-
     hostIP <string>
     hostPort <integer>
     name <string>
     protocol <string>

如何创建一个 Pod 资源?

  • 创建一个 demo-pod.yaml 文件,写入如下内容
     
  • vim demo-pod.yaml
    apiVersion: v1
    kind: Pod
    metadata:
                    name: demo-pod
                    namespace: default
                    labels:
                              app: myapp
                              env: dev
    spec:
      containers:
      - name: tomcat-pod-java
        ports:
        - containerPort: 8081
        image: tomcat:8.5-jre8-alpine
        imagePullPolicy: IfNotPresent
      - name: busybox
        image: busybox:1.28
        command: ["/bin/sh","-c","sleep 3600"]

注意左对齐,同一级的必须对齐,几个空格无所谓,同一级必须保持一致数量。


  • 简单说就是要书写的字段跟上面的字段是否属于同一级别,如果是,就保持同等数量的空格,如果不是,就要回车换行同时保持最少1个空格。
  • 比如 
    apiVersion
    kind
    metadata
    spec
    都属于同一级别

  • 属于对象列表的下一级别在换行的同时要加一个 - 号来注明下面一个或者多个字段的左对齐方式。
  • 比如:
    spec:
      containers:
      - name: tomcat-pod-java
        ports:
        - containerPort: 8081
        image: tomcat:8.5-jre8-alpine
        imagePullPolicy: IfNotPresent
  • containers 是 spec 下的对象列表,里面包含多个字段,要添加containers下的字段,就要在换行后 加 - 号及一个空格来书写,前后字段书写的顺序无所谓,但是最好遵守一定的书写规则,方便阅读和查询。
  • 同理,ports 是 containers 下的对象列表,也要换行加 - 号及一个空格来书写
  • 同时还要注意 key: value 之间有一个空格 

k8s 多个pod容器 共享数据 k8s pod和容器_docker_08

创建名称空间,默认NS为 default

  • kubectl create namespace test
  • k8s 支持短写
  • kubectl get ns 同等 kubectl get namespaces

查看 pod 的详细信息

kubectl describe pods demo-pod

k8s 多个pod容器 共享数据 k8s pod和容器_docker_09

k8s 多个pod容器 共享数据 k8s pod和容器_Pod_10

k8s 多个pod容器 共享数据 k8s pod和容器_docker_11

查看 pod 中 busybox 容器的日志


  • kubectl logs demo-pod -c tomcat-pod-java

以交互式形式进入到 pod 中的 容器

  • kubectl exec -it demo-pod -c busybox -- /bin/sh

k8s 多个pod容器 共享数据 k8s pod和容器_kubernetes_12

 删除 demo-pod.yaml 中定义的资源

  • 方法一:
    # kubectl delete -f demo-pod.yaml 
    pod "demo-pod" deleted
    方法二:
    # kubectl delete pods demo-pod

k8s 多个pod容器 共享数据 k8s pod和容器_容器_13

k8s 多个pod容器 共享数据 k8s pod和容器_kubernetes_14

 pod.spec 字段详解


  • # kubectl explain pods.spec
    FIELDS:
     containers <[]Object> -required-
     List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated.
    #containers 是一个对象列表,下面的值是由多个 key:value 键值对组成的
     kubectl explain pods.spec.containers
    KIND: Pod
    VERSION: v1
    RESOURCE: containers <[]Object>
    DESCRIPTION:
     List of containers belonging to the pod. Containers cannot currently be added or removed. There must be at least one container in a Pod. Cannot be updated.
     A single application container that you want to run within a pod.
    FIELDS:
     args <[]string>
     command <[]string>
     image <string>
     imagePullPolicy <string>
     Image pull policy. One of Always, Never, IfNotPresent. Defaults to Always
     if :latest tag is specified, or IfNotPresent otherwise. Cannot be updated.
     More info:
     https://kubernetes.io/docs/concepts/containers/images#updating-images  name <string> -required- #容器的名字
    imagePullPolicy: <string> 
    #镜像拉取策略,有下面几种方式:
    Always,Never,IfNotPresent
    Always:无论本地有没有镜像,都是是到 docker hub 仓库下载
    Never:本地有镜像就用本地的,本地没有镜像就等着,不从仓库下载
    IfNotPresent:本地有镜像,就使用本地的,本地没有镜像就从仓库下载

     kubectl explain pods.spec.containers.ports
    KIND: Pod
    VERSION: v1
    RESOURCE: ports <[]Object>
    DESCRIPTION:
    FIELDS:
     containerPort <integer> -required-
     hostIP <string>
     hostPort <integer>
     name <string>
     protocol <string>
    ports 是一个对象列表,定义容器内需要暴露的端口时,可以是多个,而且每一个端口还应该有多个属性来定义,比如说端口的名称(给端口起个名字,接下来可以根据端口名称去引用它)。端口号,协议,暴露端口号只是给系统添加一个额外信息的,并不一定是真的暴露;如果我们定义这个字段,客户可以知道我们的应用程序对外提供的端口是哪些,就算是这没指定暴露的端口,pod 中的应用程序的端口也是暴露出去的。
    在 ports 字段下可以配置上面几个端口,一般我们只需要指定 containerPort(容器端口)即可;有必要的话也可以指定 name(由字母,数字或者下划线组成);protocol(默认协议是 tcp);hostIP(绑定节点 ip,这个一般不需要指定,因为 pod 调度到哪个节点我们不确定的,就没法指定节点 ip,如果要指定,只需要指定 0.0.0.0 这个 ip 即可)

    举例子说明:
    ports:
    - name: http
    containerPort:80
    - name:htpps
    containerPort:443
    #ports 是一个列表对象,下面可以有多个值,下面的值不需要缩进,前面加上-即可
    kubectl explain pods.spec.containers.command
    KIND: Pod
    VERSION: v1
    FIELD: command <[]string>
     kubectl explain pods.spec.containers.args
    KIND: Pod
    VERSION: v1
    FIELD: args <[]string>
    command :表示要运行的程序,但是不提供/bin/sh 命令行,需要我们自己指定,如果只定义了command,而没有定义 args,那么只运行 command 后面的指令,而不运行 entrypoint,cmd 等指令;如果没有提供 command,而我们 docker 镜像在制作时有 entrypoint 指定,那么它就会运行镜像里的 entrypoint 的命令;
    command:
    - "/bin/sh" #这个就是自己指定的/bin/sh
    - "-c"
    - "sleep 3600" 
    args:表示传递参数的,如果没有给 args,而我们镜像中又有 entrypoint 指令,又有 cmd 指令,那么镜像自己 cmd 指令给定的参数将作为参数传递给 entrypoint 后面的代码;如果给定了 args,那么我们镜像中 cmd 字段后面所指定的参数将不再作为参数传递,而传递的参数是 args 中所定义的内容。
    https://kubernetes.io/docs/tasks/inject-data-application/define-command-argumentcontainer 

    这个链接里列举了 command 和 args 的关系,相关的关系图如下:

    1:如果只定义了镜像里的 entrypoint,镜像里的 cmd,那么我们运行 pod 容器时使用的命令和参数就是镜像里的命令和参数
    2:如果我们定义了容器的 command,那么我们 pod 使用的命令就是 command 后面的命令
    3:如果我们只定义了 args 参数,那么我们 pod 使用的命令就是镜像的 entrypoint+args 参数
    4:如果我们定义了 command 的命令和 args 的参数,那么我们运行 pod 时使用的就是command 命令+args 参数

Pod 资源清单详细解读


  • apiVersion: v1 #版本号,例如 v1
    kind: Pod #资源类型,如 Pod
    metadata: #元数据
     name: string # Pod 名字
     namespace: string # Pod 所属的命名空间
     labels: #自定义标签
     - name: string #自定义标签名字
     annotations: #自定义注释列表
     - name: string
    spec: # Pod 中容器的详细定义
     containers: # Pod 中容器列表
     - name: string #容器名称
     image: string #容器的镜像名称
     imagePullPolicy: [Always | Never | IfNotPresent] #获取镜像的策略 Alawys 表示下载镜像 IfnotPresent 表示优先使用本地镜像,否则下载镜像,Nerver 表示仅使用本地镜像
     command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
     args: [string] #容器的启动命令参数列表
     workingDir: string #容器的工作目录
     volumeMounts: #挂载到容器内部的存储卷配置
     - name: string #引用 pod 定义的共享存储卷的名称,需用 volumes[]部分定义的的卷名
     mountPath: string #存储卷在容器内 mount 的绝对路径,应少于 512 字符
     readOnly: boolean #是否为只读模式
     ports: #需要暴露的端口库号
     - name: string #端口号名称
     containerPort: int #容器需要监听的端口号
     hostPort: int #容器所在主机需要监听的端口号,默认与 Container 相同
     protocol: string #端口协议,支持 TCP 和 UDP,默认 TCP
     env: #容器运行前需设置的环境变量列表
     - name: string #环境变量名称
     value: string #环境变量的值
     resources: #资源限制和请求的设置
     limits: #资源限制的设置
     cpu: string #cpu 的限制,单位为 core 数
     memory: string #内存限制,单位可以为 Mib/Gib
     requests: #资源请求的设置
     cpu: string #cpu 请求,容器启动的初始可用数量
     memory: string #内存请求,容器启动的初始可用内存
     livenessProbe: #对 Pod 内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有 exec、httpGet 和 tcpSocket,对一个容器只需设置其中一种方法即可
     exec: #对 Pod 容器内检查方式设置为 exec 方式
     command: [string] #exec 方式需要制定的命令或脚本
     httpGet: #对 Pod 内个容器健康检查方法设置为 HttpGet,需要制定 Path、port
     path: string
     port: number
     host: string
     scheme: string
     HttpHeaders:
     - name: string
     value: string
     tcpSocket: #对 Pod 内个容器健康检查方式设置为 tcpSocket 方式
     port: number
     initialDelaySeconds: 0 #容器启动完成后首次探测的时间,单位为秒
     timeoutSeconds: 0 #对容器健康检查探测等待响应的超时时间,单位秒,默认 1 秒
     periodSeconds: 0 #对容器监控检查的定期探测时间设置,单位秒,默认 10 秒一次
     successThreshold: 0
     failureThreshold: 0
     securityContext:
     privileged:false
     restartPolicy: [Always | Never | OnFailure]#Pod 的重启策略,Always 表示一旦不管以何种方式终止运行,kubelet 都将重启,OnFailure 表示只有 Pod 以非 0 退出码退出才重启,Nerver 表示不再重启该 Pod
     nodeSelector: obeject #设置 NodeSelector 表示将该 Pod 调度到包含这个 label 的 node上,以 key:value 的格式指定
     imagePullSecrets: #Pull 镜像时使用的 secret 名称,以 key:secretkey 格式指定
     - name: string
     hostNetwork:false #是否使用主机网络模式,默认为 false,如果设置为 true,表示使用宿主机网络
     volumes: #在该 pod 上定义共享存储卷列表
     - name: string #共享存储卷名称 (volumes 类型有很多种)
     emptyDir: {} #类型为 emtyDir 的存储卷,与 Pod 同生命周期的一个临时目录。为空值
     hostPath: string #类型为 hostPath 的存储卷,表示挂载 Pod 所在宿主机的目录
     path: string #Pod 所在宿主机的目录,将被用于同期中 mount 的目录
     secret: #类型为 secret 的存储卷,挂载集群与定义的 secre 对象到容器内部
     scretname: string 
     items: 
     - key: string
     path: string
     configMap: #类型为 configMap 的存储卷,挂载预定义的 configMap 对象到容器内部
     name: string
     items:
     - key: string
     path: string