Live Agent 4.44 における Helm依存関係の移行ガイド

v4.44で追加

これは、Live Agent 4.44バージョンアップのための移行ガイドです。このリリースは、PostgreSQLとRedisの依存関係をアップグレードします。この変更により、外部でそれらを使用していない場合は、手動でのデータ移行が必要になります。

Redisの場合は、すぐに動作しますが、PostgreSQLの場合は、古いデータベースから新しいデータベースへデータを移行する必要があります。

移行前の準備

values.yamlの変更

.Values.postgresql以下の値も影響を受けます。カスタム values.yaml ファイルに必要な変更を行います。

旧バージョンの値新バージョンの値
Values.postgresql.postgresqlDatabaseValues.postgresql.auth.database
Values.postgresql.postgresqlUsernameValues.postgresql.auth.username
Values.postgresql.postgresqlPasswordValues.postgresql.auth.postgresPassword
Values.postgresql.postgresqlHostValues.postgresql.host
Values.postgresql.postgresqlPortValues.postgresql.port
Values.postgresql.existingSecretValues.postgresql.auth.existingSecret
Values.postgresql.existingPasswordSecretKeyValues.postgresql.auth.secretKeys.adminPasswordKey

cognigy-live-agentデプロイはcognigy-live-agent-appと呼ばれるようになりました。この変更はカスタム values.yaml ファイルの「service」と「ingress」にも適用されます。

旧バージョンの値

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: traefik
  hosts:
    - host: '<host>'
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              # Same value as service.name above
              name: cognigy-live-agent
              port:
                number: 3000

service:
  name: cognigy-live-agent
  internalPort: 3000
  targetPort: 3000
  type: ClusterIP
  annotations: {}

新バージョンの値

ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: traefik
  hosts:
    - host: '<host>'
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              # Same value as service.name above
              name: cognigy-live-agent-app
              port:
                number: 3000

service:
  name: cognigy-live-agent-app
  internalPort: 3000
  targetPort: 3000
  type: ClusterIP
  annotations: {}

backup-pod.yamlの作成

PostgreSQLデータベースにアクセスするには、バックアップポッドが必要です。このポッドがバックアップを作成し、新しいデータベースに復元します。バックアップポッドのサイズは、ダンプを格納するために少なくとも3倍の大きさが必要です。

データベースのサイズを計算する

データベースのサイズを知るには、以下のコマンドを実行します:

kubectl exec -n live-agent -it <postgresql-pod-name> -- psql -U <postgresql-username> -d live_agent_production -c "SELECT pg_database_size('live_agent_production')/1024/1024/1024 AS size_in_gb;"

出力はこのようになります:

 size_in_gb
------------
  1.0000000
(1 row)

バックアップポッドのサイズは少なくとも3GBでなければなりません。

backup-pod.yaml

# Create a new file backup-pod.yaml
apiVersion: storage.k8s.io/v1
allowVolumeExpansion: true
kind: StorageClass
metadata:
  name: postgres-backup
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
  encrypted: 'true'
  fsType: ext4
reclaimPolicy: Retain

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  labels:
    app: postgres-backup
  name: postgres-backup
  namespace: live-agent
spec:
  serviceName: postgres-backup
  replicas: 1
  selector:
    matchLabels:
      app: postgres-backup
  template:
    metadata:
      name: postgres-backup
      labels:
        app: postgres-backup
    spec:
      containers:
        - image: postgres:11-alpine
          name: postgres-backup
          env:
            - name: POSTGRES_PASSWORD
              value: postgres # This is the password for the postgres admin user (can be obtained from the secret `cognigy-live-agent-postgresql`)
            - name: PGPASSWORD
              value: postgres # This is the password for the postgres admin user (can be obtained from the secret `cognigy-live-agent-postgresql`)
            - name: POSTGRES_USER
              value: postgres # This is the username specified in the values.yaml file
            # - name: PGDATA
            # value: /var/lib/postgresql/data/pgdata
          ports:
            - containerPort: 5432
          resources: {}
          volumeMounts:
            - mountPath: /mnt/postgres-backup
              name: postgres-backup-claim
      restartPolicy: Always
  volumeClaimTemplates:
    - metadata:
        name: postgres-backup-claim
      spec:
        accessModes: ['ReadWriteOnce']
        storageClassName: 'postgres-backup'
        resources:
          requests:
            storage: 100Gi # This is the size of the backup pod

