您当前的位置:首页 > 电脑百科 > 程序开发 > 容器

kubernetes的基本单位Pod详解

时间:2020-10-07 09:39:30  来源:  作者:

Pod 是 kubernetes 中的基本单位,容器本身不会直接分配到主机上,而是会封装到 Pod 对象中。一个 Pod 通常表示单个应用程序,有一个或者多个相关的容器组成,这些容器的生命周期都是相同的,而且会作为一个整体在同一个 node 上调度起来,这些容器共享环境、存储卷和 IP 控件。尽管 Pod 中可能存在多个容器,但是在 kubernetes 中是以 Pod 为最小单位进行调度、伸缩并共享资源、管理生命周期。

Pod 的基本操作

我们先来看一下 Pod 的创建、查询、修改和删除操作。

创建 Pod

# expod.yml

apiVersion: v1
kind: Pod
metadata:
  name: expod
spec:
  containers:
  - name: expod-container
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c']
    args: ['echo "Hello Kubernetes!"; sleep 3600']

简单的模板含义:

  • apiVersion 表示 API 版本,v1 表示使用 kubernetes API 的稳定版本。
  • kind 表示要创建的资源对象。
  • metadata 表示该资源对象的元数据。可以拥有多个元数据,name 表示当前资源的名称。
  • spec 表示该资源对象的具体设置。其中 containers 表示容器的集合,我们这里设置了一个简单的容器。name: 要创建的容器名称。image: 容器的镜像地址。imagePullPolicy: 镜像的下载策略,支持3种策略:Always、Never、IfNotPresent。command: 容器的启动命令列表,不配置的话就使用镜像内部的命令。args: 启动参数列表

运行命令,创建 Pod。

kubectl Apply -f expod.yml

创建成功后,查询一下当前运行的所有 Pod

kubectl get pod
kubernetes的基本单位Pod详解

 

查询 Pod

Pod 信息查询的命令有多个,查询的详细度也不一样:

  • 查询默认命名空间 default 的所有 Pod
kubectl get pod
  • 查询指定 Pod 的信息
kubectl get pod expod
  • 对 Pod 状态进行持续监控
kubectl get pod -w
  • 显示更多概要信息
kubectl get pod -o wide
kubernetes的基本单位Pod详解

 

比简要信息多显示集群内 IP 地址、所属 node

  • 按照指定格式输出 Pod 信息
kubectl get pod expod -o yaml
  • 最详细信息显示,包括 Event
kubectl describe pod expod

这是最常用的资源信息查询命令,显示信息比较全面,包括资源的基本信息、容器信息、准备情况、存储卷信息和相关的事件列表。在资源部署的时候,如果遇到问题,可以用这个命令查询详情,分析错误原因。

  • 查询Pod的日志信息
kubectl logs Pod名称

修改 Pod

修改已存在的 Pod 属性可以使用 replace 命令

kubectl replace -f pod的yaml文件

我们修改一下前面创建 Pod 的 yaml 文件,把输出 “Hello Kubernetes!" 修改为 "Hello Kubernetes replaced!"。

# expod.yml

apiVersion: v1
kind: Pod
metadata:
  name: expod
spec:
  containers:
  - name: expod-container
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c']
    args: ['echo "Hello Kubernetes replaced!"; sleep 3600']

Pod 有很多属性是无法修改的,如果一定要修改,需要加上 --force 参数,相当于重建 Pod。

kubectl replace -f expod.yml --force

可以看一下命令输出结果

kubernetes的基本单位Pod详解

 

先删除了 expod 这个 Pod,然后创建一个替换的 expod 的 Pod,我们再查看以下 Pod 的日志。

kubectl logs expod
kubernetes的基本单位Pod详解

 

可以看到 Pod 信息已经修改了。

删除 Pod

删除 Pod 非常简单,执行以下命令即可:

kubectl delete pod expod

如果我们是通过 Pod 模板文件创建的,推荐使用基于模板文件的删除命令。

kubectl delete -f expod.yml

Pod 与容器

