Kubernetes 存活、就绪和启动探针

2023-11-17

Kubernetes主要有三中探针:存活(Liveness)、就绪(Readiness)和启动(Startup)探针。

  • kubelet 使用存活探针来确定什么时候要重启容器。 例如,存活探针可以探测到应用死锁(应用程序在运行,但是无法继续执行后面的步骤)情况。 重启这种状态下的容器有助于提高应用的可用性,即使其中存在缺陷。

  • kubelet 使用就绪探针可以知道容器何时准备好接受请求流量,当一个 Pod 内的所有容器都就绪时,才能认为该 Pod 就绪。 这种信号的一个用途就是控制哪个 Pod 作为 Service 的后端。 若 Pod 尚未就绪,会被从 Service 的负载均衡器中剔除。

  • kubelet 使用启动探针来了解应用容器何时启动。 如果配置了这类探针,你就可以控制容器在启动成功后再进行存活性和就绪态检查, 确保这些存活、就绪探针不会影响应用的启动。 启动探针可以用于对慢启动容器进行存活性检测,避免它们在启动运行之前就被杀掉。

注意:
存活探针是一种从应用故障中恢复的强劲方式,但应谨慎使用。 你必须仔细配置存活探针,确保它能真正标示出不可恢复的应用故障,例如死锁。

说明:
错误的存活探针可能会导致级联故障。 这会导致在高负载下容器重启;例如由于应用程序无法扩展,导致客户端请求失败;以及由于某些 Pod 失败而导致剩余 Pod 的工作负载增加。了解就绪探针和存活探针之间的区别, 以及何时为应用程序配置使用它们非常重要。

存活探测

定义存活命令

许多长时间运行的应用最终会进入损坏状态,除非重新启动,否则无法被恢复。 Kubernetes 提供了存活探针来发现并处理这种情况。

在本练习中,你会创建一个 Pod,其中运行一个基于 registry.k8s.io/busybox 镜像的容器。 下面是这个 Pod 的配置文件。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: registry.k8s.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

在这个配置文件中,可以看到 Pod 中只有一个 Container。 periodSeconds 字段指定了 kubelet 应该每 5 秒执行一次存活探测。 initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 5 秒。 kubelet 在容器内执行命令 cat /tmp/healthy 来进行探测。 如果命令执行成功并且返回值为 0,kubelet 就会认为这个容器是健康存活的。 如果这个命令返回非 0 值,kubelet 会杀死这个容器并重新启动它。

当容器启动时,执行如下的命令:

/bin/sh -c "touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600"

这个容器生命的前 30 秒,/tmp/healthy 文件是存在的。 所以在这最开始的 30 秒内,执行命令 cat /tmp/healthy 会返回成功代码。 30 秒之后,执行命令 cat /tmp/healthy 就会返回失败代码。

创建 Pod:

kubectl apply -f https://k8s.io/examples/pods/probe/exec-liveness.yaml

在 30 秒内,查看 Pod 的事件:

kubectl describe pod liveness-exec

输出结果表明还没有存活探针失败:

Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  11s   default-scheduler  Successfully assigned default/liveness-exec to node01
  Normal  Pulling    9s    kubelet, node01    Pulling image "registry.k8s.io/busybox"
  Normal  Pulled     7s    kubelet, node01    Successfully pulled image "registry.k8s.io/busybox"
  Normal  Created    7s    kubelet, node01    Created container liveness
  Normal  Started    7s    kubelet, node01    Started container liveness

35 秒之后,再来看 Pod 的事件:

kubectl describe pod liveness-exec

在输出结果的最下面,有信息显示存活探针失败了,这个失败的容器被杀死并且被重建了。

  Type     Reason     Age                From               Message
  ----     ------     ----               ----               -------
  Normal   Scheduled  57s                default-scheduler  Successfully assigned default/liveness-exec to node01
  Normal   Pulling    55s                kubelet, node01    Pulling image "registry.k8s.io/busybox"
  Normal   Pulled     53s                kubelet, node01    Successfully pulled image "registry.k8s.io/busybox"
  Normal   Created    53s                kubelet, node01    Created container liveness
  Normal   Started    53s                kubelet, node01    Started container liveness
  Warning  Unhealthy  10s (x3 over 20s)  kubelet, node01    Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory
  Normal   Killing    10s                kubelet, node01    Container liveness failed liveness probe, will be restarted

再等 30 秒,确认这个容器被重启了:

kubectl get pod liveness-exec

输出结果显示 RESTARTS 的值增加了 1。 请注意,一旦失败的容器恢复为运行状态,RESTARTS 计数器就会增加 1:

NAME            READY     STATUS    RESTARTS   AGE
liveness-exec   1/1       Running   1          1m

定义一个存活态 HTTP 请求接口

另外一种类型的存活探测方式是使用 HTTP GET 请求。 下面是一个 Pod 的配置文件,其中运行一个基于 registry.k8s.io/liveness 镜像的容器。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-http
spec:
  containers:
  - name: liveness
    image: registry.k8s.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

在这个配置文件中,你可以看到 Pod 也只有一个容器。 periodSeconds 字段指定了 kubelet 每隔 3 秒执行一次存活探测。 initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 3 秒。 kubelet 会向容器内运行的服务(服务在监听 8080 端口)发送一个 HTTP GET 请求来执行探测。 如果服务器上/healthz 路径下的处理程序返回成功代码,则 kubelet 认为容器是健康存活的。 如果处理程序返回失败代码,则 kubelet 会杀死这个容器并将其重启。

返回大于或等于 200 并且小于 400 的任何代码都标示成功,其它返回代码都标示失败。

你可以访问 server.go 阅读服务的源码。 容器存活期间的最开始 10 秒中,/healthz 处理程序返回 200 的状态码。 之后处理程序返回 500 的状态码。

http.HandleFunc("/healthz", func(w http.ResponseWriter, r *http.Request) {
    duration := time.Now().Sub(started)
    if duration.Seconds() > 10 {
        w.WriteHeader(500)
        w.Write([]byte(fmt.Sprintf("error: %v", duration.Seconds())))
    } else {
        w.WriteHeader(200)
        w.Write([]byte("ok"))
    }
})

kubelet 在容器启动之后 3 秒开始执行健康检测。所以前几次健康检查都是成功的。 但是 10 秒之后,健康检查会失败,并且 kubelet 会杀死容器再重新启动容器。

创建一个 Pod 来测试 HTTP 的存活检测:

kubectl apply -f https://k8s.io/examples/pods/probe/http-liveness.yaml

10 秒之后,通过查看 Pod 事件来确认存活探针已经失败,并且容器被重新启动了。

kubectl describe pod liveness-http

在 1.13 之前(包括 1.13)的版本中,如果在 Pod 运行的节点上设置了环境变量 http_proxy(或者 HTTP_PROXY),HTTP 的存活探测会使用这个代理。 在 1.13 之后的版本中,设置本地的 HTTP 代理环境变量不会影响 HTTP 的存活探测。

定义 TCP 的存活探测

第三种类型的存活探测是使用 TCP 套接字。 使用这种配置时,kubelet 会尝试在指定端口和容器建立套接字链接。 如果能建立连接,这个容器就被看作是健康的,如果不能则这个容器就被看作是有问题的。

apiVersion: v1
kind: Pod
metadata:
  name: goproxy
  labels:
    app: goproxy
spec:
  containers:
  - name: goproxy
    image: registry.k8s.io/goproxy:0.1
    ports:
    - containerPort: 8080
    readinessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
    livenessProbe:
      tcpSocket:
        port: 8080
      initialDelaySeconds: 15
      periodSeconds: 20

如你所见,TCP 检测的配置和 HTTP 检测非常相似。 下面这个例子同时使用就绪和存活探针。kubelet 会在容器启动 5 秒后发送第一个就绪探针。 探针会尝试连接 goproxy 容器的 8080 端口。 如果探测成功,这个 Pod 会被标记为就绪状态,kubelet 将继续每隔 10 秒运行一次探测。

除了就绪探针,这个配置包括了一个存活探针。 kubelet 会在容器启动 15 秒后进行第一次存活探测。 与就绪探针类似,存活探针会尝试连接 goproxy 容器的 8080 端口。 如果存活探测失败,容器会被重新启动。

kubectl apply -f https://k8s.io/examples/pods/probe/tcp-liveness-readiness.yaml

15 秒之后,通过看 Pod 事件来检测存活探针:

kubectl describe pod goproxy

定义 gRPC 存活探针

特性状态: Kubernetes v1.24 [beta]

如果你的应用实现了 gRPC 健康检查协议, kubelet 可以配置为使用该协议来执行应用存活性检查。 你必须启用 GRPCContainerProbe 特性门控 才能配置依赖于 gRPC 的检查机制。

