首页 > 其他分享 >关于Kubernetes-v1.23.6-StartupProbe-启动探针的效果演示及说明

关于Kubernetes-v1.23.6-StartupProbe-启动探针的效果演示及说明

时间:2023-09-06 22:55:33浏览次数:49  
标签:容器 k8s Kubernetes demo 探针 nginx v1.23 StartupProbe root

本文,还是以一个nginx为例,创建一个nginx-demo的pod ,并且引入启动探针StartupProbe, 探针选项,位于spec:下面的containers:下面,与image选项同级的位置

1、先看如下 nginx-demo.yaml 文件,内容如下:

[root@k8s-master qq-5201351]# cat nginx-demo.yaml
apiVersion: v1      # api 文档版本
kind: Pod           # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata:           # Pod 相关的元数据,用于描述 Pod 的数据
  name: nginx-demo  # Pod 的名称
  namespace: 'default' # 命名空间的配置
spec:                  # 期望 Pod 按照这里面的描述进行创建
  containers:          # 对于 Pod 中的容器描述
  - name: nginx        # 容器的名称
    image: nginx:1.7.9 # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的

    startupProbe:   # 应用启动探针配置
      httpGet:      # 探测方式,基于http请求探测
        path: /api/path      # http 请求路径
        port: 80             # 请求端口
      failureThreshold: 3   # 失败多少次才算真正失败
      periodSeconds: 10     # 间隔时间
      successThreshold: 1   # 多少次监测成功才算真正的成功
      timeoutSeconds: 5     # 请求的超时时间

    ports:
    - name: http        # 端口名称
      containerPort: 80 # 描述容器内要暴露什么端口
      protocol: TCP     # 描述该端口是基于哪种协议通信的

  restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

2、可以看到引入了startupProbe 启动探针,然后根据yaml文件进行创建pod,(扩展一下,创建成功,如果将如下的create改成delete也可以删除相关的pod资源)

[root@k8s-master qq-5201351]# kubectl create -f nginx-demo.yaml
pod/nginx-demo created
[root@k8s-master qq-5201351]

3、可以等待一下,再进行观察 ,可以发现,状态虽然为Running ,但READY的个数为0 

[root@k8s-master ~]# kubectl get po
NAME         READY   STATUS              RESTARTS   AGE
nginx-demo   0/1     ContainerCreating   0          61s
[root@k8s-master ~]# kubectl get po
NAME         READY   STATUS    RESTARTS   AGE
nginx-demo   0/1     Running   0          81s

4、然后查看一下,相关的日志信息:kubectl describe po nginx-demo