我们可能已经发现了,Pod 模板和 Docker-Compose 非常相似,但是 Pod 模板可以配置的参数更多、更复杂。

Pod 创建容器的方式

在 Pod 模板的 Containers 部分,指明容器的部署方式,在部署的过程中会转换成对应的容器运行命令,就以我们最开始的 Pod 模板为例:

apiVersion: v1
kind: Pod
metadata:
  name: expod
spec:
  containers:
  - name: expod-container
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c']
    args: ['echo "Hello Kubernetes!"; sleep 3600']

在 kubernetes 进行调度的时候,会执行如下命令:

docker run --name expod-container busybox sh -c 'echo "Hello Kubernetes!"; sleep 3600'

command 和 args 的设置会分别覆盖 Docker 镜像中定义的 EntryPoint 与 CMD。

Pod 组织容器的方式

Pod 是由各个容器组成的一个整体,同时调度到某台 Node 上,容器之间可以共享资源、网络环境和依赖,并拥有相同的生命周期。

容器如何组成一个 Pod

每个 Pod 都包含一个或一组密切相关的业务容器,但是还有一个成为”根容器“的特殊 Pause 容器。Pause 容器是属于 Kubernetes 的一部分,如果一组业务容器作为一个整体,我们很难对整个容器进行判断,假如一个业务组容器当中的某个容器挂载了能代表整个 Pod 都挂载了吗?如果引入一个和业务无关的 Pause 容器,用它作为 Pod 的根容器,用它的状态代表整组容器的状态,就能解决这个问题。而且一个 Pod 中的所有容器都共享 Pause 容器的 IP 地址及其挂载的存储卷,这样也简化了容器之间的通信和数据共享问题,类似于 Docker 容器网络的 Container 模式。

我们在开始创建的 Pod,可以登录上对应的 Node 机器,查看容器信息。

kubectl get pod -o wide
kubernetes的基本单位Pod详解

 

登录 k8s-node2 以后,执行 docker ps 命令查看详细信息:

kubernetes的基本单位Pod详解

 

可以看到有三个 pause 容器,其中两个是 flannel 和 proxy 容器,还有一个是我们的 expod 的容器,它与另一个 expod 容器共同组成了一个 Pod。

Pod 中的容器共享两种资源-存储和网络。

  • 存储

在 Pod 里面,我们可以指定一个或者多个存储卷,Pod 中的所有容器都可以访问这些存储卷,存储卷可以分为临时和持久化两种。

kubernetes的基本单位Pod详解

 

  • 网络

在 kubernetes 集群中,每个 Pod 都分配了唯一的 IP 地址,Pod 中的容器都共享网络命名空间,包括 IP 地址和网络端口。在 Pod 内部各容器之间可以通过 localhost 互相通信。我们可以对比一下 Docker 和 kubernetes 在网络空间上的差异。

kubernetes的基本单位Pod详解

Docker的网络空间

从图中可以看出,容器之间通过docker0网卡连接,每个容器拥有独立的内部网络地址

kubernetes的基本单位Pod详解

kubernetes 的网络空间

从图中可以看出,Pod 中的所有容器共享一个网络地址

Pod 之间如何通信

Pod 之间的通信主要分为两种情况:

  • 同一个 Node 上 Pod 之间的通信

同一个 Node 上的 Pod 使用的都是相同的网桥( docker0 )进行连接,相当于 Docker 的网络空间,只不过是以 Pod 为基础。每个 Pod 都有一个全局 IP 地址,同一个 Node 内不同 Pod 之间通过 veth 连接在同一个 docker0 网桥上,其 IP 地址都是从 docker0 网桥上动态获取的,并且关联在同一个 docker0 网桥上,地址段也相同,所以它们之间能直接通信。

  • 不同 Node 之间的 Pod 通信

要实现不同 Node 的 Pod 之间通信,首先要保证 Pod 在一个 kubernetes 集群中拥有全局唯一的 IP 地址。又因为一个 Node 上的 Pod 是通过 Docker 网桥与外部进行通信的,所以只要将不同 Node 上的 Docker 网桥配置成不同的 IP 地址段就可以实现这个功能。 Flannel 会配置 Docker 网桥,通过修改 Docker 的启动参数 bip 来实现这一点,这样就使得集群中机器的 Docker 网桥就得到了全局唯一的 IP 地址段,机器上所创建的容器也就拥有了全局唯一的 IP 地址。

