- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
Kubernetes 中的 生命周期钩子(Lifecycle Hooks) 是在容器生命周期的特定阶段执行操作的机制。通过钩子,可以在容器启动后(PostStart)或停止前(PreStop)执行一些初始化或清理工作.
SIGTERM
)时触发执行。钩子支持以下两种执行方式:
exec
: 直接在容器内部运行指定命令。httpGet
: 通过 HTTP GET 请求调用一个端点。钩子定义的基本结构:
lifecycle:
postStart:
exec:
command: ["sh", "-c", "echo 'Container started'"]
preStop:
exec:
command: ["sh", "-c", "echo 'Container stopping'; sleep 5"]
就比如下面的例子:
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: nginx
image: nginx:1.21.1
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- |
echo "PostStart hook triggered! Initializing...";
sleep 3
preStop:
exec:
command:
- "/bin/sh"
- "-c"
- |
echo "PreStop hook triggered! Cleaning up...";
sleep 5
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "250m"
PostStart
钩子立即执行。PostStart
钩子通过 echo
输出一条日志并等待 3 秒。kubectl delete pod
或 kubectl scale
)时,PreStop
钩子立即执行。PreStop
钩子输出一条日志并等待 5 秒,模拟资源清理。terminationGracePeriodSeconds
控制,默认宽限时间为 30 秒。如果 PreStop
未在宽限时间内完成,容器将被强制终止。通过合理利用 Kubernetes 钩子,可以在容器生命周期的不同阶段完成初始化和清理操作,从而提升应用的可靠性和自动化水平.
Kubernetes 中的探针(Probes)用于检测容器的健康状态和服务状态。通过探针,Kubernetes 可以决定容器是否能够接受流量或者是否需要重启,从而提高应用的可用性和可靠性.
通过向容器的特定 HTTP 端点发送请求检测健康状态:
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
运行容器内部的命令,并根据退出码判断健康状态.
0
表示成功,非 0
表示失败:livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 10
检查容器指定端口的连通性:
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 5
periodSeconds: 10
特性 | 探针(Probes) | 钩子(Hooks) |
---|---|---|
作用 | 持续检查容器的健康状态和服务状态 | 在容器生命周期的特定时间点执行一次性操作 |
触发时机 | 周期性运行,贯穿容器生命周期 | 容器启动后或终止前的一次性操作 |
结果影响 | 可能触发容器重启或移除服务负载均衡 | 不直接影响容器状态,只执行指定逻辑 |
常见用途 | 健康检查、故障恢复、负载均衡 | 初始化操作(postStart )或清理任务(preStop ) |
在 Kubernetes 中,使用 控制器 而不是直接使用 Pod 是因为控制器提供了更强的自动化管理和可靠性。控制器(如 ReplicaSet、Deployment 等)可以自动管理 Pod 的副本,确保应用始终有正确数量的 Pod 运行。当 Pod 失败或被删除时,控制器会自动替代,保证服务的高可用性。而直接使用 Pod 无法做到这一点,必须手动监控和管理.
控制器支持 滚动更新 和 回滚,使得应用更新时可以逐个更新 Pod,避免中断服务并能在出现问题时快速回滚。控制器还支持 自动扩缩容,根据负载自动调整 Pod 数量,这对于应对动态流量非常重要.
控制器提供了 自愈能力,当 Pod 失败时,控制器会自动重启或替换,减少人工干预。同时,控制器能够集成与其他 Kubernetes 资源(如服务、存储和网络策略)无缝工作,实现更高效的资源管理。控制器的 声明式管理 可以简化配置和操作,避免手动干预 Pod 的创建和管理,使得 Kubernetes 集群的管理更加灵活和自动化。因此,使用控制器管理 Pod 能提供更高的可靠性、自动化和灵活性.
在 Kubernetes 中,ReplicaSet、Deployment、StatefulSet、DaemonSet、Job 和 CronJob 是常见的工作负载资源类型,它们用于管理不同场景下的 Pod 生命周期.
资源类型 | 是否有状态 | 适用场景 | 特点 |
---|---|---|---|
ReplicaSet | 无状态 | 简单副本管理 | 确保 Pod 副本数量一致,但功能较基础 |
Deployment | 无状态 | 动态扩缩容、版本管理 | 支持滚动更新、回滚等高级功能 |
StatefulSet | 有状态 | 有状态服务(数据库、消息队列) | 保持 Pod 的固定身份和持久存储 |
DaemonSet | 无状态 | 节点级任务(监控、日志收集) | 确保每节点运行一个 Pod |
Job | 无状态 | 一次性任务(数据迁移、备份) | 任务完成后 Pod 停止运行 |
CronJob | 无状态 | 定时任务(备份、清理) | 按时间表定期创建 Job |
注:下面的代码案例会引入上文提到的钩子和探针.
ReplicaSet(下面简称RS) ,用于确保指定数量的 Pod 副本始终在集群中运行,可以提供简单的无状态服务,用作 Deployment 的底层组件。一般情况下,RS控制器能做的事情,Deployment控制器都能做,而且Deployment比RS功能更多,更高级。我的建议是可以拿RS来写yaml文件提升自己对控制器的理解.
replicas
:期望的副本数量。selector
:选择器,用于匹配需要管理的 Pod 标签。template
:Pod 模板,定义 Pod 的属性。下面提供一个用RS部署nginx的yaml文件案例:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: example-replicaset
labels:
app: rs-nginx
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
initContainers:
- name: init-nginx
image: nginx:1.21.1
imagePullPolicy: IfNotPresent
command:
- "/bin/bash"
- "-c"
- "echo 'container init already!!'; sleep 10"
containers:
- name: my-container
image: nginx:1.21.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
command:
- "/bin/bash"
- "-c"
- "sleep 300"
lifecycle: # 生命周期钩子
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'Container has started';"
preStop:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'Container is stopping'; sleep 5;"
livenessProbe: ##### 存活探针
httpGet:
path: /healthz # 探针检查的路径
port: 80 # 探针检查的端口
initialDelaySeconds: 5 # 首次检查延迟时间
periodSeconds: 10 # 检查间隔时间
timeoutSeconds: 1 # 每次检查的超时时间
failureThreshold: 3 # 连续失败的次数后重启容器
readinessProbe: ##### 就绪探针
httpGet:
path: /ready # 探针检查的路径
port: 80 # 探针检查的端口
initialDelaySeconds: 3 # 首次检查延迟时间
periodSeconds: 5 # 检查间隔时间
timeoutSeconds: 1 # 每次检查的超时时间
failureThreshold: 2 # 连续失败的次数后移出服务流量
这个YAML 配置定义了一个 Kubernetes ReplicaSet,管理 3 个 Nginx 容器副本,确保服务的高可用性。它包含一个初始化容器,在主容器启动前执行初始化任务。主容器暴露端口 80,并配置了生命周期钩子:postStart 在容器启动后执行,preStop 在容器停止前执行。还设置了存活探针和就绪探针,分别用于监控容器健康和是否准备好接受流量,探针配置包括检查路径、延迟时间、检查间隔及失败阈值,确保容器在故障时自动重启或移除流量.
Deployment 是用于声明式管理应用部署的高级控制器,底层依赖于 ReplicaSet。对比与RS控制器,Deployment控制器增加了更新策略以及扩缩容等内容.
特点:
主要字段:
strategy
:更新策略(如滚动更新)。replicas
:Pod 副本数。revisionHistoryLimit
:保留的历史版本数量。下面提供一个用Deployment部署nginx的yaml文件案例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
initContainers:
- name: init-nginx
image: nginx:1.21.1
imagePullPolicy: IfNotPresent
command:
- "/bin/bash"
- "-c"
- "echo 'container init already!!'; sleep 10"
containers:
- name: my-container
image: nginx:1.21.1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
command:
- "/bin/bash"
- "-c"
- "sleep 300"
lifecycle: # 生命周期钩子
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'Container has started';"
preStop:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'Container is stopping'; sleep 5;"
livenessProbe: ##### 存活探针
httpGet:
path: /healthz # 探针检查的路径
port: 80 # 探针检查的端口
initialDelaySeconds: 5 # 首次检查延迟时间
periodSeconds: 10 # 检查间隔时间
timeoutSeconds: 1 # 每次检查的超时时间
failureThreshold: 3 # 连续失败的次数后重启容器
readinessProbe: ##### 就绪探针
httpGet:
path: /ready # 探针检查的路径
port: 80 # 探针检查的端口
initialDelaySeconds: 3 # 首次检查延迟时间
periodSeconds: 5 # 检查间隔时间
timeoutSeconds: 1 # 每次检查的超时时间
failureThreshold: 2 # 连续失败的次数后移出服务流量
StatefulSet 专为有状态应用设计,提供稳定的网络标识、持久化存储和有序部署/删除。与前两个我们介绍的控制器不同的是,Statefulset控制器更适合用于部署需要数据长期存储的Pod或者固定网络标识的资源.
特点:
my-app-0
, my-app-1
)。适用场景:
下面提供一个用Deployment部署nginx的yaml文件案例(通过上面两个控制器,我们已经了解了探针和钩子的原理和使用方法,接下来展示的yaml案例将不再加入探针和钩子的内容,方便我们更能直观的观察各个控制器的区别!):
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: example-statefulset
spec:
serviceName: "example"
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 1Gi
DaemonSet 确保每个节点(或符合条件的节点)上都运行一个 Pod。这个控制器非常适用于监控或者是网络插件的部署,但是需要注意在Master主节点上,默认会有一个NoSchedule的污点,需要在yaml添加相对应的容忍度.
可以通过 **kubectl describe node <node_name> **进行查看,如下所示:
[root@master ~]# kubectl describe node master
Name: master
Roles: control-plane
Labels: beta.kubernetes.io/arch=amd64
beta.kubernetes.io/os=linux
kubernetes.io/arch=amd64
kubernetes.io/hostname=master
kubernetes.io/os=linux
node-role.kubernetes.io/control-plane=
node.kubernetes.io/exclude-from-external-load-balancers=
Annotations: kubeadm.alpha.kubernetes.io/cri-socket: unix:///run/containerd/containerd.sock
node.alpha.kubernetes.io/ttl: 0
projectcalico.org/IPv4Address: 192.168.116.131/24
projectcalico.org/IPv4IPIPTunnelAddr: 10.251.205.128
volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp: Fri, 04 Oct 2024 21:33:23 +0800
Taints: node-role.kubernetes.io/control-plane:NoSchedule
Unschedulable: false
Lease:
HolderIdentity: master
AcquireTime: <unset>
RenewTime: Sat, 07 Dec 2024 20:47:33 +0800
Conditions:
Type Status LastHeartbeatTime LastTransitionTime Reason Message
---- ------ ----------------- ------------------ ------ -------
NetworkUnavailable False Tue, 12 Nov 2024 17:22:18 +0800 Tue, 12 Nov 2024 17:22:18 +0800 CalicoIsUp Calico is running on this node
MemoryPressure False Tue, 12 Nov 2024 23:29:12 +0800 Sat, 05 Oct 2024 00:28:44 +0800 KubeletHasSufficientMemory kubelet has sufficient memory available
DiskPressure False Tue, 12 Nov 2024 23:29:12 +0800 Sat, 05 Oct 2024 00:28:44 +0800 KubeletHasNoDiskPressure kubelet has no disk pressure
PIDPressure False Tue, 12 Nov 2024 23:29:12 +0800 Sat, 05 Oct 2024 00:28:44 +0800 KubeletHasSufficientPID kubelet has sufficient PID available
Ready True Tue, 12 Nov 2024 23:29:12 +0800 Sat, 05 Oct 2024 14:45:43 +0800 KubeletReady kubelet is posting ready status
Addresses:
InternalIP: 192.168.116.131
Hostname: master
Capacity:
cpu: 4
ephemeral-storage: 40940Mi
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 3793428Ki
pods: 110
Allocatable:
cpu: 4
ephemeral-storage: 38635831233
hugepages-1Gi: 0
hugepages-2Mi: 0
memory: 3691028Ki
pods: 110
System Info:
Machine ID: 062407b38be842d2ba33e2ad841f7bfb
System UUID: bd814d56-4024-2228-d6f1-0b011fa4eb3e
Boot ID: 6946bb88-fd9a-47f6-8d8d-e9a544e7a50f
Kernel Version: 4.18.0-425.3.1.el8.x86_64
OS Image: Rocky Linux 8.7 (Green Obsidian)
Operating System: linux
Architecture: amd64
Container Runtime Version: containerd://1.6.32
Kubelet Version: v1.28.2
Kube-Proxy Version: v1.28.2
PodCIDR: 10.240.0.0/24
PodCIDRs: 10.240.0.0/24
可以清晰的看到在Taint部分,污点级别是NoSchedule:
[!NOTE] 。
Taints: node-role.kubernetes.io/control-plane:NoSchedule 。
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: example-daemonset
spec:
selector:
matchLabels:
app: my-daemon
template:
metadata:
labels:
app: my-daemon
spec:
containers:
- name: my-container
image: nginx
Job 是专门设计来管理需要在一定时间内完成的单次任务的,如批处理作业、数据库迁移等.
特点:
适用场景:
主要字段:
completions
:任务完成所需成功 Pod 数量。parallelism
:允许同时运行的 Pod 数量。apiVersion: batch/v1
kind: Job
metadata:
name: job-example
spec:
parallelism: 1 # 并发执行的 Pod 数量
completions: 1 # 任务需要完成的 Pod 数量
template:
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "echo 'Task Completed'; sleep 5"]
restartPolicy: OnFailure # Pod 失败时重新启动
CronJob 是 Kubernetes 中 Job 的扩展,用于定期执行任务。它的作用类似于 Linux 系统中的 cron,可以指定任务的执行时间表,自动定期触发并执行 Job.
特点:
适用场景:
主要字段:
schedule
:cron 表达式定义执行时间。jobTemplate
:Job 模板,定义具体任务。apiVersion: batch/v1
kind: CronJob
metadata:
name: cronjob-example
spec:
schedule: "*/5 * * * *" # Cron 表达式,表示每 5 分钟执行一次
jobTemplate:
spec:
template:
spec:
containers:
- name: busybox
image: busybox
command: ["sh", "-c", "echo 'Cron job executed'; sleep 5"]
restartPolicy: OnFailure # Pod 失败时重新启动
最后此篇关于K8S钩子、探针以及控制器完整版的文章就讲到这里了,如果你想了解更多关于K8S钩子、探针以及控制器完整版的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
问题 我想在可由用户添加的表单中实现输入字段的键/值对。 参见 animated gif on dynamic fields . 此外,我想在用户提交表单并再次显示页面时显示保存的数据。 参见 ani
这个问题已经有答案了: The useState set method is not reflecting a change immediately (19 个回答) 已关闭去年。 问题是,在网页中该
这个问题已经有答案了: The useState set method is not reflecting a change immediately (19 个回答) 已关闭去年。 问题是,在网页中该
我对钩子(Hook)相当陌生,我正在尝试实现一个拖放容器组件,该组件在整个鼠标移动过程中处理 onDragStart、onDrag 和 onDragEnd 函数。我一直在尝试使用钩子(Hook)复制此
有人向我介绍了 CSS 钩子(Hook)这个术语,但我对此不是很清楚。你能给我一些想法吗? 什么是 CSS 钩子(Hook)? 最常见的钩子(Hook)是什么? 使用 CSS 钩子(Hook)的最佳做
文档 ( https://devexpress.github.io/testcafe/documentation/test-api/test-code-structure.html#test-hook
问题是包含 PR_Write() 的 DLL 调用的不是 npsr4.dll,而是 nss3.dll 和 Hook 无法从不存在的库中找到 GetProcAddress()。 我正在尝试创建 Fire
我的 git hook 似乎没有工作。即commit-msg来自 gerrit 的钩子(Hook)。 commit-msg Hook 存在于 /.git/hooks/并具有正确的语法。 最佳答案 确保
用gdb调试不熟悉的程序时,程序执行后经常会意外退出next .发生这种情况时,我通常会设置一个断点,重新运行程序并执行 step而不是 next追踪正在发生的事情。但是,有时很难知道在哪里设置断点。
当我创建一个节点时,我希望它以编程方式创建一些引用刚刚创建的节点的节点。 虽然我只需要更改表单的 form_alter 提交函数来调用自定义函数来创建节点。 检查输出 $form_state 我可以看
我是钩子(Hook)的新手,在学习了对类的 react 之后才来,所以有点迷茫。在下面的代码中,我将 setDog 更改为 Husky,然后它应该告诉 API 调用搜索并获取我的哈士奇图片。但是,尽管
我编写(进程中)钩子(Hook)以防止在本地添加 BAD 标记名称: .hg/hgrc : pretag.badtagname = python:.hg/hgcheck.py:localbadtag
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 7年前关闭。 Improve this qu
如果这个问题之前已经得到解答,我提前表示歉意(对于这篇长文,但我已尽力做到具体)。但是,我找到的答案并不完全令我满意。 我想在我的项目中使用新的令人惊叹的 React Hooks。到目前为止我所做的一
通过阅读一些文字,尤其是关于委托(delegate)的iOS文档,所有协议(protocol)方法都被称为 Hook 自定义委托(delegate)对象需要实现。但是其他一些书,命名为 Hook 作为
我的所有依赖项都位于受密码保护的存储库中。 我有一个要求输入用户名和密码的功能,但它经常困扰我。 有没有办法在依赖检索之前执行它? 在大多数情况下,我在本地 maven/gradle 缓存中拥有所有依
当我尝试运行 git commit -m 'message here' 时出现以下错误。 致命:无法执行 '.git/hooks/prepare-commit-msg':权限被拒绝 当我在我的 ubu
当我尝试运行 git commit -m 'message here' 时出现以下错误。 致命:无法执行 '.git/hooks/prepare-commit-msg':权限被拒绝 当我在我的 ubu
我有一个分支和主干的服务器存储库。分支是所有团队成员的存储库。我正在尝试使用 svn hooks仅在我的分支下的 repo 中,但它似乎无法正常工作。以下是我尝试采取的步骤: checkout my_
我正在尝试为我的模块找到一种在安装时创建 anchor 链接的方法。 我目前的策略是创建一个自定义菜单,类似于主菜单、次菜单等并位于其中。在此菜单中,我希望有一个或多个由我的模块定义的链接。然后我希望
我是一名优秀的程序员,十分优秀!