这个例子展示了如何配置 Kubernetes 以将其用于应用程序的存活性检查。 类似地,你可以配置就绪探针和启动探针。

下面是一个示例清单:

apiVersion: v1
kind: Pod
metadata:
  name: etcd-with-grpc
spec:
  containers:
  - name: etcd
    image: registry.k8s.io/etcd:3.5.1-0
    command: [ "/usr/local/bin/etcd", "--data-dir",  "/var/lib/etcd", "--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls", "http://127.0.0.1:2379", "--log-level", "debug"]
    ports:
    - containerPort: 2379
    livenessProbe:
      grpc:
        port: 2379
      initialDelaySeconds: 10

要使用 gRPC 探针,必须配置 port 属性。 如果要区分不同类型的探针和不同功能的探针,可以使用 service 字段。 你可以将 service 设置为 liveness,并使你的 gRPC 健康检查端点对该请求的响应与将 service 设置为 readiness 时不同。 这使你可以使用相同的端点进行不同类型的容器健康检查(而不需要在两个不同的端口上侦听)。 如果你想指定自己的自定义服务名称并指定探测类型,Kubernetes 项目建议你使用使用一个可以关联服务和探测类型的名称来命名。 例如:myservice-liveness(使用 - 作为分隔符)。

说明:
与 HTTP 和 TCP 探针不同,gRPC 探测不能使用按名称指定端口, 也不能自定义主机名。

配置问题(例如:错误的 port 和 service、未实现健康检查协议) 都被认作是探测失败,这一点与 HTTP 和 TCP 探针类似。

kubectl apply -f https://k8s.io/examples/pods/probe/grpc-liveness.yaml

15 秒钟之后,查看 Pod 事件确认存活性检查并未失败:

kubectl describe pod etcd-with-grpc

在 Kubernetes 1.23 之前,gRPC 健康探测通常使用 grpc-health-probe 来实现,如博客 Health checking gRPC servers on Kubernetes(对 Kubernetes 上的 gRPC 服务器执行健康检查)所描述。 内置的 gRPC 探针行为与 grpc-health-probe 所实现的行为类似。 从 grpc-health-probe 迁移到内置探针时,请注意以下差异:

  • 内置探针运行时针对的是 Pod 的 IP 地址,不像 grpc-health-probe 那样通常针对 127.0.0.1 执行探测; 请一定配置你的 gRPC 端点使之监听于 Pod 的 IP 地址之上。
  • 内置探针不支持任何身份认证参数(例如 -tls)。
  • 对于内置的探针而言,不存在错误代码。所有错误都被视作探测失败。
  • 如果 ExecProbeTimeout 特性门控被设置为 false,则 grpc-health-probe 不会考虑 timeoutSeconds 设置状态(默认值为 1s), 而内置探针则会在超时时返回失败。

使用命名端口

对于 HTTP 和 TCP 存活检测可以使用命名的 port(gRPC 探针不支持使用命名端口)。

例如:

ports:
- name: liveness-port
  containerPort: 8080
  hostPort: 8080

livenessProbe:
  httpGet:
    path: /healthz
    port: liveness-port

启动探针

使用启动探针保护慢启动容器,有时候,会有一些现有的应用在启动时需要较长的初始化时间。针对 HTTP 或 TCP 检测,可以通过将 failureThreshold * periodSeconds 参数设置为足够长的时间来应对糟糕情况下的启动时间。

这样,前面的例子就变成了:

ports:
- name: liveness-port
  containerPort: 8080
  hostPort: 8080

livenessProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 1
  periodSeconds: 10

startupProbe:
  httpGet:
    path: /healthz
    port: liveness-port
  failureThreshold: 30
  periodSeconds: 10

应用程序将会有最多 5 分钟(30 * 10 = 300s)的时间来完成其启动过程。 一旦启动探测成功一次,存活探测任务就会接管对容器的探测,对容器死锁作出快速响应。 如果启动探测一直没有成功,容器会在 300 秒后被杀死,并且根据 restartPolicy 来执行进一步处置。

就绪探针

有时候,应用会暂时性地无法为请求提供服务。 例如,应用在启动时可能需要加载大量的数据或配置文件,或是启动后要依赖等待外部服务。 在这种情况下,既不想杀死应用,也不想给它发送请求。 Kubernetes 提供了就绪探针来发现并缓解这些情况。 容器所在 Pod 上报还未就绪的信息,并且不接受通过 Kubernetes Service 的流量。