kubernetes的基本单位Pod详解

跨 Node 的 Pod 之间的通信

我们在搭建 kubernetes 集群的时候,在每个 Node 机器上都创建了一个 kube-flannel 容器,这是在每个 Node 机器上使用 Flannel 虚拟网卡接管容器并跨主机通信,当一个节点的容器访问另一个节点的容器时,源节点上的数据会从 docker0 网桥路由到 flannel0 网卡,在目的节点处会从 flannel0 网卡路由到 docker0 网桥,然后再转发给目标容器。Flannel 重新规划了容器集群的网络,这样既保证了容器 IP 的全局唯一性,又让不同机器上的容器能通过内网 IP 地址互相通信。但是,容器的 IP 地址并不是固定的,Flannel 只分配子网段,所以容器的 IP 地址是在此网段的范围内进行动态分配的。

因为 Pod 的 IP 地址本身是虚拟 IP,所以只有 kubernetes 集群内部的机器( Master 和 Node )和其他 Pod 可以直接访问这个 IP 地址,集群之外的机器无法直接访问 Pod 的 IP 地址。我们创建了一个 Nginx Pod:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: exnginx
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - name: nginxport
      containerPort: 80

通过命令创建后查询以下 IP 地址:

[root@k8s-master]# kubectl apply -f exnginx.yml
[root@k8s-master]# kubectl get pod -o wide
kubernetes的基本单位Pod详解

 

集群中的所有机器和 Pod 都可以访问这个虚拟地址和 containerPort 暴露的端口

[root@k8s-master]# curl http://10.244.1.6
kubernetes的基本单位Pod详解

 

同时我们看到我们有两个 Pod,一个在 Node1 上,一个在 Node2 上,而 Node2 上的 Pod IP 地址是10.244.2.6,Node1 上的 Pod IP 地址是10.244.1.6,登录到两台机器上,使用 ifconfig flannel.1 命令查看集群子网段。

kubernetes的基本单位Pod详解

k8s-node1


kubernetes的基本单位Pod详解

K8s-node2

要使集群外的机器访问 Pod 提供的服务,后面我们会介绍 Service 和 Ingress 来发布服务。

Pod 的生命周期

Pod 的状态

kubernetes的基本单位Pod详解

 

一旦开始在集群节点中创建 Pod,首先就会进入 Pending 状态,只要 Pod 中的所有容器都已启动并正常运行,则 Pod 接下来会进入 Running 状态,如果 Pod 被要求终止,且所有容器终止退出时的状态码都为0,Pod 就会进入 Succeeded 状态。

如果进入 Failed 状态,通常有以下3种原因。

  • Pod 启动时,只要有一个容器运行失败,Pod 将会从 Pending 状态进入 Failed 状态。
  • Pod 正处于 Running 状态,若 Pod 中的一个容器突然损坏或者在退出时状态码不为0,Pod 将会从 Running 进入 Failed 状态。
  • 在要求 Pod 正常关闭的时候,只要有一个容器退出的状态码不为0,Pod 就会进入 Failed 状态。

Pod 的重启策略

在配置 Pod 的模板文件中有个 spec 模块,其中有一个名为 restartPolicy 的字段,字段的值为 Always、OnFailure、Never。Node 上的 kubelet 通过 restartPolicy 执行重启操作,由 kubelet 重新启动的已退出容器将会以递增延迟的方式(10s,20s,40s,...)尝试重新启动,上限时间为 5min,延时的累加值会在成功运行 10min 后重置,一旦 Pod 绑定到某个节点上,就绝对不会重新绑定到另一个节点上。

重启策略对 Pod 状态的影响如下:

  • 假设有1个运行中的 Pod,包含1个容器,容器退出成功后。

Always:重启容器,Pod 状态仍为 Running。