---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: postgres-backup
  name: postgres-backup
  namespace: live-agent
spec:
  ports:
    - name: 'postgres-backup'
      port: 5432
      targetPort: 5432
  selector:
    app: postgres-backup
  clusterIP: None

バックアップポッドを導入するには、次のコマンドを実行します:

kubectl apply -n live-agent -f backup-pod.yaml

移行ステップ

ステップ1. レプリカのカウントを0に設定する

appとworkerのレプリカセットでは、レプリカのカウントに0を指定します。これにより、データベースにアクティビティが発生せず、データが安全にバックアップされます。

kubectl scale --replicas=0 -n live-agent deployment/cognigy-live-agent
kubectl scale --replicas=0 -n live-agent deployment/cognigy-live-agent-worker
kubectl scale --replicas=0 -n live-agent deployment/cognigy-live-agent-odata

備考

以前のバージョンでは、cognigy-live-agent-appデプロイはまだcognigy-live-agentと呼ばれています。

ステップ2. PostgreSQLバックアップポッドにシェルをアタッチし、Live Agentデータベースのバックアップを作成する

postgres-backupポッドにログインし、live_agent_productionデータベースのダンプを作成します。

kubectl exec -n live-agent -it postgres-backup-0 -- bash

# Inside the PostgreSQL backup pod
cd /mnt/postgres-backup/

nohup time pg_dump --user $POSTGRES_USER --host cognigy-live-agent-postgresql -d live_agent_production > live_agent_production-postgres-dump.sql &

# (Alternative) Take a compressed dump, but this takes longer
nohup pg_dump --user $POSTGRES_USER --host cognigy-live-agent-postgresql -Fc -d live_agent_production > live_agent_production-postgres-dump.sql &

接頭辞nohupと接尾辞&pg_dumpコマンドで使用され、バックグラウンドで実行されます。fgコマンドで現在のセッションのバックグラウンドコマンドを呼び出し、jobsコマンドでバックグラウンドジョブのステータスを確認することができます。

bash-5.1# jobs
[1]+  Running                 nohup pg_dump --user $POSTGRES_USER --host cognigy-live-agent-postgresql -d live_agent_production > live_agent_production-postgres-dump.sql &

# Once it has finished, check the output of the backup file
cat live_agent_production-postgres-dump.sql

exit

一度実行すれば、jobsコマンドは何も出力しません。

ステップ3. 現在のリリースを削除し、PVC再利用ポリシーを確認する

PostgreSQLとRedisのバージョンが変更された場合、PVCは新しいバージョンとの互換性がなくなります。互換性を回復するには、現在のリリースとPVCを削除し、Live Agent PVC再利用ポリシーを確認します。

# Check that PVs are set as Retain:
kubectl get pv
# Patch the reclaim policy for the EFS storage PV, set <pv-name> to the name from the previous command
# Repeat for any PV related to LA that is not set to "Retain"
kubectl patch pv <pv-name> -p '{"spec":{"persistentVolumeReclaimPolicy":"Retain"}}'
# Check that the reclaim policy is set to "Retain":
kubectl get pv

# Delete the current release
helm delete -n live-agent cognigy-live-agent

# Change the EFS storage PV status from "Released" to "Available"
kubectl patch pv <pv-name> -p '{"spec":{"claimRef": null}}'

# Check the PVCs
kubectl get pvc -n live-agent

# These commands will delete the database volumes. Make sure a backup was done before proceeding
kubectl delete pvc -n live-agent <data-postgres>
kubectl delete pvc -n live-agent <redis>
kubectl delete pvc -n live-agent <redis-replica>

ステップ4. 既存のデータベースシークレットの削除または変更

既存のシークレットを削除するか、新しいキーに変更する必要があります。既存のシークレットがvalues.yamlファイルで指定されていない場合、システムは新しいリリースで新しいシークレットを自動的に生成します。

  • シークレットの削除(推奨)
  • 既存のシークレットの変更

既存のシークレットを削除し、自動生成されたパスワードを取得するために、valuesファイルにコメントされたパスワードフィールドを残すことをお勧めします。

# Delete the secrets
kubectl delete secret -n live-agent cognigy-live-agent-postgresql
kubectl delete secret -n live-agent cognigy-live-agent-redis

      

