OpenKruise参考 https://openkruise.io/rollouts/best-practices/traffic-routing-istio-api 基于自己的demo deploy测试金丝雀发布,发现创建出了canary svc,但没有canary deploy,这个和文档不一致,怎么操作呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
如果创建出了canary svc但没有canary deploy,可以尝试以下操作:
确保你的Deployment中包含了相应的Canary标签,例如app: my-app
和release: canary
。这些标签将用于标识哪些实例属于Canary发布。
检查你的Deployment的spec字段中是否包含了相应的Canary控制器的配置。例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3
strategy:
rollingUpdate:
maxUnavailable: 0
Type: RollingUpdate
template:
metadata:
labels:
app: my-app
release: canary
spec:
containers:
- name: my-app-container
image: my-app-image:latest
ports:
- containerPort: 8080
在这个例子中,我们使用了strategy
字段来指定滚动更新的策略,并设置了Type
为RollingUpdate
。这样,当进行金丝雀发布时,OpenKruise会自动创建一个对应的Canary Deployment来处理金丝雀版本的实例。
kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-canary
spec:
replicas: 1
strategy:
rollingUpdate:
maxUnavailable: 0
Type: RollingUpdate
template:
metadata:
labels:
app: my-app
release: canary
spec:
containers:
- name: my-app-container
image: my-app-image:canary # 使用金丝雀版本的镜像进行部署
ports:
- containerPort: 8080
EOF
这个命令会创建一个名为my-app-canary
的Deployment,其中包含了一个金丝雀版本的容器。通过手动创建Canary Deployment,可以触发金丝雀发布的流程,并确保后续的发布流程能够正常进行。
根据提供的文档,在创建金丝雀发布时,需要先创建一个名为"workload-demo"的deployment和一个名为"service-demo"的服务。然后,再创建一个名为"rollouts-demo"的rollout,其中指定了"workloadRef"为"workload-demo"。
在创建金丝雀发布后,需要更新"workload-demo"部署的"version"环境变量为"canary",以启动发布过程。
在发布过程中,Kruise Rollout会创建一个新的带有"version: canary"环境的deployment,并创建一个名为"service-demo-canary"的新服务来路由流量到新版本pod。同时,还会更新VirtualService "vs-demo"以进行流量路由。
因此,如果创建金丝雀发布时没有看到canary deploy,可能是因为没有正确地更新"workload-demo"部署的"version"环境变量。请确保已经执行了以下命令来更新环境变量:
$ kubectl patch deployment workload-demo -p '{ "spec":{ "template":{ "spec":{ "containers":[{ "name":"nginx", "env":[{ "name":"version", "value":"canary" }]}]}}}}'
如果已经执行了上述命令,但仍然没有看到canary deploy,可以尝试检查Kruise Rollout的状态,以确保发布过程正常进行。可以使用以下命令查看Rollout的状态:
$ kubectl get rollout -n default
如果Rollout的状态不是"Running",可能需要检查是否有任何错误导致发布过程失败。