k8s 控制器:Replicaset 和 Deployment

2023-11-13

  • Deployment 官方文档:
    https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

  • k8s 在定义 pod 资源时,可以直接创建一个 kind:Pod 类型的自主式pod,但是这存在一个问题,假如 pod 被删除了,那这个 pod 就不能自我恢复,就会彻底被删除,线上这种情况非常危险,所以需要使用 pod 控制器
     
  • 所谓控制器就是能够管理 pod,监测 pod运行状况,当 pod 发生故障,可以自动恢复 pod。也就是说能够代我们去管理 pod 中间层,并帮助我们确保每一个 pod 资源始终处于我们所定义或者我们所期望的目标状态,一旦 pod 资源出现故障,那么
    控制器会尝试重启 pod 或者里面的容器,如果一直重启有问题的话那么它可能会基于某种策略来进行重新布派或者重新编排;如果 pod 副本数量低于用户所定义的目标数量,它也会自动补全;如果多余,也会自动终止 pod 资源。

  • Replicaset 控制器:概念、原理解读

  • Replicaset 概述
  • ReplicaSet 是 kubernetes 中的一种副本控制器,简称 rs,主要作用是控制由其管理的 pod,使pod 副本的数量始终维持在预设的个数。它的主要作用就是保证一定数量的 Pod 能够在集群中正常运行,它会持续监听这些 Pod 的运行状态,在 Pod 发生故障时重启 pod,pod 数量减少时重新运行新的Pod 副本。官方推荐不要直接使用 ReplicaSet,用 Deployments 取而代之,Deployments 是比ReplicaSet 更高级的概念,它会管理 ReplicaSet 并提供很多其它有用的特性,最重要的是Deployments 支持声明式更新,声明式更新的好处是不会丢失历史变更。所以 Deployment 控制器不直接管理 Pod 对象,而是由 Deployment 管理 ReplicaSet,再由 ReplicaSet 负责管理 Pod 对象。
  • Replicaset 工作原理:如何管理 Pod?
    Replicaset 核心作用在于代用户创建指定数量的 pod 副本,并确保 pod 副本一直处于满足用户期望的数量, 起到多退少补的作用,并且还具有自动扩容缩容等机制。
    Replicaset 控制器主要由三个部分组成:
    1、用户期望的 pod 副本数:用来定义由这个控制器管控的 pod 副本有几个
    2、标签选择器:选定哪些 pod 是自己管理的,如果通过标签选择器选到的 pod 副本数量少于我们指定的数量,需要用到下面的组件
    3、pod 资源模板:如果集群中现存的 pod 数量不够我们定义的副本中期望的数量怎么办,需要新建 pod,这就需要 pod 模板,新建的 pod 是基于模板来创建的。
  • Replicaset 资源清单文件编写技巧
  • 查看定义 Replicaset 资源需要的字段有哪些?
  • # kubectl explain rs
     

    KIND:     ReplicaSet
    VERSION:  apps/v1

    DESCRIPTION:
         ReplicaSet ensures that a specified number of pod replicas are running at
         any given time.

    FIELDS:
         apiVersion <string> #当前资源使用的 api 版本,跟 VERSION: apps/v1 保持一致
         kind <string> #资源类型,跟 KIND: ReplicaSet 保持一致
         metadata <Object> #元数据,定义 Replicaset 名字的
         spec <Object> ##定义副本数、定义标签选择器、定义 Pod 模板
         status <Object> #状态信息,不能改

  • 查看 replicaset 的 spec 字段如何定义?
     
  •  kubectl explain rs.spec
    KIND: ReplicaSet
    VERSION: apps/v1
    RESOURCE: spec <Object>
    DESCRIPTION:
     Spec defines the specification of the desired behavior of the ReplicaSet.
     More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/apiconventions.md#spec-and-status
     ReplicaSetSpec is the specification of a ReplicaSet.
    FIELDS:
     minReadySeconds <integer>
     replicas <integer> #定义的 pod 副本数,根据我们指定的值创建对应数量的 pod
     selector <Object> -required- #用于匹配 pod 的标签选择器
     template <Object> #定义 Pod 的模板,基于这个模板定义的所有 pod 是一样的
  • 查看 replicaset 的 spec.template 字段如何定义?
  • 对于 template 而言,其内部定义的就是 pod,pod 模板是一个独立的对象
  • kubectl explain rs.spec.template
    KIND: ReplicaSet
    VERSION: apps/v1
    RESOURCE: template <Object>
    DESCRIPTION:
     Template is the object that describes the pod that will be created if insufficient replicas are detected。PodTemplateSpec describes the data a pod should have when created from a template
    FIELDS:
     metadata <Object>
     spec <Object>
  •  kubectl explain rs.spec.template.spec
    通过上面可以看到,ReplicaSet 资源中有两个 spec 字段
    第一个 spec 声明的是 ReplicaSet 定义多少个 Pod 副本(默认将仅部署 1 个 Pod)、匹配 Pod 标签的选择器、创建 pod 的模板。
    第二个 spec是 spec.template.spec:主要用于 Pod 里的容器属性等配置。

    .spec.template 里的内容是声明 Pod 对象时要定义的各种属性,所以这部分也叫做 PodTemplate(Pod 模板)。还有一个值得注意的地方是:在.spec.selector 中定义的标签选择器必须能够匹配到spec.template.metadata.labels 里定义的 Pod 标签,否则 Kubernetes 将不允许创建 ReplicaSet。
  • Replicaset 使用案例-部署 Guestbook 留言板

  • vim replicaset.yaml

  •  镜像比较大,耗时有些久。

  •  资源清单详细说明
    apiVersion: apps/v1 #ReplicaSet 这个控制器属于的核心群组
    kind: ReplicaSet #创建的资源类型

    metadata:
      name: frontend #控制器的名字
      labels:
        app: guestbook
        tier: frontend
    spec:
      replicas: 3 #管理的 pod 副本数量
      selector:
      matchLabels:
      tier: frontend #管理带有 tier=frontend 标签的 pod
      template: #定义 pod 的模板

      metadata:
      labels:
        tier: frontend #pod 标签,一定要有,这样上面控制器就能找到它要管理的 pod 是哪些了
       spec:
         containers: #定义 pod 里运行的容器
         - name: php-redis #定义容器的名字

           image: yecc/gcr.io-google_samples-gb-frontend:v3
           ports: #定义端口
           - name: http #定义容器的名字
             containerPort: 80 #定义容器暴露的端口

  • Replicaset 管理 pod-扩容、缩容、更新

  • Replicaset 实现 pod 的动态扩容
  • ReplicaSet 最核心的功能是可以动态扩容和回缩,如果我们觉得两个副本太少了,想要增加,只需要修改配置文件 replicaset.yaml 里的 replicas 的值即可,原来 replicas: 3,现在变成 replicaset: 4,修改之后,执行如下命令更新:
    vim replicaset.yaml
    kubectl apply -f replicaset.yaml

  • 也可以直接编辑控制器实现扩容
    kubectl edit rs frontend #这个是我们把请求提交给了 apiserver,实时修改
     kubectl edit rs frontend
    把 spec 下的 replicas 后面的值改成 5,保存退出。
    注意是第2个spec

  • Replicaset 实现 pod 的动态缩容
    如果我们觉得 5 个 Pod 副本太多了,想要减少,只需要修改配置文件 replicaset.yaml 里的 replicas 的值即可,把 replicaset:5 变成 replicas: 2,修改之后,执行如下命令更新:
    # kubectl apply -f replicaset.yaml 
  • Replicaset 实现 pod 的更新

  • kubectl edit rs frontend
    #修改镜像 image: yecc/gcr.io-google_samples-gb-frontend:v3 变成 image: 
    ikubernetes/myapp:v2,修改之后保存退出
  •  上面可以看到镜像变成了 ikubernetes/myapp:v2,说明滚动升级成功了

    上面可以看到虽然镜像已经更新了,但是原来的 pod 使用的还是之前的镜像,新创建的 pod 才会使用最新的镜像
  • #把 10.244.61.223这个 ip 对应的 pod 删除

    重新生成了一个新的 pod:frontend-mghpv  发现新生成的 pod 的镜像已经变成了 myapp 的,说明更新完成了
  • 如果直接修改 replicaset.yaml 文件,把 image: yecc/gcr.io-google_samples-gb-frontend:v3 变成- image: ikubernetes/myapp:v2
    kubectl apply -f replicaset.yaml
    #发现原来的 pod 还是用的 frontend:v3 这个镜像,没有实现自动更新
  • 生产环境如果升级,可以删除一个 pod,观察一段时间之后没问题再删除另一个 pod,但是这样需要人工干预多次;实际生产环境一般采用蓝绿发布,原来有一个 rs1,再创建一个 rs2(控制器)通过修改 service 标签, service 可以匹配到 rs2 的控制器,这样才是蓝绿发布,这个也需要我们精心的部署规划,有一个控制器就是建立在 rs 之上完成的,叫做 Deployment

  • Deployment 控制器:概念、原理解读

  • Deployment 概述
    Deployment 是 kubernetes 中最常用的资源对象,为 ReplicaSet 和 Pod 的创建提供了一种声明式的定义方法,在 Deployment 对象中描述一个期望的状态,Deployment 控制器就会按照一定的控制速率把实际状态改成期望状态,通过定义一个 Deployment 控制器会创建一个新的 ReplicaSet 控制器,通过 ReplicaSet 创建 pod,删除 Deployment 控制器,也会删除 Deployment 控制器下对应的ReplicaSet 控制器和 pod 资源.
  • 使用 Deployment 而不直接创建 ReplicaSet 是因为 Deployment 对象拥有许多 ReplicaSet 没有的特性,例如滚动升级和回滚。

  • 扩展:声明式定义是指直接修改资源清单 yaml 文件,然后通过 kubectl apply -f 资源清单 yaml文件,就可以更改资源
    Deployment 控制器是建立在 rs 之上的一个控制器,可以管理多个 rs,每次更新镜像版本,都会生成一个新的 rs,把旧的 rs 替换掉,多个 rs 同时存在,但是只有一个 rs 运行。

 rs v1 控制三个 pod,删除一个 pod,在 rs v2 上重新建立一个,依次类推,直到全部都是由 rs v2控制,如果 rs v2 有问题,还可以回滚,Deployment 是建构在 rs 之上的,多个 rs 组成一个Deployment,但是只有一个 rs 处于活跃状态.

  • Deployment 工作原理:如何管理 rs 和 Pod?

  • Deployment 可以使用声明式定义,直接在命令行通过纯命令的方式完成对应资源版本的内容的修改,也就是通过打补丁的方式进行修改;Deployment 能提供滚动式自定义自控制的更新;对Deployment 来讲,我们在实现更新时还可以实现控制更新节奏和更新逻辑。
  • 什么叫做更新节奏和更新逻辑呢?

    比如说 Deployment 控制 5 个 pod 副本,pod 的期望值是 5 个,但是升级的时候需要额外多几个pod,那我们控制器可以控制在 5 个 pod 副本之外还能再增加几个 pod 副本;比方说能多一个,但是不能少,那么升级的时候就是先增加一个,再删除一个,增加一个删除一个,始终保持 pod 副本数是 5个;还有一种情况,最多允许多一个,最少允许少一个,也就是最多 6 个,最少 4 个,第一次加一个,删除两个,第二次加两个,删除两个,依次类推,可以自己控制更新方式,这种滚动更新需要加readinessProbe 和 livenessProbe 探测,确保 pod 中容器里的应用都正常启动了才删除之前的pod。

    启动第一步,刚更新第一批就暂停了也可以;假如目标是 5 个,允许一个也不能少,允许最多可以10 个,那一次加 5 个即可;这就是我们可以自己控制节奏来控制更新的方法。

    通过 Deployment 对象,你可以轻松的做到以下事情:
    1、创建 ReplicaSet 和 Pod
    2、滚动升级(不停止旧服务的状态下升级)和回滚应用(将应用回滚到之前的版本)
    3、平滑地扩容和缩容
    4、暂停和继续 Deployment
     
  • Deployment 资源清单文件编写技巧

  • #查看 Deployment 资源对象由哪几部分组成

    # kubectl explain deployment

    KIND: Deployment
    VERSION: apps/v1
    DESCRIPTION:
     Deployment enables declarative updates for Pods and ReplicaSets.
    FIELDS:
     apiVersion <string> #该资源使用的 api 版本
     kind <string> #创建的资源是什么?
     metadata <Object> #元数据,包括资源的名字和名称空间
     spec <Object> #定义容器的
     status <Object> #状态,不可以修改


    #查看 Deployment 下的 spec 字段

    # kubectl explain deployment.spec

    KIND: Deployment
    VERSION: apps/v1
    RESOURCE: spec <Object>
    DESCRIPTION:
     Specification of the desired behavior of the Deployment.
     DeploymentSpec is the specification of the desired behavior of the
     Deployment.
    FIELDS:
     minReadySeconds <integer>   #Kubernetes 在等待设置的时间后才进行升级,如果没有设置该值,Kubernetes 会假设该容器启动起来后就提供服务了

    paused <boolean>      #暂停,当我们更新的时候创建 pod 先暂停,不是立即更新

     progressDeadlineSeconds <integer>  # k8s 在升级过程中有可能由于各种原因升级卡住(这个时候还没有明确的升级失败),比如在拉取被墙的镜像,权限不够等错误。那么这个时候就需要有个 deadline ,在 deadline 之内如果还卡着,那么就上报这个情况,这个时候这个 Deployment 状态就被标记为False,并且注明原因。但是它并不会阻止 Deployment 继续进行卡住后面的操作。完全由用户进行控制。

     replicas <integer>      #副本数
     revisionHistoryLimit <integer>   #保留的历史版本,默认是 10
     selector <Object> -required-   #标签选择器,选择它关联的 pod
     strategy <Object>    #更新策略
     template <Object> -required #定义的 pod 模板

    #查看 Deployment 下的 spec.strategy 字段

    # kubectl explain deploy.spec.strategy


    KIND: Deployment
    VERSION: apps/v1
    RESOURCE: strategy <Object>
    DESCRIPTION:
     The deployment strategy to use to replace existing pods with new ones. DeploymentStrategy describes how to replace existing pods with new ones.
    FIELDS:
     
    rollingUpdate <Object>
     type <string>
     Type of deployment. Can be "Recreate" or "RollingUpdate". Default is RollingUpdate.
    #支持两种更新,Recreate 和 RollingUpdate

    #Recreate 是重建式更新,删除一个更新一个
    #RollingUpdate 滚动更新,定义滚动更新方式,也就是 pod 能多几个,少几个


    #查看 Deployment 下的 spec.strategy.rollingUpdate 字段

    # kubectl explain deploy.spec.strategy.rollingUpdate


    KIND: Deployment
    VERSION: apps/v1
    RESOURCE: rollingUpdate <Object>
    DESCRIPTION:
     Rolling update config params. Present only if DeploymentStrategyType =
     RollingUpdate.
     Spec to control the desired behavior of rolling update.
    FIELDS:
     
    maxSurge<string>
    #我们更新的过程当中最多允许超出的指定的目标副本数有几个;它有两种取值方式,第一种直接给定数量,第二种根据百分比,百分比表示原本是 5 个,最多可以超出 20%,那就允许多一个,最多可以超过 40%,那就允许多两个


    maxUnavailable <string>
    #最多允许几个不可用假设有 5 个副本,最多一个不可用,就表示最少有 4 个可用



    #查看 Deployment 下的 spec.template 字段
    #template 为定义 Pod 的模板,Deployment 通过模板创建 Pod


    # kubectl explain deploy.spec.template
    KIND: Deployment
    VERSION: apps/v1
    RESOURCE: template <Object>
    DESCRIPTION:
     Template describes the pods that will be created.
     PodTemplateSpec describes the data a pod should have when created from 
    a template
    FIELDS:
     
    metadata <Object> #定义模板的名字
     spec <Object> 
    deployment.spec.template 为 Pod 定义的模板,和 Pod 定义不太一样,template 中不包含 apiVersion 和 Kind 属性,要求必须有 metadata。
    deployment.spec.template.spec 为容器的属性信息,其他定义内容和 Pod 一致。


    #查看 Deployment 下的 spec.template.spec 字段

    # kubectl explain deploy.spec.template.spec

    KIND: Deployment
    VERSION: apps/v1
    RESOURCE: spec <Object>
    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> #activeDeadlineSeconds 表示 Pod 可以运行的最长时间,达到设置的该值后,Pod 会自动停止。
     affinity <Object> #定义亲和性,跟直接创建 pod 时候定义亲和性类似
     automountServiceAccountToken <boolean> #身份认证相关的
     containers <[]Object> -required- #定义容器属性
     dnsConfig<Object> #设置 Pod 的 DNS
    dnsConfig:
     nameservers:
     - 192.xxx.xxx.6
     searches:
     - xuegod.svc.cluster.local
     - my.dns.search.xuegod

     dnsPolicy <string> # dnsPolicy 决定 Pod 内预设的 DNS 配置策略
    None 无任何策略:使用自定义的策略
    Default 默认:使用宿主机的 dns 配置,/etc/resolv.conf
    ClusterFirst 集群 DNS 优先,与 Default 相反,会预先使用 kube-dns (或 CoreDNS ) 的信息当预设置参数写入到该 Pod 内的 DNS 配置。
    ClusterFirstWithHostNet 集群 DNS 优先,并伴随着使用宿主机网络:同时使用hostNetwork 与 kube-dns 作为 Pod 预设 DNS 配置。
     enableServiceLinks <boolean>

     ephemeralContainers <[]Object> #定义临时容器,临时容器与其他容器的不同之处在于,它们缺少对资源或执行的保证,并且永远不会自动重启,因此不适用于构建应用程序。临时容器使用与常规容器相同的 ContainerSpec 段进行描述,但许多字段是不相容且不允许的。临时容器没有端口配置,因此像 ports,livenessProbe,readinessProbe 这样的字
    段是不允许的。 Pod 资源分配是不可变的,因此 resources 配置是不允许的。
     

    临时容器用途:
    当由于容器崩溃或容器镜像不包含调试应用程序而导致 kubectl exec 无用时,临时容器对于交互式故障排查很有用。
     hostAliases <[]Object> #在 pod 中增加域名解析的
    hostAliases:
    – ip: "10.1.2.2"
    hostnames:
    – "mc.local"
    – "rabbitmq.local"
    – ip: "10.1.2.3"
    hostnames:
    – "redis.local"
    – "mq.local"
     hostIPC <boolean> #使用主机 IPC
     hostNetwork <boolean> #是否使用宿主机的网络
     hostPID <boolean> #可以设置容器里是否可以看到宿主机上的进程。True 可以
     hostname <string>
     imagePullSecrets <[]Object>

     initContainers <[]Object> #定义初始化容器
     nodeName <string> #定义 pod 调度到具体哪个节点上
     nodeSelector <map[string]string> #定义节点选择器
     overhead <map[string]string> #overhead 是 1.16 引入的字段,在没有引入Overhead 之前,只要一个节点的资源可用量大于等于 Pod 的 requests 时,这个 Pod 就可以被调度到这个节点上。引入 Overhead 之后,只有节点的资源可用量大于等于Overhead 加上 requests 的和时才能被调度上来。
     preemptionPolicy <string>
     priority <integer>
     priorityClassName <string>
     readinessGates <[]Object>
     
    restartPolicy <string> #Pod 重启策略
     runtimeClassName <string>
     schedulerName <string>

     securityContext <Object> #是否开启特权模式
     serviceAccount <string>
     serviceAccountName <string>
     setHostnameAsFQDN <boolean>
     shareProcessNamespace <boolean>
     subdomain <string>

     terminationGracePeriodSeconds <integer>#在真正删除容器之前,K8S 会先发终止信号(kill -15 {pid})给容器,默认 30s
     tolerations <[]Object> #定义容忍度
     topologySpreadConstraints <[]Object
     volumes <[]Object> #挂载存储卷
  • 使用 Deployment 创建一个 web 站点

  • deployment 是一个三级结构,deployment 管理 replicaset,replicaset 管理 pod
  • vim  deploy-demo.yaml

    #创建的控制器名字是 myapp-v1
    1.NAME :列出名称空间中 deployment 的名称。
    2.READY:显示 deployment 有多少副本数。它遵循 ready/desired 的模式。
    3.UP-TO-DATE: 显示已更新到所需状态的副本数。
    4.AVAILABLE: 显示你的可以使用多少个应用程序副本。
    5.AGE :显示应用程序已运行的时间。

    kubectl get rs blue-green 显示如下:
    创建的控制器名字是 myapp-v1
    #创建 deploy 的时候也会创建一个 rs(replicaset),67fd9fc9c8 这个随机数字是引用 pod的模板 template 的名字的 hash 值
    1.NAME: 列出名称空间中 ReplicaSet 资源
    2.DESIRED:显示应用程序的所需副本数,这些副本数是在创建时定义的。这是所需的状态。
    3.CURRENT: 显示当前正在运行多少个副本。
    4.READY: 显示你的用户可以使用多少个应用程序副本。
    5.AGE :显示应用程序已运行的时间。

    请注意,ReplicaSet 的名称始终设置为[DEPLOYMENT-NAME]-[RANDOM-STRING]。RANDOM-STRING 是随机生成的
  • kubectl get pods -A

    #资源清单文件详细解读
    apiVersion: apps/v1 #deployment 对应的 api 版本
    kind: Deployment #创建的资源是 deployment

    metadata:
      name: myapp-v1 #deployment 的名字
      
    namespace: blue-green #属于哪个名称空间
    spec:
      replicas: 2 #deployment 管理的 pod 副本数
      selector: #标签选择器
        matchLabels: # matchLabels 下定义的标签需要跟 template.metadata.labels 定义的标签一致
          app: myapp
          version: v1
        template:
         metadata:
           labels:
            app: myapp
            version: v1
         spec: #定义容器的属性
           containers: 
           - name: myapp
             image: janakiramm/myapp:v1 #容器使用的镜像
             imagePullPolicy: IfNotPresent #镜像拉取策略
             ports:
             - containerPort: 80 #容器里的应用的端口
  • Deployment 管理 pod-扩容、缩容、滚动更新、回滚

  • #通过 deployment 管理应用,实现扩容,把副本数变成 4
  • vim deploy-dome.yaml

    查看详细信息 
    kubectl describe deployments.apps --namespace blue-green myapp-v1
    可以使用简写 -n 指定命名空间

    #通过 deployment 管理应用,实现缩容,把副本数变成 1

    #通过 deployment 管理应用,实现滚动更新
    在一个终端窗口执行如下:
    kubectl get pod -Al app=myapp -w

    打开一个新的终端窗口更改镜像版本,按如下操作:
    把 image: janakiramm/myapp:v1 变成 image: janakiramm/myapp:v2


    pending 表示正在进行调度,ContainerCreating 表示正在创建一个 pod,running 表示运行一个 pod,running 起来一个 pod 之后再 Terminating(停掉)一个 pod,以此类推,直到所有 pod 完成滚动升级

    #上面可以看到 rs 有两个,上面那个是升级之前的,已经被停掉,但是可以随时回滚
    #查看 myapp-v1 这个控制器的历史版本

    kubectl rollout history deployment --namespace blue-green

    执行回滚操作:

    kubectl rollout history deployment --namespace blue-green

    kubectl rollout undo deployment --namespace blue-green myapp-v1 --to-revision=1


  • Deployment 资源清单详解
  • apiVersion: apps/v1
    kind: Deployment 
    metadata:
     name: portal
     namespace: ms 
    spec:
     replicas: 1
     selector:
     matchLabels:
     project: ms
     app: portal
     template:
     metadata:
     labels:
     project: ms
     app: portal
     spec:
     containers:
     - name: portal
     image: xuegod/portal:v1
     imagePullPolicy: Always
     ports:
     - protocol: TCP
     containerPort: 8080 
     resources: #资源配额
     limits: #资源限制,最多可用的 cpu 和内存

     cpu: 1
     memory: 1Gi
     requests: #最少需要多少资源才可以运行 Pod
     cpu: 0.5
     memory: 1Gi
     readinessProbe:
     tcpSocket:
     port: 8080
     initialDelaySeconds: 60
     periodSeconds: 10
     livenessProbe:
     tcpSocket:
     port: 8080
     initialDelaySeconds: 60
     periodSeconds: 10
    livenessProbe:#存活性探测,用于判断容器是否存活,即 Pod 是否为 running 状态,如果 LivenessProbe 探针探测到容器不健康,则 kubelet 将 kill 掉容器,并根据容器的重启策略是否重启。如果一个容器不包含LivenessProbe 探针,则 Kubelet 认为容器的 LivenessProbe 探针的返回值永远成功。
     tcpSocket:
     port: 8080 #检测 8080 端口是否存在
     initialDelaySeconds: 60 #Pod 启动 60s 执行第一次检查
    periodSeconds: 10 #第一次检查后每隔 10s 检查一次
     readinessProbe: #就绪性探测有时候应用程序可能暂时无法接受请求,比如 Pod 已经 Running 了,但是容器内应用程序尚未启动成功,在这种情况下,如果没有 ReadinessProbe,则 Kubernetes 认为它可以处理请求了,然而此时,我们知道程序还没启动成功是不能接收用户请求的,所以不希望 kubernetes 把请求调度给它,则使用 ReadinessProbe 探针
    ReadinessProbe 和 livenessProbe 可以使用相同探测方式,只是对 Pod 的处置方式不同 ReadinessProbe 是将 Pod IP:Port 从对应的 EndPoint 列表中删除,而 livenessProbe 则 Kill 容器并根据 Pod 的重启策略来决定作出对应的措施。ReadinessProbe 探针探测容器是否已准备就绪,如果未准备就绪则 kubernetes 不会将流量转发给此 Pod

     
    tcpSocket:
     port: 8080
     initialDelaySeconds: 60
     periodSeconds: 10
    #在 Pod 运行过程中,K8S 仍然会每隔 10s 检测 8080 端口 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s 控制器:Replicaset 和 Deployment 的相关文章

  • Kubernetes 中的暂停镜像有什么用?

    看来在 Windows 上 Kubernetes 启动了一个pause创建的每个 Pod 的图像 这个暂停图像的目的是什么 我在哪里可以找到更多有关它的文档 The pause容器是保存 Pod 网络命名空间的容器 Kubernetes 创
  • 一个持久卷是否可以被多个持久卷声明消耗?

    假设一个 PV 可以被多个 PVC 消耗并且每个 pod 实例需要一个 PVC 绑定 这样的假设是否正确 我这么问是因为我创建了一个 PV 然后创建了一个具有不同尺寸要求的 PVC 例如 kind PersistentVolume apiV
  • 将代码/文件直接注入 Google Cloud Engine 上的 Kubernetes 容器中

    如何将代码 文件直接注入 Google Cloud Engine 上的 Kubernetes 容器中 类似于使用 Docker 挂载主机文件 目录的方式 例如 docker run d name nginx p 443 443 v ngin
  • Kubernetes ConfigMap 大小限制

    Though resourceQuotas可能会限制命名空间中的配置映射的数量 是否有任何这样的选项来限制单个配置映射的大小 我不喜欢某些用户开始上传大型文本文件作为配置映射 ConfigMap etcd 支持的最大大小是多少 如果 etc
  • Kubernetes 1.8 支持的 Docker 版本

    我要将我的 Kubernetes 集群升级到该版本1 8 7 有谁知道哪个 docker 版本与其最兼容 这是我在 Kubernetes 官方页面上找到的 但我想它可能是针对最新的 k8s 版本的 1 9 在每台计算机上安装 Docker
  • Kubernetes Pod 动态环境变量

    我需要能够将自定义环境变量分配给 Pod 的每个副本 一个变量应该是一些随机的 uuid 另一个唯一的数字 怎么可能实现呢 我更愿意继续使用带有副本的 部署 如果这不是开箱即用的 如何通过自定义复制控制器 控制器管理器来实现 有没有可用的钩
  • 如何从 Kubernetes 服务背后的 HTTP 请求读取客户端 IP 地址?

    我的 Web 应用程序作为 Kubernetes pod 在 SSL 的 nginx 反向代理后面运行 代理和我的应用程序都使用 Kubernetes 服务进行负载平衡 如所述here http blog kubernetes io 201
  • 如何为容器设置正确的 cpu 毫核?

    我想要优化配置 CPU 核心 而不会分配过多或不足 如何测量给定容器所需的 CPU 毫核 它还带来了一个问题 即代理将根据 CPU 消耗将多少流量发送到任何给定的 Pod 以便我们可以最佳地使用计算 目前我发送请求并进行监控 kubectl
  • 各种 Istio 端口是如何使用的?

    Question 我正在尝试学习 Istio 并且正在设置我的 Istio Ingress Gateway 当我设置它时 有以下端口选项 如此处所示 https istio io latest docs reference config i
  • 将容器安装到部署中时如何避免“权限被拒绝”错误?

    背景 我目前正在部署阿帕奇气流 https airflow apache org 使用 Helm 使用this https github com helm charts tree master stable airflow图表 我正在使用一
  • 2 个具有共享 Redis 依赖的 Helm Chart

    目前 我有 2 个 Helm Charts Chart A 和 Chart B Chart A 和 Chart B 对 Redis 实例具有相同的依赖关系 如Chart yaml file dependencies name redis v
  • 无法使用 minikube 设置 Istio

    我按照 Istio 的官方文档为带有 minikube 的示例 bookinfo 应用程序设置了 Istio 但我得到了无法连接到服务器 net http TLS 握手超时错误 这些是我遵循的步骤 我安装了 kubectl 和 miniku
  • Kubernetes Web UI(仪表板)缺少图表

    我已经使用 Kubeadm v1 6 安装了 Docker v1 13 和 Kubernetes 然后我安装了 Web UI 仪表板 我可以访问它 但缺少 CPU 内存使用图 为什么会发生这种情况 对我来说 安装后使用图就起作用了heaps
  • 匹配同一端口上不同路径的 Istio 虚拟服务路由

    我想知道如何在同一端口上匹配 gRPC 路由 以下是我希望通过 VirtualService 实现的目标的示例 apiVersion networking istio io v1alpha3 kind VirtualService meta
  • Kubernetes Ingress 在 nginx 反向代理后面运行

    我已经在可以从互联网访问的服务器上安装了 minikube 我创建了一个可用的 kubernetes 服务 gt kubectl get service myservice NAME CLUSTER IP EXTERNAL IP PORT
  • 如何通过 kubectl 代理访问此 Kubernetes 服务?

    我想通过以下方式访问我的 Grafana Kubernetes 服务kubectl 代理服务器 https kubernetes io docs user guide kubectl v1 7 proxy 但由于某种原因 即使我可以使其适用
  • Rabbit mq - 等待 Mnesia 表时出错

    我已经在 Kubernetes 集群上使用 Helm Chart 安装了 RabbitMQ rabbitmq pod不断重新启动 在检查 pod 日志时 我收到以下错误 2020 02 26 04 42 31 582 warning lt
  • 如何从容器内运行 podman?

    我想跑podman https podman io作为运行 CI CD 管道的容器 但是 我不断从 podman 容器中收到此错误 podman info ERRO 0000 overlay is not supported over ov
  • 我可以将应用程序数据存储在 kubernetes 配置资源中吗?

    我正在尝试为我的应用程序找到一个数据库 对象存储 该应用程序实际上是 ISTIO 网络路由 API 的包装器 基本上简化了我的网络的 ISTIO 配置 Kubernetes k8s 自定义资源定义 CRD 似乎符合我的要求 也喜欢 CRD
  • 如何限制对 Kubernetes 服务的访问?

    我正在尝试使用以下 yaml 创建服务 正如您所看到的 我正在尝试限制 10 0 0 0 8 范围内对该服务的访问 apiVersion v1 kind Service metadata name nginx service spec po

