|
OpenKruise
OpenKruise 是 Kubernetes 的一个标准扩展,它可以配合原生 Kubernetes 使用,并为管理应用容器、sidecar、镜像分发等方面提供更加强大和高效的能力。
核心功能
原地升级
原地升级是一种可以避免删除、新建 Pod 的升级镜像能力。它比原生 Deployment/StatefulSet 的重建 Pod 升级更快、更高效,并且避免对 Pod 对其他不需要更新的容器造成干扰。
Sidecar 管理
支持在一个单独的 CR 中定义 sidecar 容器,OpenKruise 能够帮你把这些 Sidecar 容器注入到所有符合条件的 Pod 中。这个过程和 Istio 的注入很相似,但是你可以管理任意你关心的 Sidecar。
跨多可用区部署
定义一个跨多个可用区的全局 workload,容器,OpenKruise 会帮你在每个可用区创建一个对应的下属 workload。你可以统一管理他们的副本数、版本、甚至针对不同可用区采用不同的发布策略。
CRD 列表
-
CloneSet
-
提供更加高效、确定可控的应用管理和部署能力,支持优雅原地升级、指定删除、发布顺序可配置、并行/灰度发布等丰富的策略,可以满足更多样化的应用场景。
-
-
Advanced StatefulSet
-
基于原生 StatefulSet 之上的增强版本,默认行为与原生完全一致,在此之外提供了原地升级、并行发布(最大不可用)、发布暂停等功能。
-
-
SidecarSet
-
对 sidecar 容器做统一管理,在满足 selector 条件的 Pod 中注入指定的 sidecar 容器。
-
-
UnitedDeployment
-
通过多个 subset workload 将应用部署到多个可用区。
-
-
BroadcastJob
-
配置一个 job,在集群中所有满足条件的 Node 上都跑一个 Pod 任务。
-
-
Advanced DaemonSet
-
基于原生 DaemonSet 之上的增强版本,默认行为与原生一致,在此之外提供了灰度分批、按 Node label 选择、暂停、热升级等发布策略。
-
-
AdvancedCronJob
-
一个扩展的 CronJob 控制器,目前 template 模板支持配置使用 Job 或 BroadcastJob。
以上在官方文档都有介绍,本文主要着重实战,先讲CloneSet,其他控制器后面会陆续更新。。。
部署Kruise到Kubernetes集群
这里使用helm来安装Kruise
1、现在kruise Chart
-
wget https://github.com/openkruise/kruise/releases/download/v0.7.0/kruise-chart.tgz
-
tar -zxf kruise-chart.tgz
-
cd kruise
-
[root@ kruise]# ls -l
-
total 16
-
-rw-r
-
-rw-r
-
drwxr-xr-x 2 root root 4096 Dec 23 10:18 templates
-
-rw-r
2、修改values.yaml,默认不用修改也行
3、执行部署
-
[root@qd01-stop-k8s-master001 kruise]# kubectl create ns kruise
-
namespace/kruise created
-
[root@qd01-stop-k8s-master001 kruise]# helm install kruise -n kruise -f values.yaml .
-
W1223 10:22:13.562088 1589994 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
-
。。。。。。。
-
NAME: kruise
-
LAST DEPLOYED: Wed Dec 23 10:22:12 2020
-
NAMESPACE: kruise
-
STATUS: deployed
-
REVISION: 1
-
TEST SUITE: None
-
这里会看到一堆的deprecated信息,因为新版的kubernetes对CRD的版本会淘汰,可以根据自己的集群版本修改CRD的API版本即可
4、检查kruise部署状态
-
[root@qd01-stop-k8s-master001 kruise]# helm ls -n kruise
-
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
-
kruise kruise 1 2020-12-23 10:22:12.963651877 +0800 CST deployed kruise-0.7.0
-
-
可以看到,集群中有的kruise crd类型
-
[root@qd01-stop-k8s-master001 kruise]# kubectl get crd|grep kruise
-
advancedcronjobs.apps.kruise.io 2020-12-23T02:22:13Z
-
broadcastjobs.apps.kruise.io 2020-12-23T02:22:13Z
-
clonesets.apps.kruise.io 2020-12-23T02:22:13Z
-
daemonsets.apps.kruise.io 2020-12-23T02:22:13Z
-
sidecarsets.apps.kruise.io 2020-12-23T02:22:13Z
-
statefulsets.apps.kruise.io 2020-12-23T02:22:13Z
-
uniteddeployments.apps.kruise.io 2020-12-23T02:22:13Z
下面我们开始来使用这些管理器
CloneSet
CloneSet 控制器提供了高效管理无状态应用的能力,它可以对标原生的 Deployment,但 CloneSet 提供了很多增强功能。
Partition 的语义是 保留旧版本 Pod 的数量或百分比,默认为 0。这里的 partition 不表示任何 order 序号。
-
在发布过程中设置了 partition:
-
如果是数字,控制器会将 (replicas - partition) 数量的 Pod 更新到最新版本。
-
如果是百分比,控制器会将 (replicas * (100% - partition)) 数量的 Pod 更新到最新版本。
现在我将上面的例子的 image 更新为 nginx:1.19.6-alpine 并且设置 partition=3
-
kind: CloneSet
-
metadata:
-
labels:
-
app: nginx-2
-
name: nginx-2
-
spec:
-
replicas: 5
-
updateStrategy:
-
type: InPlaceIfPossible
-
inPlaceUpdateStrategy:
-
gracePeriodSeconds: 10
-
partition: 3
-
selector:
-
matchLabels:
-
app: nginx-2
-
template:
-
metadata:
-
labels:
-
app: nginx-2
-
spec:
-
containers:
-
- name: nginx
-
image: nginx:1.19.6-alpine
查看结果
-
Status:
-
Available Replicas: 5
-
Collision Count: 0
-
Label Selector: app=nginx-2
-
Observed Generation: 6
-
Ready Replicas: 5
-
Replicas: 5
-
Update Revision: nginx-2-7b44cb9c8
-
Updated Ready Replicas: 2
-
Updated Replicas: 2
-
Events:
-
Type Reason Age From Message
-
-
Normal SuccessfulUpdatePodInPlace 45m cloneset-controller successfully update pod nginx-2-l54dz in-place(revision nginx-2-5879fd9f7)
-
Normal SuccessfulUpdatePodInPlace 44m cloneset-controller successfully update pod nginx-2-t49mk in-place(revision nginx-2-5879fd9f7)
-
Normal SuccessfulUpdatePodInPlace 43m cloneset-controller successfully update pod nginx-2-b5fdd in-place(revision nginx-2-5879fd9f7)
-
Normal SuccessfulUpdatePodInPlace 43m cloneset-controller successfully update pod nginx-2-jw2zp in-place(revision nginx-2-5879fd9f7)
-
Normal SuccessfulCreate 22m cloneset-controller succeed to create pod nginx-2-zpp8z
-
Normal SuccessfulUpdatePodInPlace 5m22s cloneset-controller successfully update pod nginx-2-zpp8z in-place(revision nginx-2-7b44cb9c8)
-
Normal SuccessfulUpdatePodInPlace 4m55s cloneset-controller successfully update pod nginx-2-jw2zp in-place(revision nginx-2-7b44cb9c8)
-
-
[root@qd01-stop-k8s-master001 demo]# kubectl get pod -L controller-revision-hash
-
NAME READY STATUS RESTARTS AGE CONTROLLER-REVISION-HASH
-
nginx-2-b5fdd 1/1 Running 1 99m nginx-2-5879fd9f7
-
nginx-2-jw2zp 1/1 Running 2 99m nginx-2-7b44cb9c8
-
nginx-2-l54dz 1/1 Running 1 99m nginx-2-5879fd9f7
-
nginx-2-t49mk 1/1 Running 1 99m nginx-2-5879fd9f7
-
nginx-2-zpp8z 1/1 Running 1 19m nginx-2-7b44cb9c8
从输出信息我们可以看到,Update Revision已经更新为nginx-2-7b44cb9c8,而Pod中只有两个Pod升级了。
由于我们设置了 partition=3,控制器只升级了 2 个 Pod。
Partition 分批灰度功能完善了原生的Pod升级方式,使得升级能够进行更灵活,能够进行灰度上线。

(编辑:三门峡站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|