说明:
就绪探针在容器的整个生命周期中保持运行状态。

注意:
存活探针不等待就绪性探针成功。 如果要在执行存活探针之前需要等待,应该使用 initialDelaySecondsstartupProbe

就绪探针的配置和存活探针的配置相似。 唯一区别就是要使用 readinessProbe 字段,而不是 livenessProbe 字段。

readinessProbe:
  exec:
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 5
  periodSeconds: 5

HTTP 和 TCP 的就绪探针配置也和存活探针的配置完全相同。

就绪和存活探测可以在同一个容器上并行使用。 两者共同使用,可以确保流量不会发给还未就绪的容器,当这些探测失败时容器会被重新启动。

探针配置

Probe 有很多配置字段,可以使用这些字段精确地控制启动、存活和就绪检测的行为:

  • initialDelaySeconds:容器启动后要等待多少秒后才启动启动、存活和就绪探针, 默认是 0 秒,最小值是 0。
  • periodSeconds:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
  • timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。
  • successThreshold:探针在失败后,被视为成功的最小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。
  • failureThreshold:探针连续失败了 failureThreshold 次之后, Kubernetes 认为总体上检查已失败:容器状态未就绪、不健康、不活跃。 对于启动探针存活探针而言,如果至少有 failureThreshold 个探针已失败, Kubernetes 会将容器视为不健康并为这个特定的容器触发重启操作。 kubelet 会考虑该容器的 terminationGracePeriodSeconds 设置。 对于失败的就绪探针kubelet 继续运行检查失败的容器,并继续运行更多探针; 因为检查失败,kubeletPodReady 状况设置为 false。
  • terminationGracePeriodSeconds:为 kubelet 配置从为失败的容器触发终止操作到强制容器运行时停止该容器之前等待的宽限时长。 默认值是继承 Pod 级别的 terminationGracePeriodSeconds 值(如果不设置则为 30 秒),最小值为 1。 更多细节请参见探针级别 terminationGracePeriodSeconds。

说明:
在 Kubernetes 1.20 版本之前,exec 探针会忽略 timeoutSeconds: 探针会无限期地持续运行,甚至可能超过所配置的限期,直到返回结果为止。

这一缺陷在 Kubernetes v1.20 版本中得到修复。你可能一直依赖于之前错误的探测行为, 甚至都没有觉察到这一问题的存在,因为默认的超时值是 1 秒钟。 作为集群管理员,你可以在所有的 kubelet 上禁用 ExecProbeTimeout 特性门控 (将其设置为 false),从而恢复之前版本中的运行行为。之后当集群中所有的 exec 探针都设置了 timeoutSeconds 参数后,移除此标志重载。 如果你有 Pod 受到此默认 1 秒钟超时值的影响,你应该更新这些 Pod 对应的探针的超时值, 这样才能为最终去除该特性门控做好准备。

当此缺陷被修复之后,在使用 dockershim 容器运行时的 Kubernetes 1.20+ 版本中,对于 exec 探针而言,容器中的进程可能会因为超时值的设置保持持续运行, 即使探针返回了失败状态。

注意:
如果就绪态探针的实现不正确,可能会导致容器中进程的数量不断上升。 如果不对其采取措施,很可能导致资源枯竭的状况。

HTTP 探测

HTTP Probes 允许针对 httpGet 配置额外的字段:

  • host:连接使用的主机名,默认是 Pod 的 IP。也可以在 HTTP 头中设置 “Host” 来代替。
  • scheme:用于设置连接主机的方式(HTTP 还是 HTTPS)。默认是 “HTTP”。
  • path:访问 HTTP 服务的路径。默认值为 “/”。
  • httpHeaders:请求中自定义的 HTTP 头。HTTP 头字段允许重复。
  • port:访问容器的端口号或者端口名。如果数字必须在 1~65535 之间。

对于 HTTP 探测,kubelet 发送一个 HTTP 请求到指定的路径和端口来执行检测。 除非 httpGet 中的 host 字段设置了,否则 kubelet 默认是给 Pod 的 IP 地址发送探测。 如果 scheme 字段设置为了 HTTPSkubelet 会跳过证书验证发送 HTTPS 请求。 大多数情况下,不需要设置 host 字段。 这里有个需要设置 host 字段的场景,假设容器监听 127.0.0.1,并且 Pod 的 hostNetwork 字段设置为了 true。那么 httpGet 中的 host 字段应该设置为 127.0.0.1。 可能更常见的情况是如果 Pod 依赖虚拟主机,你不应该设置 host 字段,而是应该在 httpHeaders 中设置 Host。