随机推荐

  • CAN 为什么需要收发器

    在RTL代码中集成了两个CAN node 打算直接连接将两个node的Rx和Tx对接 发现两个CAN Node无法通信 询问技术支持后才知道必须要收发器 那为什么一定需要收发器呢 除了转换单端的CAN信号用于不同的传输 收发器也会将CANT
  • Unity-ML-Agents安装

    目录 1 下载ML Agents 1 1 前往官网 1 2 选择版本 1 3 下载文件 2 下载Anaconda 3 虚拟环境 3 1 构建虚拟环境 3 2 创建项目 导入package json 3 2 1 创建项目 导入package
  • Linux查询文件行数

    wc l find name c
  • OpenCV之warpPerspective--透视变换

    OpenCV之warpPerspective 透视变换 参考博客链接 https blog csdn net liuphahaha article details 50719275 为了记录自己的学习 一 OpenCV透视变化进行图像中的关
  • 《神经网络与深度学习》-概率图模型

    概率图模型 1 模型的表示 1 1 有向图模型 1 2 常见的有向图模型 1 2 1 Sigmoid信念网络 1 2 2 朴素贝叶斯分类器 1 2 3 隐马尔科夫模型 1 3 无向图模型 1 4 无向图模型的概率分解 1 5 常见的无向图模
  • 【面试总结】设计思想解读开源框架:(1)

    12 策略模式 Strategy Pattern 13 适配器模式 Adapter Pattern 14 迭代器模式 Iterator Pattern 15 组合模式 Composite Pattern 16 观察者模式 Observer
  • gcc- -O 优化选项

    查查gcc手册就知道了 每个编译选项都控制着不同的优化选项 下面从网络上copy过来的 真要用到这些还是推荐查阅手册 O设置一共有五种 O0 O1 O2 O3和 Os 除了 O0以外 每一个 O设置都会多启用几个选项 请查阅gcc手册的优化
  • json文件中数据类别个数统计与类别信息可视化

    将json文件保存的数据信息利用URL下载数据以后 希望将统计出数据集中每一类图片个数 且进行可视化 看数据分布是否均匀 然后在进行相应的操作 数据还是kaggle比赛中提供的数据集 json文件内容如下 python实现上述要求 导入相应
  • Mac创建定时任务

    Mac 有两种方式可以添加定时任务 crontab 命令 launchctl 定时任务 crontab 命令 通过crontab 命令 我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本 时间间隔的单位可以是分钟 小
  • 观察者模式 & 发布-订阅模式(设计模式与开发实践 P8)

    文章目录 观察者模式 运用 实现 观察者模式 定义 他用来定义对象之间一种一对多的依赖关系 当一个对象状态发生改变时 所有依赖他的对象都会得到通知 运用 如果我们使用过 DOM 上的事件函数 那就接触过观察者模式 document body
  • (亲测好用)idea提示内存不足( ran out of available memory)

    idea提示内存不足 ran out of available memory 错误提示 The IDE ran out of available memory Please consider increasing the value of
  • 【LeetCode】3. 无重复字符的最长子串 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

    3 无重复字符的最长子串 给定一个字符串s 请你找出其中不含有重复字符的最长子串的长度 示例 1 输入 s abcabcbb 输出 3 解释 因为无重复字符的最长子串是 abc 所以其长度为 3 示例 2 输入 s bbbbb 输出 1 解
  • webpack打包优化和打包上线

    通过 npm run serve 启动本地 执行 development 通过 npm run test 打包测试 执行 testing 通过 npm run build 打包正式 执行 production 图片优化 使用 url loa
  • Uniapp低功耗蓝牙操作实例

    uniapp低功耗蓝牙在移动端使用较为平常 本文相较于官方文档介绍一下低功耗蓝牙的操作案例 即取即用 低功耗蓝牙虽工作原理与经典蓝牙类似 但是有着独特的架构体系 所以LE独立出来成为一种蓝牙形态 不过LE和经典蓝牙使用相同的2 4G无线电频
  • 机器学习好伙伴之scikit-learn的使用——datasets获得数据集

    机器学习好伙伴之scikit learn的使用 datasets获得数据集 载入sklearn中自带的datesets 利用sklearn的函数生成数据 应用示例 利用sklearn中自带的datesets进行训练 利用sklearn中生成
  • 使用ASMD 来描述硬件电路并辅助verilog 代码的编写

    TOC 使用ASMD 来描述硬件电路并辅助verilog 代码的编写 ASMD 的定义 ASM 算法状态机 图是描述时序状态机的一种抽象 类似于软件流程图 描述状态机的动作 但是ASM 图只显示控制信号和行为动作 控制状态 不显示存储元件所
  • 详谈redis之有序集合(ZSET)

    一 前言 有序集合存储着成员 member 和分值 score 的键值对 按照分值从小到大自动排序 具体细节在第一篇blog 详谈redis数据结构 中 不太熟悉的同学可以回去查看 对Java不太熟悉的同学可关注文章末尾的公众号 里面满满干
  • uniapp小程序的苹果 ios页面左右或上下滑动问题的解决方法效果damo(整理)

    一般来说 微信小程序的页面是不需要左右滑动的 甚至说是不允许左右滑动的 事实上 安卓手机在默认情况下就是左右不滑动的 但苹果IOS手机默认是左右可滑动的 其解决方法如下 在具体页面的顶级view元素设置class page 其CSS样式如下
  • eclipse中建动态web项目

    1 eclipse环境下配置tomcat 2 建项目 这就是一个建好的项目 3 将项目部署在tomcat服务器中 这个时候你的项目就部署在服务器上了
  • k8s 控制器:Replicaset 和 Deployment

    Deployment 官方文档 https kubernetes io docs concepts workloads controllers deployment k8s 在定义 pod 资源时 可以直接创建一个 kind Pod 类型的