🚀GitLab CI/CD × GKEではじめるKubernetes自動デプロイ入門

# ① 本記事の目的と読者ターゲット
**🎯 対象読者**
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
```bash
$ 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コンソールで以下のコマンドを実行
```bash
$ 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ファイルが存在するか確認
```bash
$ 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）
```bash
$ gcloud iam service-accounts create gitlab-deployer --display-name "GitLab Deployer"

```
Kubernetesアクセス権限を付与。
YOUR_PROJECT_IDはGCPで表示されているプロジェクトIDに置き換えてください。
番号: ・・・・　ID: ・・・・ のIDの方です。
```bash
$ 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が生成されたかを確認
```bash
$ 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コピー(　{　から　}　までをすべてコピー)
```bash
$ cat key.json
{
・・・・・・・・
・・・・・・・・
}
```
Key：GCP_KEY
Type：Variable
Value：コピーしたJSON内容

以上でGitLabからGKEクラスタにアクセス可能となりました。
**📁GitLab上のプロジェクトのディレクトリとファイル作成**
ディレクトリ構成は以下のようになります。
```
root/
├── .gitlab-ci.yml
└── k8s/
    ├── deployment.yaml
    └── service.yaml
```
まずdeployment.yamlを作成します。
以下の内容をコピペしてください。
```bash
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を３つ作成するdeploymentを作成します。
次にservice.yamlを作成します。
同様に以下の内容をコピーしてください
```bash
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で受け付け、先ほどのPod３つにロードバランスします。この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ファイルを作成します。
以下の内容をコピペしてください。
```bash
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クラスタ上にリソースが自動デプロイされています。以下のコマンドで確認しましょう
```bash
$ kubectl get all
```

# ⑤ 外部アクセスの確認
外部からKubernetesアプリケーションにアクセス可能かを確認します。まずIPアドレスを確認します。
```bash
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 → ブラウザアクセスまで一貫 |

最終的な連携図は以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4019750/49e5b582-c3ed-41fb-b4ef-125195b187c7.png)


**✨ 今後の発展**
Helmを用いたデプロイへの拡張

Argo CDやGitOpsパターンへの応用

TerraformによるGKEクラスタのIaC管理