Kruise Rollout多批次发布
实验环境
安装好k8s集群
一、Kruise Rollouts简介
1、什么是 Kruise Rollouts?
Kruise Rollouts 是一个 Bypass(旁路) 组件,提供高级渐进式交付功能 。
它可以实现对应用程序的更平稳和受控的更改部署,支持金丝雀、多批次和A/B测试交付模式,同时它兼容 Gateway API 和各种 Ingress 实现,使其更容易集成到现有基础设施中。
2、Kruise Rollouts主要特点
更多的发布策略
用于 Deployment、CloneSet、StatefulSet、Advanced StatefulSet 的多批次更新策略。
用于 Deployment 的金丝雀(Canary)更新策略。
更多的流量路由管理策略
在更新工作负载时进行流量细粒度、加权流量转移。
流量A/B测试,基于HTTP头和Cookie进行流量转移。
环境准备
部署OpenKruise
1、部署helm
下载或上传helm-v3.13.2-linux-amd64.tar.gz包到/root目录
下载方法:wget https://get.helm.sh/helm-v3.13.2-linux-amd64.tar.gz
tar xf helm-v3.13.2-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
helm version
2、添加openkruise仓库
helm repo add openkruise https://openkruise.github.io/charts/
helm repo update
helm repo list
3、使用helm安装kruise
helm search repo openkruise
这里使用本地包安装
上传kruise-manager.tar镜像包到/root目录(master1、worker1、worker2)也可以执行下面命令联网下载镜像
docker load -i kruise-manager.tar
上传kruise-1.8.0.tgz包到/root目录(master1)
helm install kruise kruise-1.8.0.tgz --set daemon.socketLocation=/var/run --set daemon.socketFile=cri-dockerd.sock --set featureGates="InPlaceUpdateEnvFromMetadata=true\,PreDownloadImageForInPlaceUpdate=true"
kubectl get all -n kruise-system
二、Kruise Rollouts 安装
1、使用helm安装kruise-rollout
helm search repo kruise-rollout
使用openkruise仓库安装(需要连接VPN)
helm install kruise-rollout openkruise/kruise-rollout --version 0.5.0
这里使用本地包安装
上传kruise-rollout.tar镜像包到/root目录(master1、worker1、worker2)也可以执行下面命令联网下载镜像
docker load -i kruise-rollout.tar
上传kruise-rollout-0.5.0.tgz包到/root目录(master1)
helm install kruise-rollout kruise-rollout-0.5.0.tgz
kubectl get ns
kubectl get pod -n kruise-rollout
2、kubectl plugin安装(master1)
下载或上传kubectl-kruise-linux-amd64.tar.gz包到/root目录
下载方法(需要连接VPN):wget https://github.com/openkruise/kruise-tools/releases/download/v1.1.2/kubectl-kruise-linux-amd64.tar.gz
tar xf kubectl-kruise-linux-amd64.tar.gz
mv linux-amd64/kubectl-kruise /usr/bin/
kubectl-kruise version或kubectl-kruise version --output=yaml
三、Kruise Rollouts 基本使用(多批次发布)
1、使用Deployment部署应用
vim 01-deployment.yaml
添加:
apiVersion: apps/v1
kind: Deployment
metadata:
name: workload-demo
namespace: default
spec:
replicas: 10
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- name: busybox
image: busybox:latest
command: [ "/bin/sh", "-c", "sleep 100d" ]
env:
- name: VERSION
value: "version-1"
kubectl apply -f 01-deployment.yaml
kubectl get pod
2、准备Rollout对象
vim 02-rollout.yaml
添加:
apiVersion: rollouts.kruise.io/v1alpha1
kind: Rollout
metadata:
name: rollouts-demo
namespace: default
annotations:
rollouts.kruise.io/rolling-style: partition
spec:
objectRef:
workloadRef:
apiVersion: apps/v1
kind: Deployment
name: workload-demo
strategy:
canary:
steps:
- replicas: 1
- replicas: 50%
- replicas: 100%
kubectl apply -f 02-rollout.yaml
查看 Kubernetes 集群中的 Rollout 资源
kubectl get rollout
字段解析:
NAME: Rollout 资源的名称,这里是 rollouts-demo。
STATUS: Rollout 的当前状态,这里是 Healthy,表示 Rollout 健康且正常运行。
CANARY_STEP: 当前金丝雀发布的步骤,这里是 3,表示已经完成了第三步(即 100% 的 Pod 更新)。
CANARY_STATE: 当前金丝雀发布的状态,这里是 Completed,表示金丝雀发布已完成。
MESSAGE: 附加信息,这里是 workload deployment is completed,表示相关工作负载的部署已完成。
AGE: Rollout 资源的创建时间,这里是 58s,表示资源已经创建了 58 秒。
3、将部署升级到“version-2” 并发布第一批次
kubectl get deployment
通过 kubectl patch 更新 workload-demo Deployment 的 Pod 模板,具体是为名为 busybox 的容器添加一个环境变量 VERSION,并将其值设置为 version-2
kubectl patch deployment workload-demo -p '{"spec":{"template":{"spec":{"containers":[{"name":"busybox", "env":[{"name":"VERSION", "value":"version-2"}]}]}}}}'
字段解析:
kubectl patch: 用于部分更新 Kubernetes 资源。
deployment workload-demo: 指定要更新的资源类型和名称,这里是 workload-demo Deployment。
-p: 指定要应用的 JSON 或 YAML 格式的补丁内容。
kubectl get pod
kubectl get deployment
kubectl get replicaset -L pod-template-hash
-L pod-template-hash:显示 pod-template-hash 标签的值。pod-template-hash 是 Kubernetes 自动为每个 ReplicaSet 生成的唯一标签,用于标识其 Pod 模板。
已根据策略更新一个Pod
kubectl get rollout
字段解析:
STATUS: Rollout 的当前状态,这里是 Progressing,表示 Rollout 正在进行中。
CANARY_STEP: 当前金丝雀发布的步骤,这里是 1,表示已经完成了第一步(即更新 1 个 Pod)。
CANARY_STATE: 当前金丝雀发布的状态,这里是 StepPaused,表示 Rollout 在第一步完成后暂停,等待手动确认。
MESSAGE: 附加信息,这里是 Rollout is in step(1/3), and you need manually confirm to enter the next step,表示 Rollout 处于第一步(共三步),需要手动确认才能进入下一步。
4、发布第二批次
手动确认 rollouts-demo 进入下一步
kubectl-kruise rollout approve rollouts/rollouts-demo
字段解析:
kubectl-kruise rollout approve: 这是 OpenKruise 提供的命令,用于手动确认 Rollout 进入下一步。
rollouts/rollouts-demo: 指定要确认的 Rollout 资源,格式为 <资源类型>/<资源名称>。这里 rollouts 是资源类型,rollouts-demo 是资源名称。
kubectl get rollout
字段解析:
CANARY_STEP: 当前金丝雀发布的步骤,这里是 2,表示已经完成了第二步(即更新 50% 的 Pod)。
CANARY_STATE: 当前金丝雀发布的状态,这里是 StepPaused,表示 Rollout 在第二步完成后暂停,等待手动确认。
MESSAGE: 附加信息,这里是 Rollout is in step(2/3), and you need manually confirm to enter the next step,表示 Rollout 处于第二步(共三步),需要手动确认才能进入下一步。
kubectl get deployment
kubectl get pod
已根据策略更新50% Pod
5、发布第三批次
手动确认 rollouts-demo 进入下一步
kubectl-kruise rollout approve rollouts/rollouts-demo
kubectl get rollout
返回字段解析:
STATUS:当前 Rollout 的状态,这里是 Progressing,表示 Rollout 正在进行中。
CANARY_STEP:当前金丝雀部署的阶段,这里是 3,表示 Rollout 正处于第 3 个阶段。
CANARY_STATE:当前金丝雀部署的状态,这里是 StepUpgrade,表示 Rollout 正在升级到新版本。
MESSAGE:描述 Rollout 的详细信息,这里是:复制Rollout is in step(3/3), and upgrade workload to new version,表示 Rollout 正处于第 3 个阶段(总共 3 个阶段),并且正在将工作负载升级到新版本。
kubectl get replicaset
等待一,会集中更新
kubectl get rollout
返回字段解析:
STATUS: Rollout 的当前状态,这里是 Healthy,表示 Rollout 健康且正常运行。
CANARY_STEP: 当前金丝雀发布的步骤,这里是 3,表示已经完成了第三步(即 100% 的 Pod 更新)。
CANARY_STATE: 当前金丝雀发布的状态,这里是 Completed,表示金丝雀发布已完成。
kubectl get replicaset
kubectl get pod
已根据策略更新100% Pod