現代のソフトウェア開発は、迅速なデプロイメントサイクル、スケーラビリティ、およびレジリエンスを要求します。Kubernetesはスケーラブルなコンテナ化アプリケーション管理を可能にするオーケストレーションプラットフォームとして登場しました。GitLab CI/CDパイプラインと組み合わせることで、Kubernetesのデプロイメントは自動化され、再現可能で信頼性の高いものになります。
この記事では、GitLab CIを使用したKubernetesのためのCI/CDパイプラインの設定に関する技術的な詳細を探ります。
前提条件
CI/CDパイプラインを構成する前に、以下の要件が満たされていることを確認してください:
- GitLabアカウント:CI/CDパイプラインが構成されるGitLabリポジトリへのアクセス。
- Kubernetesクラスター:Minikube(ローカルテスト用)やGoogle Kubernetes Engine(GKE)、Amazon EKS、Azure AKSなどの管理されたクラスターなど、既存のKubernetesクラスター。
- kubectl:クラスターとの対話のためにKubernetesコマンドラインツールがインストールされ、構成されている必要があります。
- Helm(オプション):アプリケーションのデプロイと管理のためのKubernetesパッケージマネージャー。
- GitLab Runner:CI/CDジョブを実行するために、GitLab Runnerがインストールされ、プロジェクトに登録されていることを確認してください。
- Docker:コンテナイメージをコンテナレジストリにビルドし、プッシュするために必要です。
GitLabとのKubernetes統合の設定
Kubernetesクラスターを接続する
KubernetesをGitLabに統合することで、パイプラインから直接シームレスにデプロイメントとリソース管理が可能になります。以下の手順に従ってください:
- GitLabプロジェクトのダッシュボードに移動します。
- インフラストラクチャ > Kubernetesクラスターに移動します。
- Kubernetesクラスターを追加をクリックし、既存のクラスターに接続するか、クラウドプロバイダーを使用して新しいクラスターを作成します。
- ロールベースのアクセス制御(RBAC)を使用して、GitLabに適切な権限を割り当てます。
RBACの構成
RBACは、Kubernetesリソースへのアクセス権を定義します。以下はRBACを設定するためのYAML構成の例です:
apiVersion v1
kind ServiceAccount
metadata
name gitlab-sa
namespace default
---
apiVersion rbac.authorization.k8s.io/v1
kind ClusterRoleBinding
metadata
name gitlab-cluster-admin
roleRef
apiGroup rbac.authorization.k8s.io
kind ClusterRole
name cluster-admin
subjects
kind ServiceAccount
name gitlab-sa
namespace default
構成を適用
kubectl
を使用してYAMLファイルを適用します:
kubectl apply -f gitlab-rbac.yaml
認証のためのトークンを生成
GitLabに必要なサービスアカウントトークンを抽出します:
kubectl -n default get secret $(kubectl -n default get sa/gitlab-sa -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode
このトークンをGitLabのKubernetes構成設定に貼り付けます。
GitLab CI/CDパイプラインの構成
.gitlab-ci.ymlを定義する
GitLab CI構成ファイルは、パイプラインのステージ、変数、およびコマンドを定義します。以下は構成の例です:
image docker20.10
stages
build
test
deploy
variables
KUBE_NAMESPACE default
KUBECONFIG"/root/.kube/config"
IMAGE_TAG $CI_COMMIT_SHA
REGISTRY registry.gitlab.com/username/project
services
docker:dind
before_script
apk add --no-cache curl jq bash git
curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.22.0/bin/linux/amd64/kubectl
chmod +x ./kubectl && mv ./kubectl /usr/local/bin/kubectl
"$KUBE_CONFIG" | base64 -d > $KUBECONFIG echo
chmod 600 $KUBECONFIG
build
stage build
script
docker build -t $REGISTRY:$IMAGE_TAG .
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
docker push $REGISTRY:$IMAGE_TAG
unit-test
stage test
script
"Running tests..." echo
./run-tests.sh
deploy
stage deploy
script
kubectl set image deployment/my-app my-app=$REGISTRY:$IMAGE_TAG -n $KUBE_NAMESPACE
only
main
構成の説明
- ステージ: パイプラインは、モジュラー実行のためにビルド、テスト、デプロイのステージに分割されています。
- 変数: 画像タグや名前空間などの環境変数は、構成管理を簡素化します。
- before_script: 依存関係をインストールし、Kubernetesの認証を設定します。
- イメージタグ付け: 各イメージバージョンを一意に識別するためにコミットSHAを使用します。
- デプロイメント: コンテナイメージを設定することにより、Kubernetesデプロイメントを更新します。
シークレット管理
GitLab CIは、変数を使用して安全なシークレット管理をサポートします:
- 設定 > CI/CD > 変数に移動します。
-
KUBE_CONFIG
、CI_REGISTRY_USER
、およびCI_REGISTRY_PASSWORD
のような必要な変数を追加します。
変数として追加する前にkubeconfig
をエンコードします:
cat ~/.kube/config | base64 | tr -d '\n'
結果をGitLabのKUBE_CONFIG
として追加します。
Helmデプロイメント
Helmは、再利用可能なチャートを使用してKubernetesのデプロイを簡素化します。例のHelm構成:
apiVersion v2
name my-app
version1.0.0
appVersion1.0.0
image
repository registry.gitlab.com/username/project
tag latest
service
type ClusterIP
port80
パイプラインにHelmコマンドを追加します:
deploy
stage deploy
script
helm upgrade --install my-app ./helm-chart --set image.tag=$IMAGE_TAG
監視とデバッグツール
GitLabのCI/CD > パイプラインでパイプラインの状態を監視します。次のようなツールを使用します:
- PrometheusとGrafana: メトリクスと可視化のため。
- Kubernetesダッシュボード: クラスター管理。
- kubectl logs: デプロイメントログを取得します。
kubectl logs -f deployment/my-app
結論
この記事では、GitLab CIを使用してKubernetes向けのCI/CDパイプラインを構成する方法について説明しています。前提条件、YAML構成、シークレット管理、Helmデプロイメント、およびモニタリングツールについてカバーしています。このセットアップにより、開発者はコンテナ化されたアプリケーションを効率的かつ信頼性高くビルド、テスト、およびデプロイできます。
Source:
https://dzone.com/articles/cicd-pipelines-for-kubernetes-using-gitlab-ci