① 本記事の目的と読者ターゲット
🎯 対象読者
GitLab CI/CD を業務・学習で導入したい方
GKE(Google Kubernetes Engine)での自動デプロイを体験したい方
kubectl apply をCI/CDに組み込みたいインフラ/DevOps志向のエンジニア
💡 なぜGitLab × GKEなのか?
GitLab は無料で強力なCI/CD機能を備え、GitHubと比較してCI統合が容易
GKE はGoogle Cloud提供のマネージドKubernetesで、セットアップが迅速
本構成は商用システムでも用いられる王道パターンで、学習と実務の両立が可能
✅ この記事でできるようになること
GitLabからGKEへ自動でマニフェストをデプロイ
GitLab・GKEの認証情報の適切な管理方法(File型変数)
Nginxのサービス公開とブラウザでの動作確認
🗂 目次
①はじめに(この記事で学べること)
②GKEクラスタ・DockerHub・GitLabプロジェクトの準備
③CI/CD環境構築のステップ解説
④.gitlab-ci.yml の作成とパイプライン実行
⑤GKEアプリにWebブラウザからアクセス
⑥まとめと今後の発展
② GKEクラスタ構築・DockerHub・GitLab準備
🔧 GKEクラスタの作成
zoneは東京であるasia-northeast1-aを指定し、クラスタの名前はgitlab-gkeとしています。必要に応じて変更してください
zoneやregionの確認は以下のページから確認可能です。
https://cloud.google.com/compute/docs/regions-zones?hl=ja
$ gcloud container clusters create gitlab-gke --zone=asia-northeast1-a
🐳 DockerHub
DockerHubにログインし、アカウントを作成しておく(後の拡張で使用)
DockerHubのアカウントを登録してない方は以下のページを参考に作成できます
https://hub.docker.com/ (DockerHub公式ページ)
https://docs.docker.jp/docker-hub/accounts.html (DockerHubアカウント作成手順)
🧾 GitLab プロジェクト作成
GitLab.com 上に新しいプロジェクトを作成
https://gitlab.com/ (GitLab公式ページ)
リポジトリ名は gitlab-gke-cicd などが分かりやすい
もしGitLabのアカウント登録をしていない方は以下のページを参考に作成できます。
https://gitlab.com/users/sign_up (GitLabアカウント登録サイト)
https://mashimashi.net/skill/git/515/ (わかりやすいGitLabアカウント登録手順サイト)
③ CI/CD環境構築のステップ
🔑 SSHキーとクラスタ認証情報の取得
まずSSHキーを作成します。GCPコンソールで以下のコマンドを実行
$ ssh-keygen -t rsa
実行後現在のディレクトリに.sshというディレクトリが作成されます。
このディレクトリ内のid_rsa.pub(公開鍵)をGitLabに登録します。GitLabプロジェクト作成後、上部にSSHキーを追加してくださいというメッセージが表示されていると思うのでそこから今回のid_rsa.pubを登録してください。id_rsa.pubともう一つid_rsaが.ssh/にありますが、これは秘密鍵なので外部に公開しないようにしましょう。
詳しくは以下のページは詳しくSSHキー作成手順を解説しています。必要に応じて参考にしてください。
https://qiita.com/to3izo/items/9b5b80430e43cd3c4e3c
🔐 GitLab に ~/.kube/config を登録
まず~/.kube/configを生成。クラスタの認証情報を取得。.kube/以下にconfigファイルが存在するか確認
$ gcloud container clusters get-credentials gitlab-gke --zone asia-northeast1-a
$ ls .kube
GitLabの左側から以下のように移動します。
GitLab > Project > Settings > CI/CD > Variables
変数名:KUBECONFIG_DATA
Type:File
Value:~/.kube/config の内容
~/.kube/configはGCPコンソールからcatなどで表示し、コピーしてCI/CDのVariablesにペーストしてください。ファイル名ではなく中身であることに注意。
⚠ 注意:これは機密情報のため、外部に公開しないこと!
✅ サービスアカウントとGCP認証の準備
サービスアカウント作成(IAM)
$ gcloud iam service-accounts create gitlab-deployer --display-name "GitLab Deployer"
Kubernetesアクセス権限を付与。
YOUR_PROJECT_IDはGCPで表示されているプロジェクトIDに置き換えてください。
番号: ・・・・ ID: ・・・・ のIDの方です。
$ gcloud projects add-iam-policy-binding YOUR_PROJECT_ID --member="serviceAccount:gitlab-deployer@YOUR_PROJECT_ID.iam.gserviceaccount.com" --role="roles/container.admin"
JSON キーを生成して保存、key.jsonが生成されたかを確認
$ gcloud iam service-accounts keys create key.json --iam-account=gitlab-deployer@YOUR_PROJECT_ID.iam.gserviceaccount.com
$ ls
key.json ←存在を確認
JSONキーをGitLab CI/CDのvariableにGCP_KEYとして登録
先ほどのkey.jsonコピー( { から } までをすべてコピー)
$ cat key.json
{
・・・・・・・・
・・・・・・・・
}
Key:GCP_KEY
Type:Variable
Value:コピーしたJSON内容
以上でGitLabからGKEクラスタにアクセス可能となりました。
📁GitLab上のプロジェクトのディレクトリとファイル作成
ディレクトリ構成は以下のようになります。
root/
├── .gitlab-ci.yml
└── k8s/
├── deployment.yaml
└── service.yaml
まずdeployment.yamlを作成します。
以下の内容をコピペしてください。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.14
name: nginx1
ports:
- containerPort: 80
このマニフェストを簡単に説明するとnginx Podを3つ作成するdeploymentを作成します。
次にservice.yamlを作成します。
同様に以下の内容をコピーしてください
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: LoadBalancer
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: nginx
このマニフェストを簡単に説明すると外部からのアクセスをPort80で受け付け、先ほどのPod3つにロードバランスします。このserviceによってWebブラウザなどの外部からのアクセスが可能となります。
今回はマニフェストの細かい内容やYAMLの記述法は省略しますが詳しくは以下のサイトを参考にしてください。
https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/kubernetes-objects/ (Kubernetes公式ドキュメント)
https://qiita.com/keitean/items/1da8f397ae673c50cf3a (YAMLの記述法)
次に.gitlab-ci.ymlファイルを作成します。
以下の内容をコピペしてください。
stages: # ステージの定義
- test
before_script:
- echo "$GCP_KEY" > ${CI_PROJECT_DIR}/gcp-key.json
- gcloud auth activate-service-account --key-file=gcp-key.json
- gcloud config set project $GCP_PROJECT_ID
- gcloud container clusters get-credentials gitlab-gke --zone asia-northeast1-a
- mkdir -p ~/.kube
- cp "$KUBECONFIG_DATA" ~/.kube/config
- export KUBECONFIG=~/.kube/config
build_job: # ジョブ名
stage: test # ステージ名
script:
- kubectl apply -f k8s/
default:
image: $DEFAULT_CI_IMAGE
timeout: 90m
variables:
DEFAULT_CI_IMAGE: "mcp/kubernetes"
.gitlab-ci.ymlファイルはGitLab CI/CDパイプラインの設定ファイルであり、GitLabで実行されるジョブの起動順序やジョブの内容を定義します。ファイル名は必ず.gitlab-ci.ymlとしてください。よくあるミスとして.gitlab-ci.yamlと拡張子の指定ミスがあるので注意しましょう。またプロジェクトのルートに配置しないと認識されないので必ずroot/にあるか確認しましょう。
.gitlab-ci.ymlの記述方法などは以下のサイトを参考にしてください。
https://gitlab-docs.creationline.com/ee/ci/quick_start/ (公式GitLab日本版)
https://archives.docs.gitlab.com/16.0/ee/ci/yaml/gitlab_ci_yaml.html (公式GitLab)
④ パイプラインの実行と確認
.gitlab-ci.ymlをコミット後、GitLabの「CI/CD > Pipelines」でパイプラインが走ることを確認(ここでエラーが起きやすい!ログの見方やデバッグになれてない方はエラー部分をChatGPTなどに投げると大体解決してくれます)
成功後 Passと表示されます。この時点でGKEクラスタ上にリソースが自動デプロイされています。以下のコマンドで確認しましょう
$ kubectl get all
⑤ 外部アクセスの確認
外部からKubernetesアプリケーションにアクセス可能かを確認します。まずIPアドレスを確認します。
kubectl get svc
ここでnginx-serviceのEXTERNAL-IPのIPアドレスをメモします。
お使いのブラウザでhttp://EXTERNAL-IP:80とにアクセスし、「Welcome to Nginx!」と表示されれば成功!
または、GCPコンソールからの確認も可能です。
上部の「ウェブでプレビュー」アイコン(ポート 8080)を指定後同様に「Welcome to Nginx!」と表示されれば成功!
⑥まとめと今後の展望
✅ まとめ
学んだこと | 内容 |
---|---|
GitLabとGKEの連携方法 |
kubectl + CI/CDで自動化可能に |
セキュアな認証方法 |
gcloud + SA + File型変数 |
Kubernetesの実行と公開 | YAML → GitLab → GKE → ブラウザアクセスまで一貫 |
✨ 今後の発展
Helmを用いたデプロイへの拡張
Argo CDやGitOpsパターンへの応用
TerraformによるGKEクラスタのIaC管理