针对 HTTP 探针,kubelet 除了必需的 Host 头部之外还发送两个请求头部字段:User-AgentAccept。这些头部的默认值分别是 kube-probe/{{ skew currentVersion >}} (其中 1.27 是 kubelet 的版本号)和 */*

你可以通过为探测设置 .httpHeaders来重载默认的头部字段值;例如:

livenessProbe:
  httpGet:
    httpHeaders:
      - name: Accept
        value: application/json

startupProbe:
  httpGet:
    httpHeaders:
      - name: User-Agent
        value: MyUserAgent

你也可以通过将这些头部字段定义为空值,从请求中去掉这些头部字段。

livenessProbe:
  httpGet:
    httpHeaders:
      - name: Accept
        value: ""

startupProbe:
  httpGet:
    httpHeaders:
      - name: User-Agent
        value: ""

TCP 探测

对于 TCP 探测而言,kubelet 在节点上(不是在 Pod 里面)发起探测连接, 这意味着你不能在 host 参数上配置服务名称,因为 kubelet 不能解析服务名称。

探针层面的 terminationGracePeriodSeconds

特性状态: Kubernetes v1.27 [stable]
在 1.21 发行版之前,Pod 层面的 terminationGracePeriodSeconds 被用来终止存活探测或启动探测失败的容器。 这一行为上的关联不是我们想要的,可能导致 Pod 层面设置了 terminationGracePeriodSeconds 时容器要花非常长的时间才能重新启动。

在 1.21 及更高版本中,用户可以指定一个探针层面的 terminationGracePeriodSeconds 作为探针规约的一部分。 当 Pod 层面和探针层面的 terminationGracePeriodSeconds 都已设置,kubelet 将使用探针层面设置的值。

说明:
从 Kubernetes 1.25 开始,默认启用 ProbeTerminationGracePeriod 特性。 选择禁用此特性的用户,请注意以下事项:

ProbeTerminationGracePeriod 特性门控只能用在 API 服务器上。 kubelet 始终优先选用探针级别 terminationGracePeriodSeconds 字段 (如果它存在于 Pod 上)。
如果你已经为现有 Pod 设置了 terminationGracePeriodSeconds 字段并且不再希望使用针对每个探针的终止宽限期,则必须删除现有的这类 Pod。
当你(或控制平面或某些其他组件)创建替换 Pod,并且特性门控 ProbeTerminationGracePeriod 被禁用时,即使 Pod 或 Pod 模板指定了 terminationGracePeriodSeconds 字段, API 服务器也会忽略探针级别的 terminationGracePeriodSeconds 字段设置。
例如:

spec:
  terminationGracePeriodSeconds: 3600  # Pod 级别设置
  containers:
  - name: test
    image: ...

    ports:
    - name: liveness-port
      containerPort: 8080
      hostPort: 8080

    livenessProbe:
      httpGet:
        path: /healthz
        port: liveness-port
      failureThreshold: 1
      periodSeconds: 60
      # 重载 Pod 级别的 terminationGracePeriodSeconds
      terminationGracePeriodSeconds: 60

探针层面的 terminationGracePeriodSeconds 不能用于就绪态探针。 这一设置将被 API 服务器拒绝。

完整示例

apiVersion: apps/v1
kind: Deployment
metadata:                        # metadata字段包含对Deployment的描述信息
  name: pipeline-test-deployment
  namespace: test
  labels:
    app: pipeline-test-pod      # 标签字段用于识别Pod
spec:
  replicas: 2                   # 定义副本数量
  selector:
    matchLabels:
      app: pipeline-test-pod
  template:
    metadata:
      labels:
        app: pipeline-test-pod
    spec:
      containers:
      # 定义nginx容器
      - name: pipeline-test
        image: 192.168.232.7:80/repository/pipeline-test:v1.0.0
        imagePullPolicy: Always # 定义拉取镜像的方式(每次都拉取)
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          requests:
            cpu: 100m            # 请求时申请CPU资源为0.2核
            memory: 256Mi        # 请求时申请内存资源为256M
          limits:
            cpu: 500m            # 限定CPU资源上限为0.5核
            memory: 512Mi        # 限定内存资源上限为512M
        livenessProbe:           # 定义存活探测
          httpGet:
            path: /              # 探测路径
            port: 80             # 探测端口
            httpHeaders:         # 定义请求头
              - name: Custom-Header
                value: Awesome
          initialDelaySeconds: 10 # 第一次探活前,延迟10秒
          periodSeconds: 10       # 每间隔10秒进行一次探活
          timeoutSeconds: 3       # 每次探测的超时时间
          failureThreshold: 5     # 探针连续失败了 5 次之后Kubernetes认为服务死亡(容器状态未就绪、不健康、不活跃)
        readinessProbe:           # 定义就绪探测
          httpGet:
            path: /              # 探测路径
            port: 80             # 探测端口
            httpHeaders:         # 定义请求头
              - name: Custom-Header
                value: Awesome
          initialDelaySeconds: 10 # 第一次探活前,延迟10秒
          periodSeconds: 10       # 每间隔10秒进行一次探活
          timeoutSeconds: 3       # 每次探测的超时时间
          failureThreshold: 5     # 探针连续失败了 5 次之后Kubernetes认为服务死亡(容器状态未就绪、不健康、不活跃)
          successThreshold: 1     # 探针在失败后,连续1次探测到成功就任务服务恢复

k8s官方文档

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

Kubernetes 存活、就绪和启动探针 的相关文章

  • 从 Kubernetes Python 客户端登录到 GitLab 存储库

    我有一个 Django 应用程序 它使用python 的官方 Kubernetes 客户端 https github com kubernetes client python并且工作正常 但它只部署 正确 公共注册表 有没有办法执行登录后让
  • 如何使用 kubectl 了解有关先前发布版本的更多详细信息?

    有给出的命令here https kubernetes io docs reference kubectl cheatsheet updating resources其中解释了如何使用执行回滚kubectl 列出以前的部署版本的是 kube
  • 如何在 kubernetes 中将秘密标记为可选?

    来自文档 除非将秘密标记为可选 否则必须先创建秘密 然后再将其作为环境变量在 pod 中使用 引用不存在的 Secret 将阻止 pod 启动 如何将秘密标记为可选 您正在寻找的是 name ENV NAME valueFrom secre
  • 让我们加密证书颁发

    我正在尝试获取 Let s Encrypt 颁发的证书 已经过去了 3 个半小时 我不小心最初将我的 SecretName 设置为 echo tls 然后将其切换到我想使用的正确的 pandaist tls 我目前有这个 kubectl g
  • 如何允许 Kubernetes 作业访问主机上的文件

    我已经彻底阅读了 Kubernetes 文档 但在与主机文件系统上的文件与 K8 作业启动的 pod 内运行的应用程序进行交互时仍然遇到问题 即使是最简单的实用程序也会发生这种情况 因此我提供了 yaml 配置的精简示例 此处引用的本地文件
  • Helm 3 图表安装错误:验证数据时出错:未设置 apiVersion

    我有一个简单的 helm 图表 它将通过 docker 桌面将应用程序部署到我的 kubernetes 本地副本 如果我使用 kubectl 一次部署一个 yaml 文件 一切都会正常工作 但是 当我尝试创建 helm 图表以方便部署时 出
  • Rabbit mq - 等待 Mnesia 表时出错

    我已经在 Kubernetes 集群上使用 Helm Chart 安装了 RabbitMQ rabbitmq pod不断重新启动 在检查 pod 日志时 我收到以下错误 2020 02 26 04 42 31 582 warning lt
  • 如何将我的 pod 日志存储在持久存储中?

    我已经使用以下命令为我的 Pod 生成了日志kubectl logs pod name 但我想将这些日志保存在一个卷 某种持久存储 中 因为如果 Pod 宕机 容器日志将被清除 有没有办法做到这一点 我必须写某种脚本吗 我已经阅读了很多答案
  • 错误“没有可用于此声明的持久卷,并且未设置存储类别”

    是需要在nodes中手动创建目录还是pv自动创建 这是我的 pv 和 pvc 文件 我看到这个错误 没有可用于此声明的持久卷 并且未设置存储类别 如何解决这个问题 kind PersistentVolume apiVersion v1 me
  • 什么是 Kubernetes 清单?

    我在网上搜索过 大多数链接似乎都提到了清单 但没有实际解释它们是什么 什么是清单 它基本上是 Kubernetes API 对象描述 配置文件可以包含其中的一个或多个 即 Deployment ConfigMap Secret Daemon
  • 如何在 configmap.yaml (Helm) 中使用 json 文件?

    我正在使用 Helm 部署到 Kubernetes 集群 我研究了配置映射 发现可以从文件中检索数据并将其放入配置映射中 我有以下内容configmap yaml kind ConfigMap apiVersion v1 metadata
  • 将mysql数据导入kubernetes pod

    有谁知道如何将我的 dump sql 文件中的数据导入到 kubernetes pod 中 直接 与处理 docker 容器的方式相同 docker exec i container name mysql uroot password se
  • Kubeadm 加入失败:无法请求集群信息

    我有两台服务器作为本地服务器网络上的主节点和工作节点 master node 10 20 20 214 worker node 10 20 20 218 在主节点中 我成功使用 kubeadm init 设置 Calico 网络 它报告消息
  • 我可以在私有 GCP 网络子网中启动 Google 容器引擎 (GKE) 吗?

    我正在尝试在私有 GCP 网络子网中启动 Google 容器引擎 GKE 我创建了自定义 Google Cloud VPC 然后我也在该 VPC 下创建了自定义专用网络访问子网 1 当我使用私有子网创建 GKE 集群时 我的 Kuberne
  • 如何在 Istio 上禁用 mtls?

    我在使用 Istio 连接 Kubernetes 上的两个服务时遇到问题 我的服务向 elasticsearch 发出 POST 请求 2020 11 18T21 51 53 758079131Z org elasticsearch cli
  • Kubernetes - 滚动更新杀死旧的 Pod,而不启动新的 Pod

    我目前正在使用 Deployments 来管理 K8S 集群中的 pod 我的一些部署需要 2 个 pod 副本 一些需要 3 个 pod 副本 还有一些只需要 1 个 pod 副本 我遇到的问题是只有一个 pod 副本 我的 YAML 文
  • kubectl:在 WSL 终端中找不到

    我按照以下说明在 Windows10 上安装了 WSL2 https learn microsoft com en us windows wsl install win10 https learn microsoft com en us w
  • 如何测试 ClusterIssuer 求解器?

    我正在尝试使用 DigitalOcean 上的 LetsEncrypt 部署带有 SSL 证书的 Kubernetes 集群 我跟着这些说明 https www digitalocean com community tutorials ho
  • 支持 Kubernetes NodePort 服务的 SSL/TLS

    问题 我需要通过 https 向外部公开 Kubernetes NodePort 服务 设置 我已经在裸机上部署了 Kubernetes 并且已经部署Polyaxon https github com polyaxon polyaxon通过
  • 如何在 pod 之间或 kubernetes 集群中的节点之间复制文件?

    在 kubernetes 集群中可以这样做吗 我发现的所有示例都是从本地磁盘复制到 Pod 反之亦然 或者是从一个节点复制到另一个节点的唯一选项 例如通过 SSH SCP 或使用其他实用程序 无法进行集群到集群的复制 你需要使用kubect

随机推荐

  • docker镜像详解

    目录 什么是docker镜像 镜像相关命令 docker pull docker images docker search docker rmi 导出 导入镜像 镜像分层 镜像摘要 镜像摘要的作用 分发散列值 什么是docker镜像 Doc
  • 帆软填报界面首页黑色

    解决方法 左上角 gt 模板 gt 模板web属性 gt 填报的话 选填报界面 gt 为该模板单独设置 gt 左上角 填报当前行背景颜色 gt 改成 白色 或其他
  • 统计字符串中每个单词出现的个数和频率----四种方法

    统计每个单词出现的个数 三种方法 第一种如下 最简单的方式 sentance I can because i think i can 切片分隔成列表序列 用列表推导式表达 rresult word sentance split count
  • 认识数据中心两个关键指标RTO和RPO

    RTO和RPO是Business Continuity BC and Disaster Recovery DR 里面两个重要的概念 也是类似产品的Service Level Agreement SLA 的两个重要的衡量指标 Recovery
  • 观察者模式和事件通知备忘

    观察者模式和事件通知备忘 MessageBus instance post Notify PARKIN in bytes 这种是仿照Android的EventBus 用new的一个实例对象根据path反射调用其中的方法处理逻辑 要修改为 r
  • 【JVM】如何通俗地讲解JVM各个组成部分和其基本功能?

    类加载器 ClassLoader 运行时数据区 Runtime Data Area 执行引擎 Execution Engine 本地库接口 Native Interface 组件的作用 首先通过类加载器 ClassLoader 会把 Jav
  • (服务计算)在centos上编写golang的库,并进行测试

    首先是在centos上按照老师给的教程安装golang的相关内容 安装成功后进行后面的操作 首先是创建了一个hello go的文件 然后执行结果如下 可知安装基本正确 然后编写第一个库 首先创建包路径 然后创建名为reverse go的文件
  • 图形学基础1

    坐标系相关 uv可能会影响局部坐标系 如果light图和brdf图做卷积的时候 局部坐标系保持一致很重要 如下图 tangent是从外部模型文件进行加载的 切线空间采样并转世界坐标系 spherical to cartesian in ta
  • unity配置.asset文件

    unity配置数据可以XML 可以JSON unity自带的 asset文件也可以哦 而且能配置的数据类型也比较多 这里说明一下怎么在unity中生成 asset文件 首先来个脚本 using System using System Col
  • 【华为OD机试真题 python】报文解压缩

    题目描述 为了提升数据传输的效率 会对传输的报文进行压缩处理 输入一个压缩后的报文 请返回它解压后的原始报文 压缩规则 n str 表示方括号内部的 str 正好重复 n 次 注意 n 为正整数 0 lt n lt 100 str只包含小写
  • Dockerfile 中 CMD 为什么要避免使用 sh -c

    CSDN 中文章不一定能及时更新 欢迎点击前往我的博客查看最新版本 许盛的博客 Dockerfile 中的 CMD 命令 有 exec form 和 shell form 两种形式 具体区别可以参考 Dockerfile 中 CMD 写法的
  • CDN加速与DDOS防御

    一 目的 实现国外节点的访问加速 分区域分线路加速 防御来自竞争对手的DDos恶意攻击 常见的延缓性CC攻击和致命的大流量攻击 针对以上的加速策略和两种攻击方式进行一些防御方案的简单介绍 二 CDN加速 利用第三方的DNS智能解析分区域分线
  • Git学习之LFS

    什么是Git LFS git是程序员开发程序不可或缺的工具 有效的使用git能够极大的加快程序人员的开发效率 在开发比较轻量化的代码时 开发的速度不会受到git上传下载速度的影响 但是随着系统的复杂度增加 代码中关联到的文件越来越多 其中二
  • BGP实验(路由反射器,联邦,路由优化)

    目录 1 IP地址的规划 2 拓扑结构的搭建 3 IP地址的配置 4 静态路由的配置 5 动态路由的配置 6 EBGP的配置 7 IBGP的配置 8 路由反射器的配置 宣告 9 重发布和路由优化 10 测试 实验要求 实验步骤 1 IP地址
  • Ubuntu中调整终端terminal显示的缓冲区大小

    step1 step2 step3
  • hadoop单机版部署

    1 下载hadoop wget no check certificate https mirrors bfsu edu cn apache hadoop common hadoop 3 3 1 hadoop 3 3 1 tar gz 2 解
  • WebSocket详解

    WebSocket WebSocket是一种协议 它允许在客户端和服务器之间建立持久连接 实现双向实时通信 传统的http请求是客户端向服务器发起请求 服务器响应请求 而WebSocket解决服务器无法给客户端发送信息的问题 与HTTP协议
  • 2019年中国在线酒店预订行业发展分析报告

    核心摘要 单体酒店连锁化加速 OYO横空出世 鲶鱼效应显现 2019年以来中国单体酒店连锁化趋势加速推进 传统酒店集团锦江国际 华住 首旅如家等为应对OYO带来的挑战 大力推进轻加盟 快速扩张门店数量 此外 单体酒店快速连锁化给OTA平台的
  • geoda空间自相关分析_【方法笔记4】Geoda空间计量1 空间自相关

    以黑龙江省为例 1 导入shp格式地图 打开目标地图 点击第二行第4个数据按钮可以查看地图数据变量 2 数据合并 即将研究的各地级市数据与导入地图 捆绑 首先找到地图数据中可以唯一表征每个地级市的变量 如 其次将个人研究变量与上述可对各地级
  • Kubernetes 存活、就绪和启动探针

    Kubernetes主要有三中探针 存活 Liveness 就绪 Readiness 和启动 Startup 探针 kubelet 使用存活探针来确定什么时候要重启容器 例如 存活探针可以探测到应用死锁 应用程序在运行 但是无法继续执行后面