ArgoCDによるBlueGreenデプロイを試す

MicroK8sにArgoCDをインストールするでArgoCDをインストールしたので機能を試しています。その一貫として、今日はBlueGreenデプロイを試したいと思います。

  • Argo Rolloutsをインストールする
  • Rolloutを作成する
    • BlueGreenデプロイ用のRolloutを作成する
    • Serviceを作成する
  • デプロイする
    • v1をデプロイする
    • v2をデプロイする
    • BlueGreenデプロイをする

Argo Rolloutsをインストールする


BlueGreenデプロイをするにはRolloutというリソースが必要になるので、以下のURLを参考にそのArgo Rolloutsをインストールします。

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin/

今回は以下のコマンドでArgo Rolloutをインストールしました。

ubuntu@microk8s-vm:~$ microk8s.kubectl create namespace argo-rollouts
namespace/argo-rollouts created
ubuntu@microk8s-vm:~$ microk8s.kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
customresourcedefinition.apiextensions.k8s.io/analysisruns.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/analysistemplates.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/experiments.argoproj.io created
customresourcedefinition.apiextensions.k8s.io/rollouts.argoproj.io created
serviceaccount/argo-rollouts created
role.rbac.authorization.k8s.io/argo-rollouts-role created
clusterrole.rbac.authorization.k8s.io/argo-rollouts-aggregate-to-admin created
clusterrole.rbac.authorization.k8s.io/argo-rollouts-aggregate-to-edit created
clusterrole.rbac.authorization.k8s.io/argo-rollouts-aggregate-to-view created
clusterrole.rbac.authorization.k8s.io/argo-rollouts-clusterrole created
rolebinding.rbac.authorization.k8s.io/argo-rollouts-role-binding created
clusterrolebinding.rbac.authorization.k8s.io/argo-rollouts-clusterrolebinding created
service/argo-rollouts-metrics created
deployment.apps/argo-rollouts created
ubuntu@microk8s-vm:~$ 
ubuntu@microk8s-vm:~$ microk8s.kubectl get pods -n argo-rollouts
NAME                             READY   STATUS    RESTARTS   AGE
argo-rollouts-7c5dbbd46d-4sf6s   1/1     Running   0          43s

Rolloutを作成する


以下の記事を参考に、BlueGreenデプロイ用のRolloutを作成します。

https://argoproj.github.io/argo-rollouts/features/bluegreen/

BlueGreenデプロイ用のRolloutを作成する


BlueGreenデプロイ用のRolloutを作成します。IstioのSubsetでバージョン毎に流量制御を行うで作成したhelloaアプリケーションのv1/v2を利用します。

以下のyamlを使って、Service名active-svc/preview-svcに対してBlueGreenデプロイを行うhelloa-bluegreenを作成します。初回はhelloa:v1がactive-svcによって割り振られ、v2をデプロイするとhelloa:v2がpreview-svcによって割り振られます。autoPromotionEnabled: falseにしているので、手動で昇格するとhelloa:v2がactive-svcによって割り振られるようになります。

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: helloa-bluegreen
spec:
  replicas: 2
  revisionHistoryLimit: 2
  selector:
    matchLabels:
      app: helloa
  template:
    metadata:
      labels:
        app: helloa
    spec:
      containers:
      - name: helloa
        image: localhost:32147/helloa:v1
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
  strategy:
    blueGreen: 
      activeService: active-svc
      previewService: preview-svc
      autoPromotionEnabled: false

strategy内のオプションについては、以下をご参照ください。

https://argoproj.github.io/argo-rollouts/features/bluegreen/

Serviceを作成する


helloa-bluegreenで指定したactive-svc/preview-svcを作成します。

NodePortでポート32000がactive-svc、同じくNodePortでポート32001がpreview-svcとするyamlを使います。

kind: Service
apiVersion: v1
metadata:
  name: active-svc
spec:
  selector:
    app: helloa
  type: NodePort
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 32000
---
kind: Service
apiVersion: v1
metadata:
  name: preview-svc
spec:
  selector:
    app: helloa
  type: NodePort
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 8080
    nodePort: 32001

作成すると以下の結果になります。

ubuntu@microk8s-vm:~$ microk8s.kubectl create -f service.yaml 
service/active-svc created
service/preview-svc created
ubuntu@microk8s-vm:~$ microk8s.kubectl get svc
NAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
active-svc         NodePort    10.152.183.171   <none>        8080:32000/TCP   12s
preview-svc        NodePort    10.152.183.159   <none>        8080:32001/TCP   12s

