GitLab ci-cd は、月間 4 億分以上のパイプライン実行を処理し、3,000 万人以上の開発者に利用されている統合 DevOps プラットフォームです。ソースコード管理、ci-cd、コンテナレジストリ、セキュリティスキャンが一体化されており、Kubernetes へのコンテナデプロイを効率的に自動化できます。Kubo は GitLab ci-cd との連携にも対応しており、エンタープライズグレードのデプロイパイプラインを構築できます。本記事では、GitLab ci-cd によるコンテナデプロイの実践的な手順を解説します。
GitLab Kubernetes Agent によるセキュアなクラスタ接続
従来の Kubernetes 連携では、クラスタの API サーバーをインターネットに公開する必要がありましたが、GitLab Kubernetes Agent はクラスタ内部からの接続を確立することで、セキュリティを大幅に向上させています。
Agent のアーキテクチャ
GitLab Agent は Pull ベースのアーキテクチャ を採用しています。Agent がクラスタ内で動作し、GitLab サーバーに対してアウトバウンド接続を確立します。これにより、Kubernetes API サーバーを外部に公開する必要がありません。
Agent の設定手順
- Agent の登録: GitLab プロジェクトで Agent を登録し、トークンを取得
- Helm でのインストール:
helm repo add gitlab https://charts.gitlab.io
helm repo update
helm upgrade --install gitlab-agent gitlab/gitlab-agent \
--namespace gitlab-agent --create-namespace \
--set config.token=<agent-token> \
--set config.kasAddress=wss://kas.gitlab.com
- Agent 設定ファイル (
.gitlab/agents/<agent-name>/config.yaml):
ci_access:
projects:
- id: your-group-your-project
groups:
- id: your-group
最大 500 のプロジェクトまたはグループを 1 つの Agent に紐づけられます。
Impersonation によるアクセス制御
GitLab の公式ドキュメントによれば、デフォルトでは ci-cd ジョブは Agent インストール時の ServiceAccount の全権限を継承します。本番環境では必ず Impersonation を設定し、ジョブごとに最小権限を適用してください。
ci_access:
projects:
- id: your-group-your-project
default_namespace: production
access_as:
impersonate:
username: gitlab-ci-deploy
groups:
- deployers
Captain.AI では、このような複雑なアクセス制御設定も AI が支援します。
.gitlab-ci.yml によるパイプライン構築
GitLab ci-cd のパイプラインは .gitlab-ci.yml で定義します。コンテナデプロイの典型的なパイプライン構成を見ていきましょう。
基本パイプライン構成
stages:
- build
- test
- scan
- deploy-staging
- deploy-production
variables:
IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
KUBE_CONTEXT: your-group/your-project:production-agent
build:
stage: build
image: docker:27
services:
- docker:27-dind
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $IMAGE_TAG .
- docker push $IMAGE_TAG
test:
stage: test
image: $IMAGE_TAG
script:
- npm ci
- npm test
container-scan:
stage: scan
image:
name: aquasec/trivy:latest
entrypoint: [""]
script:
- trivy image --exit-code 1 --severity HIGH,CRITICAL $IMAGE_TAG
deploy-staging:
stage: deploy-staging
image:
name: bitnami/kubectl:latest
entrypoint: [""]
script:
- kubectl config use-context $KUBE_CONTEXT
- kubectl set image deployment-my-app app=$image_tag -n staging
- kubectl rollout status deployment-my-app -n staging
environment:
name: staging
deploy-production:
stage: deploy-production
image:
name: bitnami/kubectl:latest
entrypoint: [""]
script:
- kubectl config use-context $KUBE_CONTEXT
- kubectl set image deployment-my-app app=$image_tag -n production
- kubectl rollout status deployment-my-app -n production
environment:
name: production
when: manual
only:
- main
GitLab Container Registry の活用
GitLab には組み込みのコンテナレジストリが含まれており、追加のレジストリサービスを構築する必要がありません。$CI_REGISTRY、$CI_REGISTRY_USER、$CI_REGISTRY_PASSWORD といった定義済み変数で、シームレスに認証できます。
Auto DevOps による自動パイプライン
GitLab Auto DevOps は、.gitlab-ci.yml を一切書かなくても、アプリケーションの言語とフレームワークを自動検出してパイプラインを構築する機能です。
Auto DevOps のステージ
| ステージ | 機能 | ツール |
|---|---|---|
| Auto Build | Dockerfile またはビルドパック検出 | Cloud Native Buildpacks |
| Auto Test | 言語固有のテスト実行 | 言語固有ツール |
| Auto Code Quality | コード品質分析 | Code Climate |
| Auto SAST | 静的セキュリティテスト | GitLab SAST |
| Auto Container Scanning | コンテナ脆弱性スキャン | Trivy |
| Auto Deploy | Kubernetes デプロイ | Helm |
| Auto Monitoring | 実行時監視 | Prometheus |
Kubernetes Agent との連携
Auto DevOps で Kubernetes Agent を使用する場合、KUBE_CONTEXT 変数でエージェントのコンテキストを指定します。
# ci-cd Variables で設定
KUBE_CONTEXT: your-group/your-project:staging-agent # ステージング用
# production 環境では別の Agent を指定可能
Kubo のマネージド環境では、Auto DevOps の設定が事前最適化されており、プロジェクト作成後すぐに自動パイプラインを開始できます。
マルチ環境デプロイ戦略
実践的なデプロイでは、環境ごとに異なる設定と承認フローが必要です。
環境スコープ変数
# GitLab ci-cd Variables(UI で設定)
# Environment: staging
REPLICAS: 1
DB_HOST: staging-db.internal
# Environment: production
REPLICAS: 3
DB_HOST: production-db.internal
Review Apps による動的環境
review:
stage: deploy-staging
script:
- kubectl config use-context $KUBE_CONTEXT
- helm upgrade --install review-$ci_commit_ref_slug .-chart \
--namespace review \
--set image.tag=$CI_COMMIT_SHA \
--set ingress.host=$CI_COMMIT_REF_SLUG.review.example.com
environment:
name: review/$CI_COMMIT_REF_SLUG
url: https://$CI_COMMIT_REF_SLUG.review.example.com
on_stop: stop-review
only:
- merge_requests
stop-review:
stage: deploy-staging
script:
- kubectl config use-context $KUBE_CONTEXT
- helm uninstall review-$CI_COMMIT_REF_SLUG --namespace review
environment:
name: review/$CI_COMMIT_REF_SLUG
action: stop
when: manual
マージリクエストごとに動的な Review 環境が作成され、レビュアーが実際のアプリケーションを確認できます。マージ後に自動または手動でクリーンアップされます。
パイプラインの高速化とコスト最適化
キャッシュ戦略
build:
stage: build
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- node_modules/
- .npm/
script:
- npm ci --cache .npm --prefer-offline
- npm run build
DAG(Directed Acyclic Graph)による並列化
stages:
- build
- test
- deploy
lint:
stage: test
needs: [] # build を待たずに実行
script:
- npm run lint
unit-test:
stage: test
needs: ["build"]
script:
- npm test
e2e-test:
stage: test
needs: ["build"]
script:
- npm run e2e
needs キーワードで DAG パイプライン を構築し、不要な待機時間を排除します。
GitLab Runner のスケーリング
Amazon EKS Auto Mode との統合により、Spot インスタンスの活用で最大 90% のコスト削減が可能です。Kubo でも同様のランナー最適化が組み込まれています。
まとめ: Kubo で GitLab ci-cd を始めよう
GitLab ci-cd は、統合 DevOps プラットフォームとしてコンテナデプロイの自動化に強力な機能を提供します。Kubernetes Agent によるセキュアな接続、Auto DevOps による自動パイプライン、Review Apps による動的環境など、エンタープライズグレードのデプロイフローを実現できます。
Kubo は GitLab ci-cd との統合を標準サポートしており、Agent の設定からマルチ環境デプロイまで、スムーズに導入できます。Captain.AI の AI アシスタントがパイプラインの最適化を支援し、GitLab ci-cd の生産性をさらに引き上げます。コンテナデプロイの自動化に取り組みたい方は、ぜひお問い合わせください。