OnFailure:Pod 状态变为 Completed。

Never:Pod 状态变为 Completed。

  • 假设有1个运行中的 Pod,包含1个容器,容器退出失败后。

Always:重启容器,Pod 状态仍为 Running。

OnFailure:重启容器,Pod 状态仍为 Running。

Never:Pod 状态变为 Failed。

  • 假设有1个运行中的 Pod,包含2个容器,第1个容器退出失败后。

Always:重启容器,Pod 状态仍为 Running。

OnFailure:重启容器,Pod 状态仍为 Running。

Never:不会重启容器,Pod 状态仍为 Completed。

  • 假设第1个容器没有运行起来,而第2个容器也退出了。

Always:重启容器,Pod 状态仍为 Running。

OnFailure:重启容器,Pod 状态仍为 Running。

Never:Pod 状态变为 Failed。

  • 假设有1个运行中的 Pod,包含1个容器,容器发生内存溢出后。

Always:重启容器,Pod 状态仍为 Running。

OnFailure:重启容器,Pod 状态仍为 Running。

Never:记录失败事件,Pod 状态变为 Failed。

Pod 的创建于销毁过程

Pod 的创建过程:

  • kubectl 命令将转换为对 API Server 的调用。
  • API Server 验证请求并将其保存到 etcd 中。
  • etcd 通知 API Server。
  • API Server 调用调度器。
  • 调度器决定在哪个节点上运行 Pod,并将其返回给 API Server。
  • API Server 将其对应节点保存到 etcd 中。
  • etcd 通知 API Server。
  • API Server 在相应的节点中调用 kubelet。
  • kubelet 与容器运行时 API 发生交互,与容器守护进程通信以创建容器。
  • kubelet 将 Pod 状态更新到 API Server 中。
  • API Server 把最新的状态保存到 etcd 中。

Pod 的销毁过程:

  • 用户发送删除 Pod 的命令。
  • 将会更新 API Server 中的 Pod 对象,设定 Pod 被”销毁“完成的大致时间(默认 30s),超出这个宽限时间 Pod 将被强制终止。
  • 同时触发以下操作:Pod 被标记为 Terminating。kubelet 发现 Pod 已标记为 Terminating 后,将会执行 Pod 关闭过程。Endpoint 控制器监控到 Pod 即将删除,将溢出所有 Service 对象中与该 Pod 相关的 Endpoint。
  • 如果 Pod 定义了 preStop 回调,则这会在 Pod 中执行,如果宽限时间到了 preStop 还在运行,则会通知 API Server增加少量宽限时间(2s)。
  • Pod 中的进程接收到 TERM 信号。
  • 如果宽限时间过期,Pod 中的进行仍在运行,则会被 SIGKILL 信号终止。
  • kubelet 通过 API Server 设置宽限时间为 0(立即删除),完成 Pod 的删除操作,Pod 从 API 中移除。

删除操作的延迟时间默认为 30s。kubectl delete 命令支持--grace-period=秒,用户可以自定义延迟时间。如果这个值设置为0,则表示强制删除 Pod,但是在使用--grace-period=0 时需要增加选项 --force 才能执行强制删除。

Pod 的生命周期时间

Pod 在整个运行过程中,会有两个大的阶段,第一阶段是初始化容器运行阶段,第二阶段是正式容器运行阶段,每个阶段都会有不同的事件

初始化容器运行阶段

Pod 中可以包含一个或者多个初始化容器,这些容器是在应用程序容器正式运行之前运行的,主要负责一些初始化工作,所有初始化容器执行完后才能执行应用程序容器,因此初始化容器不能是长期运行的容器,而是执行完一定操作后就必须结束的。如果是多个初始化容器,只能顺序执行,不能同时运行。在应用程序容器开始前,所有初始化容器都必须正常结束。

初始化容器执行失败时,如果 restartPolicy 是 OnFailure 或者 Always,那么会重复执行失败的初始化容器,直到成功;如果 restartPolicy 是 Never,则不会重启失败的初始化容器。