シークレットを削除する代わりに、既存のシークレットを変更することができます。内部PostgreSQLを使用する場合の唯一の変更は、新しいPostgreSQLシークレットです。このシークレットには以下のキーを含める必要があります:

# The PostgreSQL admin password (.Values.postgresql.auth.secretKeys.adminPasswordKey)
postgres-password
# New field - The PostgreSQL user password
password
      

postgresql.auth.existingSecretとpostgresql.auth.secretKeys.adminPasswordKeyはデフォルトでpostgres-passwordとpasswordに設定されています。

ステップ5. バージョン4.44. 0のチャートをインストールする

以前のバックアップを復元するために、migrationsジョブを実行したり、デプロイメントがDBにアクセスしたりしていない空の状態で、新しいリリースをインストールします。custom-values.yaml ファイルでmigrationsジョブを false に設定し、appとworkerの両方でレプリカカウントを 0 に減らします:

# custom-values.yaml
app:
  replica: 0

worker:
  replica: 0

odata:
  enabled: false

migration:
  enabled: false

新しいバージョンのチャートをインストールする:

helm install cognigy-live-agent oci://cognigy.azurecr.io/helm/live-agent --version 4.44.0 --namespace live-agent -f custom-values.yaml

起動しているポッドはEFS、PostgreSQL、Redisのみになります。

ステップ6. 新しいPostgreSQLポッドにバックアップを復元する

PostgreSQLバックアップポッドにシェルを取りつけ、’live_agent_production’データベースを新しいPostgreSQLポッドに復元します。

# Log in to the postgres-backup-0 pod
kubectl exec -n live-agent -it postgres-backup-0 -- bash

# Get the password of the new PostgreSQL from the `cognigy-live-agent-postgresql` secret key `postgres-password` and export it to `PGPASSWORD` environment variable
export PGPASSWORD=<password>

# Connect to the newly deployed PostgreSQL DB with the `psql` command
psql --host cognigy-live-agent-postgresql -U postgres -d postgres -p 5432

# List details of DBs
\l+

DROP DATABASE live_agent_production;

create database live_agent_production;

grant all privileges on database live_agent_production to postgres;

# List details of DBs
\l+

# quit
\q

cd /mnt/postgres-backup/

# Restore the data from old postgres. This takes some time
nohup time psql --host cognigy-live-agent-postgresql -U postgres -d live_agent_production < live_agent_production-postgres-dump.sql &

# (Optional) Once restored, check postgres disk usages
PGPASSWORD=postgres psql --host cognigy-live-agent-postgresql -U postgres -d postgres -p 5432
# List details of DBs
\l+

ステップ7. custom-values.yamlを変更する

migrationsジョブを有効にして、custom-values.yamlファイルのappとworkerのレプリカカウントを希望の数に増やします。

# custom-values.yaml
app:
  replica: 2

worker:
  replica: 3

# In case the OData service was enabled, enable it again
odata:
  enabled: true

migration:
  enabled: true

チャートをアップグレードします。

helm upgrade cognigy-live-agent oci://cognigy.azurecr.io/helm/live-agent --version 4.44.0 --namespace live-agent -f custom-values.yaml

ステップ 8. シェルを取り付け、オンボーディング変数を削除する

アプリのポッドにシェルを取り付け、Redis の onboarding 変数を削除します。これにより、Live Agentへのアクセス後にオンボーディング画面が表示されなくなります。

# Attach a shell to the app pod
kubectl exec -n live-agent -it cognigy-live-agent-app-xxxxxxxxxx -- /bin/sh

# Execute a Rails console
RAILS_ENV=production bundle exec rails c

# Remove the onboarding variable from Redis
::Redis::Alfred.delete(::Redis::Alfred::CHATWOOT_INSTALLATION_ONBOARDING)

ステップ9. Live Agentにアクセスして内容を確認する

既存のトークと設定を確認し、すべてが希望通りに動作していることを確認します。すべての確認が終わったら、バックアップを削除することができます。

# Delete the backup pod deployment, service, Storage Class and pvc
kubectl delete statefulset -n live-agent postgres-backup
kubectl delete service -n live-agent postgres-backup
kubectl delete sc postgres-backup
kubectl delete pvc -n live-agent <postgres-backup-pvc>

リリースされた永続ボリュームが削除されていることを忘れず確認してください。問題がある場合は、テクニカルサポートにお問い合わせください。