一、安装

仓库

1.1 安装argo-rollouts

  1. 创建命名空间
1
kubectl create namespace argo-rollouts
  1. 下载 yaml 文件
1
wget -O argo_rollouts_v1.9.0_install.yaml https://github.com/argoproj/argo-rollouts/releases/download/v1.9.0/install.yaml

​ 代理

1
wget -O argo_rollouts_v1.9.0_install.yaml https://g.bravexist.cn/https://github.com/argoproj/argo-rollouts/releases/download/v1.9.0/install.yaml
  1. 创建资源
1
kubectl apply -n argo-rollouts -f argo_rollouts_v1.9.0_install.yaml
  1. 验证
1
kubectl get all -n argo-rollouts

1.2 安装Kubectl 插件

  1. 下载
1
wget https://github.com/argoproj/argo-rollouts/releases/download/v1.9.0/kubectl-argo-rollouts-linux-amd64

​ 代理

1
wget https://g.bravexist.cn/https://github.com/argoproj/argo-rollouts/releases/download/v1.9.0/kubectl-argo-rollouts-linux-amd64
  1. 移动
1
mv kubectl-argo-rollouts-linux-amd64 /usr/local/bin/kubectl-argo-rollouts
  1. 添加可执行权限
1
chmod u+x /usr/local/bin/kubectl-argo-rollouts
  1. 验证
1
kubectl argo rollouts version

1.3 安装dashboard插件

  1. 下载资源清单
1
wget -O argo_rollouts_dashboard_v1.9.0_install.yaml https://github.com/argoproj/argo-rollouts/releases/download/v1.9.0/dashboard-install.yaml

​ 代理

1
wget -O argo_rollouts_dashboard_v1.9.0_install.yaml https://g.bravexist.cn/https://github.com/argoproj/argo-rollouts/releases/download/v1.9.0/dashboard-install.yaml
  1. 创建资源
1
kubectl apply -f argo_rollouts_dashboard_v1.9.0_install.yaml -n argo-rollouts
  1. 编辑 ingress 资源清单
1
vim ingress_dashboard.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: argo-rollouts
namespace: argo-rollouts
annotations:
cert-manager.io/cluster-issuer: qx-ca-issuer
spec:
ingressClassName: traefik
tls:
- hosts:
- argo-rollouts.qx.lab
secretName: argo-rollouts-tls
rules:
- host: argo-rollouts.qx.lab
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: argo-rollouts-dashboard
port:
number: 3100
  1. 创建资源
1
kubectl apply -f ingress_dashboard.yaml

二、蓝绿部署

2.1 创建资源清单文件

  1. 创建子目录
1
2
mkdir argorollout-blue-green
cd argorollout-blue-green
  1. 编辑资源清单文件

rollout

1
vim rollout.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: bluegreen-rollout # 定义Rollout的名称
spec:
replicas: 2 # 期望副本数
strategy:
blueGreen: # 指定蓝绿部署策略
activeService: bluegreen-active # 用于接收生产流量的Service
previewService: bluegreen-preview # 用于接收预览流量的Service
autoPromotionEnabled: false # 是否自动提升预览版本为活动版本
previewReplicaCount: 1 # 预览版本的副本数
revisionHistoryLimit: 2 # 保留的历史版本
selector: # 类似deployment的selector
matchLabels:
app: myapp
template: # 类似deployment的template
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- name: http
containerPort: 80
protocol: TCP

service

1
vim service.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 接收生产流量的Service
apiVersion: v1
kind: Service
metadata:
name: bluegreen-active
spec:
type: ClusterIP
selector:
app: myapp
ports:
- name: http
port: 80
---
# 接收预览流量的Service
apiVersion: v1
kind: Service
metadata:
name: bluegreen-preview
spec:
type: ClusterIP
selector:
app: myapp
ports:
- name: http
port: 80

ingress

1
vim ingress.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-prod
annotations:
cert-manager.io/cluster-issuer: qx-ca-issuer
spec:
ingressClassName: traefik
tls:
- hosts:
- prod.myapp.qx.lab
secretName: prod-myapp-tls # ★ cert-manager 自动创建并填充
rules:
- host: prod.myapp.qx.lab
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: bluegreen-active
port:
number: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: myapp-test
annotations:
cert-manager.io/cluster-issuer: qx-ca-issuer
spec:
ingressClassName: traefik
tls:
- hosts:
- test.myapp.qx.lab
secretName: test-myapp-tls # ★ cert-manager 自动创建并填充
rules:
- host: test.myapp.qx.lab
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: bluegreen-preview
port:
number: 80

2.2 部署 application

可以 webui 点一点,也可以直接 yaml 部署。这里图方便,yaml 直接部署。

1
vim bule-green.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: blue-green
namespace: argocd
spec:
destination:
name: ''
namespace: default
server: 'https://kubernetes.default.svc'
source:
path: argorollout-blue-green
repoURL: 'git@gitlab.qx.lab:qiaoxiong/argodemo.git'
path: argorollout-blue-green
targetRevision: HEAD
sources: []
project: default
syncPolicy:
automated:
prune: false
selfHeal: false

2.3 更新镜像

可以看到效果,预览版本已经更新了,生产版本还未更新,需要手动确认。

  1. 查看状态
1
kubectl argo rollouts get rollout bluegreen-rollout
  1. 验证无误,跟随预览
1
kubectl argo rollouts promote bluegreen-rollout
  1. 如果更新到生产环境后,发现有问题,依旧可以回滚。
1
2
web 页面回滚
预览环境会先回滚,然后生产环境跟随即可
1
kubectl argo rollouts undo bluegreen-rollout

​ 指定版本回滚

1
kubectl argo rollouts undo bluegreen-rollout --revision=2
  1. 预览环境有问题,终止发布,预览环境会在一会儿后销毁。
1
kubectl argo rollouts abort bluegreen-rollout