下面我们举一个例子,在部署应用程序前,检测 db 是否就绪,并执行以下初始化脚本。

apiVersion: v1
kind: Pod
metadata:
  name: expodinitcontainer
spec:
  containers:
  - name: maincontainer
    image: busybox
    command: ['sh', '-c']
    args: ['echo "maincontainer is running!"; sleep 3600']
  initContainers:
  - name: initdbcheck
    image: busybox
    command: ['sh', '-c']
    args: ['echo "checking db!"; sleep 30; echo "checking done!"']
  - name: initscript
    image: busybox
    command: ['sh', '-c']
    args: ['echo "init script exec!"; sleep 30; echo "init script exec done!"']

这里包含一个主容器,两个初始化容器,每个初始化容器执行 30s,接下来我们创建一下 Pod,再查看他们的状态:

kubectl apply -f expodinitcontainers.yml

在 30s 内执行第一个初始化容器,所以 Pod 状态是 Init:0/2,在 30s-60s 之间执行第二个初始化容器,所以 Pod 状态是 Init:1/2,当所有初始化容器执行完毕后,状态会先变为 PodInitializing,然后变为 Running 状态。通过 kubectl describe 命令查看 Pod 详细信息,可以看到先执行 initdbcheck,然后执行 initscript,最后才运行 maincontainer。

kubernetes的基本单位Pod详解

 

正式容器运行阶段

正式容器创建成功后,就会触发 PostStart 事件,在容器运行的过程中,可以设置存活探针和就绪探针来持续监测容器的健康状况,在容器结束前,会触发 PreStop 事件。

  • PostStart:容器刚创建成功后,触发此事件,如果回调执行失败,则容器会被终止,然后根据重启策略决定是否要重启该容器。
  • PreStop:容器开始和结束前,触发此事件,无论执行结果如何,都会结束容器。

回调的方式有两种:Exec 执行一段脚本和 HttpGet 执行特定的请求。

  • Exec 回调会执行特定的命令,如果 Exec 执行的命令最后正常退出,则代表执行成功;否则就认为执行异常,配置方式如下:
postStart/preStop:
  exec:
    command: xxxxx  # 命令列表
  • HttpGet 回调会执行特定的 Http 请求,通过返回的状态码来判断该请求执行是否成功,配置方式如下:
postStart/preStop:
  httpGet:
    host: xxxx # 请求的 IP 地址或域名
    port: xx # 请求的端口号
    path: xxxxxx # 请求的路径,比如github.com/xingxingzaixian,"/xingxingzaixian"就是路径
    scheme: http/https # 请求的协议,默认为 HTTP

我们来举例使用一下 PostStart 和 PreStop 事件

apiVersion: v1
kind: Pod
metadata:
  name: expodpostpre
spec:
  containers:
  - name: postprecontainer
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c']
    args: ['echo "Hello Kubernetes!"; sleep 3600']
    lifecycle:
      postStart:
        httpGet:
          host: www.baidu.com
          path: /
          port: 80
          scheme: HTTP
      preStop:
        exec:
          command: ['sh', '-c', 'echo "preStop callback done!"; sleep 60']

postStart 中我们执行 HttpGet 回调,访问了百度首页,preStop 则执行命令输出一段文本,然后停留 60s。我们执行创建命令,观察一下 Pod 的状态。

kubectl apply -f expodpostpre.yml

正常情况下是和之前的是一样的,我们做一些测试操作,例如把 postStart 的网址写一个不可访问的网址,比如:

host: www.fackbook.com

创建后,查看日志信息

kubectl logs expodpostpre
kubernetes的基本单位Pod详解

 

还可以通过 kubectl describe 来查看详细情况

kubernetes的基本单位Pod详解

 

Pod 的健康检查