デプロイする


v1をデプロイする


以下のコマンドでRolloutを作成し、v1をデプロイします。

ubuntu@microk8s-vm:~$ microk8s.kubectl create -f rollout.yaml 
rollout.argoproj.io/helloa-bluegreen created

デプロイが完了すると、二つあるレプリカセットのうち片方だけにPodが作成されます。

ubuntu@microk8s-vm:~$ microk8s.kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
helloa-bluegreen-5d86bb8b54-hs7tb   1/1     Running   0          26s
helloa-bluegreen-5d86bb8b54-pbnqx   1/1     Running   0          26s
ubuntu@microk8s-vm:~/argocd/bluegreen$ microk8s.kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
helloa-bluegreen-5d86bb8b54   2         2         2       11s
helloa-bluegreen-6d7dc44886   0         0         0       58s

確認すると以下の結果になります。192.168.64.2はmultipass-vmのIPアドレスです。

$ curl http://192.168.64.2:32000
Hello A

v2をデプロイする


以下のコマンドを使ってhelloa-bluegreenのimageタグをv2にしてデプロイします。

ubuntu@microk8s-vm:~$ microk8s.kubectl patch rollout helloa-bluegreen --type merge -p '{"spec": {"template": {"spec": {"containers": [{"name":"helloa","image":"localhost:32147/helloa:v2"}]}}}}'
rollout.argoproj.io/helloa-bluegreen patched

以下のようにPodが作成されていることがわかります。Deploymentのローリングアップデートと異なる点は、v1とv2が同時に稼働していて、任意のタイミングで切り替えることができる点です。これによって、本番適用前に手動でテストを行うことができます。

ubuntu@microk8s-vm:~$ microk8s.kubectl get pods 
NAME                                READY   STATUS    RESTARTS   AGE
helloa-bluegreen-5695f95f6b-nkcw4   1/1     Running   0          12s
helloa-bluegreen-5695f95f6b-p8jw2   1/1     Running   0          12s
helloa-bluegreen-5d86bb8b54-hs7tb   1/1     Running   0          18m
helloa-bluegreen-5d86bb8b54-pbnqx   1/1     Running   0          18m
ubuntu@microk8s-vm:~$ microk8s.kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
helloa-bluegreen-5695f95f6b   2         2         2       28s
helloa-bluegreen-5d86bb8b54   2         2         2       18m
helloa-bluegreen-6d7dc44886   0         0         0       19m

httpリクエストを行うと以下の結果になります。

$ curl http://192.168.64.2:32000
Hello A
$ curl http://192.168.64.2:32001
Hello A v2

BlueGreenデプロイをする


以下のコマンドを使うことで、preview-svcに配下のv2をactive-svc配下に昇格することができます。

ubuntu@microk8s-vm:~$ microk8s.kubectl argo rollouts resume helloa-bluegreen

実行したところ、以下のエラーが出ました。

Error: unknown command "argo" for "kubectl"
Run 'kubectl --help' for usage.

当たり前ですが、kubectl pluginを入れなければならないようでした。以下のURLを参考にインストールします。

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin/

再度実行すると、以下のエラーが出てしまいました。

ubuntu@microk8s-vm:~$ microk8s.kubectl argo rollouts resume helloa-bluegreen
exec format error

結果解消することができなかったので、仕方なく手動でautoPromotionEnabledをtrueにして昇格を行いました。

ubuntu@microk8s-vm:~$ microk8s.kubectl patch rollout helloa-bluegreen --type merge -p '{"spec": {"strategy": {"blueGreen": {"autoPromotionEnabled": true}}}}'

昇格が完了すると、v1が消えていました。

ubuntu@microk8s-vm:~$ microk8s.kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
helloa-bluegreen-5695f95f6b-nkcw4   1/1     Running   0          48m
helloa-bluegreen-5695f95f6b-p8jw2   1/1     Running   0          48m
ubuntu@microk8s-vm:~$ microk8s.kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
helloa-bluegreen-5695f95f6b   2         2         2       81m
helloa-bluegreen-5d86bb8b54   0         0         0       99m
helloa-bluegreen-6d7dc44886   0         0         0       100m

以下のコマンドでサービスが切り替わっていることも確認できました。

$ curl http://192.168.64.2:32000
Hello A v2

以上です。