Containers:
  nginx:
    Container ID:   docker://edc7f3e13d076027acbbaf680b95dbe42c6d88ec8000500f1c9eca1f10eeb5fa
    Image:          nginx:1.7.9
    Image ID:       docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Wed, 06 Sep 2023 21:55:00 +0800
      Finished:     Wed, 06 Sep 2023 21:55:30 +0800
    Ready:          False
    Restart Count:  4
    Startup:        http-get http://:80/api/path delay=0s timeout=5s period=10s #success=1 #failure=3
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-9wjkx (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             False
  ContainersReady   False
  PodScheduled      True

由此可以看出来,Container nginx failed startup probe

当然这里主要是因为笔者,在启动探针处,httpGet 了一个不存在的path , 如果将path的值改成:/index.html 就没有问题了

 

其他补充:对于探测的方式,有如下3种

ExecAction: 在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的

TCPSocketAction: 通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康

HTTPGetAction: 生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康

 

因此上方实验,如果是TCPSocket的方式,则可以写成如下样式:

    startupProbe:   # 应用启动探针配置
      tcpSocket:      # 探测方式,基于tcpSocket的方式探测
        port: 80             # 请求端口
      failureThreshold: 3   # 失败多少次才算真正失败
      periodSeconds: 10     # 间隔时间
      successThreshold: 1   # 多少次监测成功才算真正的成功
      timeoutSeconds: 5     # 请求的超时时间

如果是基于命令的探测方式,可以按如下样式:

    startupProbe:   # 应用启动探针配置
      exec:
        command:
        - sh
        - -c
        - "sleep 3;echo success > /inited"

      failureThreshold: 3   # 失败多少次才算真正失败
      periodSeconds: 10     # 间隔时间
      successThreshold: 1   # 多少次监测成功才算真正的成功
      timeoutSeconds: 5     # 请求的超时时间

于是笔者,也尝试使用命令的探测方式,重新创建了一个pod,最后验证一下:kubectl describe pod nginx-demo

Containers:
  nginx:
    Container ID:   docker://3ee7dad58bc0135637246d6cd66778de76434eac9acd7540aa4fc31c30fcbdc6
    Image:          nginx:1.7.9
    Image ID:       docker-pullable://nginx@sha256:e3456c851a152494c3e4ff5fcc26f240206abac0c9d794affb40e0714846c451
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Wed, 06 Sep 2023 22:39:21 +0800
    Ready:          True
    Restart Count:  0
    Startup:        exec [sh -c sleep 3;echo success > /inited] delay=0s timeout=5s period=10s #success=1 #failure=3
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-kjtwd (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  kube-api-access-kjtwd:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  2m1s  default-scheduler  Successfully assigned default/nginx-demo to k8s-node2
  Normal  Pulled     119s  kubelet            Container image "nginx:1.7.9" already present on machine
  Normal  Created    119s  kubelet            Created container nginx
  Normal  Started    119s  kubelet            Started container nginx

这样,我们还可以通过kubectl进行到容器,查看我们创建的文件:

[root@k8s-master ~]# kubectl exec -it nginx-demo -c nginx -- cat /inited
success
[root@k8s-master ~]#

 

 

 

尊重别人的劳动成果 转载请务必注明出处:https://www.cnblogs.com/5201351/p/17683622.html

 

标签:容器,k8s,Kubernetes,demo,探针,nginx,v1.23,StartupProbe,root
From: https://www.cnblogs.com/5201351/p/17683622.html

相关文章

  • 【Azure Kubernetes】通过 kubelogin 进行非交互式登录AKS
    问题描述当对AKS的登录方式(认证和授权)从“LocalAccountwithKubernetesRBAC”改变为“AzureADauthenticationwithAzureRBAC”.通过kubectl连接AKS会要求交互式登录,需要通过浏览器输入认证码后关联azure登录用户。那么,是否有办法可以避免这种交互式登录呢?  问......
  • 【Azure Kubernetes】通过 kubelogin 进行非交互式登录AKS
    问题描述当对AKS的登录方式(认证和授权)从“LocalAccountwithKubernetesRBAC”改变为“AzureADauthenticationwithAzureRBAC”.通过kubectl连接AKS会要求交互式登录,需要通过浏览器输入认证码后关联azure登录用户。那么,是否有办法可以避免这种交互式登录呢? 问题解答答......
  • VMware Tanzu Kubernetes Grid (TKG) 2.3 - 企业级 Kubernetes 解决方案
    VMwareTanzuKubernetesGrid(TKG)2.3-企业级Kubernetes解决方案VMware构建、签名和支持的开源Kubernetes容器编排平台的完整分发版请访问原文链接:https://sysin.org/blog/vmware-tkg-2/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgTanzuKubernetes集......
  • kubernetes(K8s)快速入门
    ......
  • kubernetes存储方案(一): Heketi+glusterfs
    环境介绍主机名ip安装软件gluster-server110.1.30.30gluster-server,Heketigluster-server210.1.30.32gluster gluster安装GlusterFS(所有节点)配置hosts解析cat>>/etc/hosts<<EOF10.1.30.30gluster-server110.1.30.32gluster-server2E......
  • kubernetes存储方案(二):StorageClass的使用
    StorageClass介绍创建StorageClass#catstorageclass-glusterfs.yamlapiVersion:v1kind:Secretmetadata:name:heketi-secretnamespace:defaultdata:key:YWRtaW5rZXk=type:kubernetes.io/glusterfs---apiVersion:storage.k8s.io/v1beta1kind:Storag......
  • [kubernetes]服务健康检查
    前言进程在运行,但是不代表应用是正常的,对此pod提供的探针可用来检测容器内的应用是否正常。k8s对pod的健康状态可以通过三类探针来检查:LivenessProbe、ReadinessProbe和StartupProbe。健康检查探针LivenessProbe用于判断容器是否存活(Running状态),如果LivenessProbe探针检测到容......
  • 在Kubernetes(K8S)上安装和部署MySQL
    摘要:本文将介绍如何在Kubernetes(K8S)上安装和部署MySQL。我们将通过以下步骤实现这一目标:准备工作、安装MySQL、配置MySQL以及在K8S上部署MySQL。通过本文,您将了解如何使用K8S来管理MySQL的容器化部署,提高应用程序的性能、可靠性和安全性。一、引言MySQL是一种流行的关系型数据库,广......
  • Ubuntu 20.04 LTS 安装Kubernetes 1.26
     1、环境配置(1)添加主机名称解析记录cat>/etc/hosts<<EOF192.168.44.200master01master01.bypass.cn192.168.44.201node01node01.bypass.cn192.168.44.202node02node02.bypass.cnEOF(2)禁止K8s使用虚拟内存swapoff-ased-ri's@(.*swap.*)@#\1@g'......
  • Kubernetes运维-Pod调试
    调试pod最简单的方法是在有问题的pod中执行命令,并尝试排除故障。这种方法很简单,但有许多缺点。正在运行的应用pod可能没有排除现有问题所需的所有工具。如果想执行一些需要额外权限的操作,需要重新启动应用pod,以添加新的权限。在docker镜像中添加调试工具会引入安全风险,提升容器权限......