在容器运行的过程中,我们可以通过探针来持续检查容器的状况,kubernetes 为我们提供了两种探针:存活探针、就绪探针。

  • 存活探针livenessProbe:检测容器是否正在运行,如果返回 Failure,kubelet 会终止容器,然后容器会按照重启策略执行。如果没有提供存活探针,默认状态就是 Success。
  • 就绪探针readlinessProbe:检测容器是否已经可以启动了应用服务,如果返回 Failure,Endpoint 控制器就会从所有 Service 的 Endpoint 中移除此 Pod 的 IP 地址。从容器启动到第一次探测之前,默认的就绪状态是 Failure。如果没有提供就绪探针,默认状态就是 Success。

容器配置当中有 3 种方法来执行探针检测:exec、tcpSocket、httpGet。

  • exec:在容器内部执行指定的命令,如果命令以状态码“0”退出,则表示诊断成功。配置如下:
livenessProbe/readlinessProbe:
  exec:
    command: [xxxx] # 命令列表
  • tcpSocket:对容器的指定端口执行 TCP 检测。如果端口是打开的,则诊断成功。配置如下:
livenessProbe/readlinessProbe:
  tcpSocket:
    port: Number # 指定端口号
  • httpGet:对容器内的 HTTP 服务进行检测,如果响应的状态码范围为 200~400,则诊断成功。配置如下:
livenessProbe/readlinessProbe:
  httpGet:
    port: Number # 指定的端口号
    path: String # 指定路径

下面举几个例子来展示一下探针的使用。

存活探针的使用

apiVersion: v1
kind: Pod
metadata:
  name: expodlive
spec:
  containers:
  - name: livecontainer
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c']
    args: ['mkdir /files_dir; echo "Hello Kubernetes!" > /files_dir/newfile; sleep 3600']
    livenessProbe:
      exec:
        command: ['cat', '/files_dir/newfile']

先创建一个文件夹 files_dir,再新建一个文件 newfile,写入 Hello Kubernetes! 内容,然后在存活探针中使用 cat 查看文件内容。执行创建 Pod 命令:

kubectl apply -f expodlive.yml
kubernetes的基本单位Pod详解

 

目前 Pod 运行一切正常,现在我们可以做一些破坏性的操作,进入 Pod 内部,删除 newfile 文件。

[root@k8s-master]# kubectl exec -it expodlive -- /bin/sh
/# rm -f /files_dir/newfile
/# exit

由于探针定期检查 /files_dir/newfile 文件是否存在,而我们的 Pod 默认是异常后重启,因此可以通过以下命令查看 Pod 详细信息:

kubectl describe pods expodlive
kubernetes的基本单位Pod详解

 

可以看到 Event 中打印了存活探针的运行情况:存活探针失败,并且准备重启。

就绪探针的使用

apiVersion: v1
kind: Pod
metadata:
  name: expodread
spec:
  containers:
  - name: readcontainer
    image: nginx
    imagePullPolicy: IfNotPresent
    ports:
    - name: portnginx
      containerPort: 80
    readinessProbe:
      httpGet:
        port: 80
        path: /

我们创建了一个 Nginx 容器,通过 containerPort 属性,将 80 端口暴露出来,然后设置一个就绪探针定期向 80 端口发送 HttpGet 请求,检测响应范围是否为 200~400。使用 apply 命令创建成功后,我们同样要进行一些测试性的操作。

[root@k8s-master]# kubectl apply -f expodread.yml
[root@k8s-master]# kubectl exec -it expodread -- /bin/sh
/# nginx -s stop
kubernetes的基本单位Pod详解

 

执行 nginx -s stop 命令后,容器就会退出,因为 Nginx 容器是持续提供服务的,服务停止后,容器就异常了,然后 kubernetes 又会重新拉起一个容器,在这个过程当中,我们使用 kubectl get pod 命令就会发现,容器的状态先变为 Completed,然后变为 CrashLoopBackOff,最后变为 Running。

kubernetes的基本单位Pod详解

 

对于初学者来讲,总是分不清存活探针和就绪探针的区别,什么情况下该使用存活探针?什么情况下应该使用就绪探针?我给的建议如下:

  • 如果容器中的进程能够在遇到问题或异常的情况下自行崩溃,就像刚才的 Nginx 容器,那么不一定需要存活探针,kubelet 会根据 Pod 的重启策略自动执行正确的操作。
  • 如果想在探测失败时终止并重启容器,则可以指定存活探针,并将重启策略设置为 Always 或 OnFailure。
  • 如果只想在探针成功时才对 Pod 发送网络请求,则可以指定就绪探针,例如 HttpGet。
  • 如果容器需要在启动期间处理大型数据、配置文件或迁移,就使用就绪探针。

对于每种探针,还可以设置 5 个参数:

  • initialDelaySeconds:启动容器后首次监控检测的等待时间,单位为秒。
  • timeoutSeconds:发送监控检测请求后等待响应的超时时间,单位为秒,如果超时就认为探测失败,默认值为 10s。
  • periodSeconds:探针的执行周期,默认 10s 执行一次。
  • successThreshold:如果出现失败,则需要连续探测成功多次才能确认诊断成功。默认值为1.
  • failureThreshold:如果出现失败,则要连续失败多次才重启 Pod(对于存活探针)或标记为 Unready(对于就绪探针)。默认值为3。

具体设置方法如下:

livenessProbe/readinessProbe:
  exec/tcpSocket/httpGet:
    initialDelaySeconds: Number
    timeoutSeconds: Number
    periodSeconds: Number
    successThreshold: Number
    failureThreshold: Number

总结

这篇文章我们主要讲了 Pod 的增删改查,Pod 与容器的关系,如何组织容器,Pod 的生命周期及对应事件,以及 Pod 的健康检查机制。



Tags:kubernetes   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  Tags: kubernetes  点击:(21)  评论:(0)  加入收藏
当我们通过kubectl来查看、修改Kubernetes资源时,有没有想过后面的接口到底是怎样的?有没有办法探查这些交互数据呢?Kuberenetes客户端和服务端交互的接口,是基于http协议的。所...【详细内容】
2021-11-23  Tags: kubernetes  点击:(29)  评论:(0)  加入收藏
在今年的NGINX Sprint 2.0虚拟大会上,NGINX(来自流行的开源web服务器/负载均衡器和反向代理背后的公司F5),发布了NGINX现代应用参考架构(MARA)。该公司在一篇博客文章中说,这将帮...【详细内容】
2021-09-26  Tags: kubernetes  点击:(60)  评论:(0)  加入收藏
虚拟节点(Virtual Node)实现了Kubernetes与弹性容器实例ECI的无缝连接,让Kubernetes集群轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。您可以灵活动态的按需创建ECI...【详细内容】
2021-04-15  Tags: kubernetes  点击:(231)  评论:(0)  加入收藏
针对越来多的Kubernetes容器云,对Kubernetes集群的故障排查却成了一个棘手问题。本文虫虫给大家以直观图示方式介绍如何排查Kubernetes的故障。该篇是系列文章续—&mdas...【详细内容】
2020-12-22  Tags: kubernetes  点击:(129)  评论:(0)  加入收藏
在过去几年,Kubernetes 在容器编排市场独占鳌头。自 2016 年以来,Docker Swarm 就退出了主要竞争者的行列,并且像 AWS 一样承诺对 K8s 进行支持和集成,换句话说,它承认了失败。目...【详细内容】
2020-11-30  Tags: kubernetes  点击:(126)  评论:(0)  加入收藏
写在前面要出发周边游(以下简称要出发)是国内知名的主打「周边游」的在线旅行网站,为了降低公司内部各个业务模块的耦合度,提高开发、交付及运维效率,我们在 2017 年就基于 Sprin...【详细内容】
2020-11-27  Tags: kubernetes  点击:(156)  评论:(0)  加入收藏
kubernetes的集群搭建有多种方式:二进制、kubeadm、ansible自动化、minikube。minikube方式比较简单,但是只是单节点,适合学习kubernetes基础的时候使用。其他的方式安装都会...【详细内容】
2020-11-10  Tags: kubernetes  点击:(117)  评论:(0)  加入收藏
背景: 前端Pod 需要 访问 后端Pod ,可以采用service 的DNS 解析 ,为Kubernetes集群里的容器提供DNS服务,用于解析service名称一、部署CoreDNS Pod CoreDNS 是用于service做dns...【详细内容】
2020-11-03  Tags: kubernetes  点击:(70)  评论:(0)  加入收藏
如果我们想要构建和运行一个现代的云基础设施,那么理解Docker和Kubernetes是必不可少的。本文主要给大家介绍Docker和Kubernetes技术以及它们之间的区别和联系。一、Docker1....【详细内容】
2020-10-19  Tags: kubernetes  点击:(81)  评论:(0)  加入收藏
▌简易百科推荐
一、为什么要搭建主从架构呢1.数据安全,可以进行数据的备份。2.读写分离,大部分的业务系统来说都是读数据多,写数据少,当访问压力过大时,可以把读请求给到从服务器。从而缓解数据...【详细内容】
2021-12-15  实战Java    Tags:Docker   点击:(10)  评论:(0)  加入收藏
在网页中渲染公式一直是泛学术工具绕不开的一个功能,最近更新产品功能,正巧遇到了这个需求,于是使用容器方式简单实现了一个相对靠谱的公式渲染服务。分享出来,希望能够帮到有类...【详细内容】
2021-12-01  编程菌zfn    Tags:Docker   点击:(10)  评论:(0)  加入收藏
1.1 docker命令直接部署1.1.1 拉取镜像docker pull wurstmeister/zookeeperdocker pull wurstmeister/kafka1.1.2 启动zookeeper容器docker run -d --name myzookeeper -p 2...【详细内容】
2021-11-15  无    Tags:docker   点击:(47)  评论:(0)  加入收藏
01 前言 顺着docker的发展,很多测试的同学也已经在测试工作上使用docker作为环境基础去进行一些自动化测试,这篇文章主要讲述我们在docker中使用浏览器进行自动化测试如果可以...【详细内容】
2021-10-29  小码哥聊软件测试    Tags:Docker   点击:(42)  评论:(0)  加入收藏
因为你懂得的原因,下载docker镜像速度非常喜感,故收集几个国内常用的docker镜像。Docker中国区官方镜像地址:https://registry.docker-cn.com网易163的镜像http://hub-mirror.c...【详细内容】
2021-10-28  抓蛙程序猿    Tags:docker   点击:(48)  评论:(0)  加入收藏
环境:Spring5.3.10通常,应用程序开发人员不需要对ApplicationContext实现类进行子类化。相反,SpringIOC容器可以通过插入特殊集成接口的实现来扩展。使用BeanPostProcessor自定...【详细内容】
2021-10-26  Java网络研发架构师    Tags:Spring   点击:(33)  评论:(0)  加入收藏
我们在很多场景下都需要做笔记,来对抗遗忘,一份好的笔记不仅能在需要的时候供我们查阅,也能帮助我们归纳整理知识提高做事效率。 目前市面上有很多云笔记软件,体验上各有不同,但...【详细内容】
2021-10-11  运维贼船    Tags:docker   点击:(61)  评论:(0)  加入收藏
1. Nacos官网Nacos Docker 快速开始2. Clone 项目git clone https://github.com/nacos-group/nacos-docker.git3. cd 到nacos-docker 路径下 直接启动即可cd nacos-dockerdo...【详细内容】
2021-09-16  程序狗爱化妆    Tags:Nacos   点击:(109)  评论:(0)  加入收藏
今天不做保姆级教程,分享奶爸常用、好用的Docker应用。有了这些Docker,Nas的可玩性会大幅提高,有时候奶爸也在想,刨去官方套件不考虑的话,Nas真的是差不多。如果小伙伴们有需要,后...【详细内容】
2021-09-03  晋升奶爸的垃圾佬    Tags:Docker   点击:(167)  评论:(0)  加入收藏
环境要求 ubuntu系统:20.04 docker版本:20.10.7 redis版本:6.0.6步骤由于我这里已经有相应的redis镜像,这里就不记录了,关于docker一些基础知识可以看我以前的笔记开启3台re...【详细内容】
2021-07-26  石老师小跟班    Tags:Redis主从复制   点击:(117)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条