はじめに
GitLab 13.0.0が2020/05/22にリリースされました。
そこで今回はEKSにHelmでデプロイしたGitLab 12.3.5を13.0.0にバージョンアップデートする方法を説明します。
まずはGitLab Helm Chartのアプリバージョンとのマッピングを見てみましょう。
詳細はこちらのページにあります。
Chart Version | GitLab Version |
---|---|
2.3.7 | 12.3.5 |
2.6.9 (2系の最新) | 12.6.8 |
3.0.0 | 12.7.0 |
3.3.5 (3系の最新) | 12.10.6 |
4.0.0 | 13.0.0 |
表から分かるようにアプリのメジャーバージョンが変わる前にChartのメジャーバージョンが変わっているので少し変則的にバージョンを上げていく必要があります。
Chartのメジャーアップデートを2回行うため、2.3.7 → 2.6.9 → 3.0.0 → 3.3.5 → 4.0.0と段階的にバージョンを上げていきます。
環境情報
macOS Mojabe 10.14.6
Helm 3.2.1
EKS 1.13
RDS PostgreSQL 9.6.15
ALB Ingress Controller Helm Chart 0.1.11
kube2iam Helm Chart 2.0.1
GitLab Helm Chart 2.3.7, 2.6.9, 3.0.0, 3.3.5, 4.0.0
前準備
ALBを使用するためにALB Ingress Controller
、IAM RoleをPodに付与するためにkube2iam
をデプロイしておきます。
GitLabがS3を使うためにはS3バケット情報をSecretとして作る必要があります。
こちらの記事に詳しく書いてあるので参考にしてください。
今回はgitlab-rails-storage
、storage-config
、registry-storage
の名前で3つのSecretを作成します。
RDSへのアクセス情報のSecretは次のコマンドで作成します。namespaceはupdate-test
にします。
$ kubectl create secret generic gitlab-postgresql \
--from-literal password=<PASSWORD> \
--namespace update-test
my-values.yaml
を作成してHelmコマンドでGitLabをデプロイします。
s3-full-access-role
はPodがS3にアクセスするためのものです。
global:
edition: ce
hosts:
https: false
gitlab:
name: 1ec885a2-updatetest-albing-6622-1089076412.ap-northeast-1.elb.amazonaws.com
https: false
ingress:
configureCertmanager: false
enabled: false
tls:
enabled: false
psql:
password:
secret: gitlab-postgresql
key: password
host: update-test-gitlab.crdjlj5j7v3p.ap-northeast-1.rds.amazonaws.com
port: 5432
username: gitlab
database: gitlabhq_production
minio:
enabled: false
appConfig:
lfs:
bucket: update-test-gitlab-lfs
connection:
secret: gitlab-rails-storage
key: connection
artifacts:
bucket: update-test-gitlab-artifacts
connection:
secret: gitlab-rails-storage
key: connection
uploads:
bucket: update-test-gitlab-uploads
connection:
secret: gitlab-rails-storage
key: connection
packages:
bucket: update-test-gitlab-packages
connection:
secret: gitlab-rails-storage
key: connection
externalDiffs:
enabled: true
bucket: update-test-gitlab-mr-diffs
connection:
secret: gitlab-rails-storage
key: connection
pseudonymizer:
configMap:
bucket: update-test-gitlab-pseudo
connection:
secret: gitlab-rails-storage
key: connection
backups:
bucket: update-test-gitlab-backups
tmpBucket: update-test-gitlab-tmp
time_zone: Tokyo
upgradeCheck:
enabled: false
certmanager:
install: false
nginx-ingress:
enabled: false
prometheus:
install: false
postgresql:
install: false
gitlab-runner:
install: false
registry:
minReplicas: 1
storage:
secret: registry-storage
key: config
annotations:
iam.amazonaws.com/role: s3-full-access-role
ingress:
enabled: false
gitlab:
gitlab-shell:
enabled: false
gitlab-exporter:
enabled: false
unicorn:
annotations:
iam.amazonaws.com/role: s3-full-access-role
ingress:
enabled: false
service:
type: NodePort
sidekiq:
annotations:
iam.amazonaws.com/role: s3-full-access-role
task-runner:
annotations:
iam.amazonaws.com/role: s3-full-access-role
backups:
objectStorage:
config:
secret: storage-config
key: config
$ helm install \
--namespace update-test \
--values my-values.yaml \
--version 2.3.7 \
update-test-gitlab \
gitlab/gitlab
ALBはIngressをデプロイすることで自動で作成されます。
GitLab Helm Chartに同梱されているIngressはNGINX Ingress Controller用のため、template内のIngressのannotationsを編集することになります。
Helm Chartのtemplateはできる限り編集しないほうが良いです。
values.yaml
のようにバージョン跨ぎで再利用できないためバージョンアップのたびに作業が増えるからです。
そこで今回は自分でIngressを作成してデプロイします。
spec.rules[].host
はALBのDNS名を入れます。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
kubernetes.io/ingress.class: alb
name: alb-ingress
namespace: update-test
spec:
rules:
- host: 1ec885a2-updatetest-albing-6622-1089076412.ap-northeast-1.elb.amazonaws.com
http:
paths:
- backend:
serviceName: update-test-gitlab-unicorn
servicePort: 8181
- backend:
serviceName: update-test-gitlab-unicorn
servicePort: 8080
path: /admin/sidekiq
$ kubectl apply -f alb-ingress.yaml
以上で検証環境構築は完了です。
バージョンアップ手順
2.3.7 → 2.6.9
GitLab Helm Chart 2系の最新である2.6.9にアップデートします。
my-values.yaml
に変更点はありません。
$ helm upgrade \
--namespace update-test \
--values my-values.yaml \
--version 2.6.9 \
update-test-gitlab \
gitlab/gitlab
2.6.9 → 3.0.0
GitLab Helm Chart 3.0.0にアップデートします。
ここでもmy-values.yaml
に変更点はありません。
$ helm upgrade \
--namespace update-test \
--values my-values.yaml \
--version 3.0.0 \
update-test-gitlab \
gitlab/gitlab
3.0.0 → 3.3.5
GitLab Helm Chart 3系の最新である3.3.5にアップデートします。
ここでもmy-values.yaml
に変更点はありません。
$ helm upgrade \
--namespace update-test \
--values my-values.yaml \
--version 3.3.5 \
update-test-gitlab \
gitlab/gitlab
3.3.5 → 4.0.0
GitLab Helm Chart 4.0.0からwebサーバにunicornだけでなくpumaを使用できるようになっています。(デフォルトではpumaを使用)
それに伴い、今までHelm Chart内のコードはunicornがwebserviceという名前に変わっています。
my-values.yaml
の中身を変更してからアップデートします。
$ sed -i -e "s/unicorn/webservice/g" my-values.yaml
$ helm upgrade \
--namespace update-test \
--values my-values.yaml \
--version 4.0.0 \
update-test-gitlab \
gitlab/gitlab
アクセスしてみると502画面になってしまいます。
アクセスできない原因はIngressです。Helm Chartのtemplateに含めなかったことの弊害がここで現れました。
宛先のService名を変更して再デプロイします。
$ sed -i -e "s/unicorn/webservice/g" alb-ingress.yaml
$ kubectl apply -f alb-ingress.yaml
アクセスできるようになり、アプリバージョンも13.0.0になっています。
ただ、PostgreSQL 9.6が古いと怒られています。
PostgreSQLコンテナを使っていると色々と面倒な作業が生じますが、今回はRDSを使用しているのでAWSコンソールからさっとPostgreSQL 11にアップデートします。
PostgreSQLアップデートは15分ほどで終わりました。
次にDBマイグレーション処理を行うためにhelm upgrade
します。
$ helm upgrade \
--namespace update-test \
--values my-values.yaml \
--version 4.0.0 \
update-test-gitlab \
gitlab/gitlab
バージョンアップ前のコミットなどを見てデータの整合性を確認しましょう。
問題はなさそうです。
おわりに
EKSにデプロイしたGitLabを12から13にメジャーアップデートする方法を説明しました。
今回はHelm 3.2.1を使用しましたが、Helm 2.14.3でも同様に成功することを確認済みです。
ですが今後のことを考えるとHelm 3の方が良いと思います。