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
以上です。
コメント
コメントは停止中です。