前言:Argo项目于2017年由Applatix公司创立,2018 年初被 Intuit 收购;在这之后,BlackRock为Argo项目贡献了Argo Events这一子项目,2020年4月被CNCF收入孵化器,2022年12月6号毕业,Argo的所有组件都通过专用的Kubernetes CRD实现,支持使用或集成其他CNCF项目,如gRPC、Prometheus、NATS、Helm和CloudEvents等,这次我们使用Argo生态四个项目中的Argo rollouts,ArgoCD的高级交付策略工具支持声明式渐进式交付策略,例如 canary 、blue-green等。
一、Argo Rollouts概览
1.rollouts Argo的一个子项目由一个控制器和一组CRD组成,可为Kubernetes提供高级部署功能包括:
- blue-green
- canary
- canary analysis
- experimentation
- progressive delivery
基本工作机制:
1.与Deployment相似,Argo Rollouts控制器借助于ReplicaSet完成应用的创建、缩放和删除;
2. ReplicaSet资源由Rollout的spec.template字段进行定义。
二、部署Argo Rollouts
2.1: 创建argo-rollouts名称空间
root@k8s-master01:~# kubectl create ns argo-rollouts
namespace/argo-rollouts created
root@k8s-master01:~# kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.7.2/install.yaml
会生成一个services / argo-rollouts-metrics、一个deployments/argo-rollouts,以及一组CRD。
2.2:部署Dashboard
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/download/v1.7.2/dashboard-install.yaml
2.2.1: 安装生成的services/argo-rollouts-dashboard默认监听于TCP/3100端口
root@k8s-master01:~# kubectl get svc -n argo-rollouts
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argo-rollouts-dashboard ClusterIP 10.100.61.192 <none> 3100/TCP 5m56s
argo-rollouts-metrics ClusterIP 10.100.120.232 <none> 8090/TCP 8m38s
2.2.2: 编写ingress-nginx规则实现在外部访问
vim ingress-argo-rollouts.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argo-rollouts
namespace: argo-rollouts
spec:
ingressClassName: nginx
rules:
- host: rollouts.linux.com
http:
paths:
- backend:
service:
name: argo-rollouts-dashboard
port:
number: 3100
path: /
pathType: Prefix
- host: rollout.linux.com
http:
paths:
- backend:
service:
name: argo-rollouts-dashboard
port:
number: 3100
path: /
pathType: Prefix
2.2.3:测试访问
2.3:部署kubectl argo rollouts插件
root@k8s-master01:~# curl -LO https://github.com/argoproj/argo-rollouts/releases/download/v1.7.2/kubectl-argo-rollouts-linux-amd64
root@k8s-master01:~# chmod +x ./kubectl-argo-rollouts-windows-amd64
root@k8s-master01:~# mv ./kubectl-argo-rollouts-windows-amd64 /usr/local/bin/kubectl-argo-rollouts
root@k8s-master01:~# kubectl argo rollouts version
三、结合Service进行Canary部署
3.1: 环境说明
应用:spring-boot-helloworld
- 微服务,默认监听于80/tcp
使用Argo Rollouts 提供的Rollout资源编排运行该应用
- 使用Canary 更新策略
- 推出一个Canary Pod后即暂停,需要用户手动Promote
相关的常用命令
更新应用:
kubectl argo rollouts set image ROLLOUT_NAME CONTAINTER=NEW_IMAGE
继续更新:
kubectl-argo-rollouts promote ROLLOUT_NAME [flags
中止更新:
kubectl-argo-rollouts abort ROLLOUT_NAME [flags]
回滚:
kubectl-argo-rollouts undo ROLLOUT_NAME [flags]
3.2: yaml 文件编写
vim rollouts-demo.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: rollouts-spring-boot-helloworld
spec:
replicas: 10
strategy:
canary:
steps:
- setWeight: 10
- pause: {}
- setWeight: 20
- pause: {duration: 20}
- setWeight: 30
- pause: {duration: 20}
- setWeight: 40
- pause: {duration: 20}
- setWeight: 60
- pause: {duration: 20}
- setWeight: 80
- pause: {duration: 20}
revisionHistoryLimit: 5
selector:
matchLabels:
app: spring-boot-helloworld
template:
metadata:
labels:
app: spring-boot-helloworld
spec:
containers:
- name: spring-boot-helloworld
image: github/spring-boot-helloworld:v0.9.2
ports:
- name: http
containerPort: 80
protocol: TCP
resources:
requests:
memory: 32Mi
cpu: 50m
livenessProbe:
httpGet:
path: '/'
port: 80
scheme: HTTP
initialDelaySeconds: 3
readinessProbe:
httpGet:
path: '/'
port: 80
scheme: HTTP
initialDelaySeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: spring-boot-helloworld
spec:
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app: spring-boot-helloworld
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: spring-boot-helloworld
spec:
ingressClassName: "nginx"
rules:
- host: hello.linux.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: spring-boot-helloworld
port:
number: 80
3.3: 在web页面查看
3.4:测试请求
while true; do curl http://hello.linux.com; curl http://hello.linux.com/version; echo; sleep 0.$[$RANDOM%10]; done
rollouts 更新镜像
kubectl argo rollouts set image rollouts-spring-boot-helloworld spring-boot-helloworld=gitlab/spring-boot-helloworld:v0.9.3
查看ui界面第一次调度10%的流量到新版服务中,然后每隔20s调度20%的流量直到全部流量。