OpenKruise v1.0:云原生应用自动化达到新的高峰
-
应用工作负载:面向无状态、有状态、daemon 等多种类型应用的高级部署发布策略,例如原地升级、灰度流式发布等。
-
Sidecar 容器管理:支持独立定义 sidecar 容器,完成动态注入、独立原地升级、热升级等功能。
-
增强运维能力:包括容器原地重启、镜像预拉取、容器启动顺序保障等。
-
应用分区管理:管理应用在多个分区(可用区、不同机型等)上的部署比例、顺序、优先级等。
-
应用安全防护:帮助应用在 Kubernetes 之上获得更高的安全性保障与可用性防护。
版本解析
Cloud Native
-
可以避免如调度、分配 IP、分配、挂载盘等额外的操作和代价。
-
更快的镜像拉取,因为开源复用已有旧镜像的大部分 layer 层,只需要拉取新镜像变化的一些 layer。
-
当一个容器在原地升级时,Pod 的网络、挂载盘、以及 Pod 中的其他容器不会受到影响,仍然维持运行。
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
...
spec:
replicas: 1
template:
metadata:
annotations:
app-config: "... the real env value ..."
spec:
containers:
- name: app
env:
- name: APP_CONFIG
valueFrom:
fieldRef:
fieldPath: metadata.annotations['app-config']
updateStrategy:
type: InPlaceIfPossible
-
当用户需要使用 SidecarSet 的 imagePullSecrets 能力时,要先重复地在相关 namespaces 中创建对应的 Secret,并且需要确保这些 Secret 配置的正确性和一致性。
-
当用户想要采用 ConfigMap 来配置一些通用的环境变量时,往往需要在多个 namespaces 做 ConfigMap 的下发,并且后续的修改往往也要求多 namespaces 之间保持同步。
云原生应用自动化管理套件、CNCF Sandbox 项目 -- OpenKruise,近期发布了 v1.0 大版本。 apiVersion: apps.kruise.io/v1alpha1
kind: ResourceDistribution
metadata:
name: sample
spec:
resource:
apiVersion: v1
kind: ConfigMap
metadata:
name: game-demo
data:
...
targets:
namespaceLabelSelector:
...
# or includedNamespaces, excludedNamespaces
-
容器 A 先启动,启动成功后才可以启动 容器 B
-
容器 B 先退出,退出完成后才可以停止 容器 A
-
对于任意一个 Pod 对象,只需要在 annotations 中定义 apps.kruise.io/container-launch-priority: Ordered,则 Kruise 会按照 Pod 中 containers 容器列表的顺序来保证其中容器的串行启动。
-
如果要自定义 containers 中多个容器的启动顺序,则在容器 env 中添加 KRUISE_CONTAINER_PRIORITY 环境变量,value 值是范围在 [-2147483647, 2147483647] 的整数。一个容器的 priority 值越大,会保证越先启动。
rollout undo cloneset
kubectl kruise rollout undo cloneset/nginx
# rollout status advanced statefulset
kubectl kruise rollout status statefulsets.apps.kruise.io/sts-demo
# set image of a cloneset
set image cloneset/nginx busybox=busybox nginx=nginx:1.9.1 kubectl kruise
-
通过 scaleStrategy.maxUnavailable 策略支持流式扩容
-
Stable revision 判断逻辑变化,当所有 Pod 版本与 updateRevision 一致时则标记为 currentRevision
-
支持接管存量 Pod 到匹配的 subset 分组中
-
优化 webhook 在 Pod 注入时的更新与重试逻辑
-
支持对 Daemon Pod 做原地升级
-
引入 progressive annotation 来选择是否按 partition 限制 Pod 创建
-
解决 SidecarSet 过滤屏蔽 inactive Pod
-
在 transferenv 中新增 SourceContainerNameFrom 和 EnvNames 字段,来解决 container name 不一致与大量 env 情况下的冗余问题
-
新增 “跳过保护” 标识
-
PodUnavailableBudget controller 关注 workload 工作负载的 replicas 变化
-
加入 --nodeimage-creation-delay 参数,并默认等待新增 Node ready 一段时间后同步创建 NodeImage
-
解决 NodeSelectorTerms 为 nil 情况下 Pod NodeSelectorTerms 长度为 0 的问题
-
kruise-daemon 采用 protobuf 协议操作 Pod 资源
-
暴露 cache resync 为命令行参数,并在 chart 中设置默认值为 0
-
解决 certs 更新时的 http checker 刷新问题
-
去除对 forked controller-tools 的依赖,改为使用原生 controller-tools 配合 markers 注解
我有话说: