Open SuzukiTakamasa opened 3 months ago
Google Cloud Platform (GCP) アカウント gcloud コマンドラインツール Docker Kubernetes CLI (kubectl)
GCPコンソールで新しいプロジェクトを作成してください。
sh
gcloud init 2.2 GKEクラスタの作成 sh
gcloud container clusters create todo-cluster --num-nodes=3 --zone=[YOUR_ZONE] gcloud container clusters get-credentials todo-cluster --zone=[YOUR_ZONE] [YOUR_ZONE]を適切なGCPゾーンに置き換えます。
フロントエンド: todo-app/Dockerfile
Dockerfile
#Stage 1: Build FROM node:14 AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build #Stage 2: Serve FROM nginx:alpine COPY --from=builder /app/out /usr/share/nginx/html EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]
バックエンド: todo-api/Dockerfile
FROM node:14 WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build EXPOSE 3000 CMD ["npm", "run", "start:prod"]
まず、GCPのコンテナレジストリに認証を行います。
gcloud auth configure-docker
次に、次のコマンドでコンテナイメージをビルドし、GCPのコンテナレジストリにプッシュします。
cd todo-app docker build -t gcr.io/[YOUR_PROJECT_ID]/todo-app:latest . docker push gcr.io/[YOUR_PROJECT_ID]/todo-app:latest
cd ../todo-api docker build -t gcr.io/[YOUR_PROJECT_ID]/todo-api:latest . docker push gcr.io/[YOUR_PROJECT_ID]/todo-api:latest
[YOUR_PROJECT_ID]はGCPのプロジェクトIDに置き換えます。
k8s/deployment.yaml
yaml
apiVersion: apps/v1 kind: Deployment metadata: name: todo-app spec: replicas: 2 selector: matchLabels: app: todo-app template: metadata: labels: app: todo-app spec: containers:
apiVersion: apps/v1 kind: Deployment metadata: name: todo-api spec: replicas: 2 selector: matchLabels: app: todo-api template: metadata: labels: app: todo-api spec: containers:
apiVersion: v1 kind: Service metadata: name: todo-app-service spec: type: LoadBalancer ports:
apiVersion: v1 kind: Service metadata: name: todo-api-service spec: type: LoadBalancer ports:
kubectl apply -f k8s/deployment.yaml Kubernetesクラスタがこれらの設定に基づいてPodとServiceを作成し、GKEはロードバランサを設定してくれます。
GCPのCloud SQLを使用することをお勧めします。Cloud SQLをGKEクラスタに接続するための設定は少し手間がかかりますが、以下の手順を参考にしてください。
Cloud SQLインスタンスを作成し、PostgreSQLをインストールする。 Cloud SQLインスタンスの外部IPやVPCを設定。 KubernetesのSecretを作成し、データベースの接続情報を保存。 Podがデータベースに接続する際に、Secretを環境変数として読み込む。 例: Kubernetes Secretの作成
kubectl create secret generic postgres-secret \ --from-literal=DB_HOST=[CLOUD_SQL_HOST] \ --from-literal=DB_PORT=5432 \ --from-literal=DB_USER=[DB_USER] \ --from-literal=DB_PASSWORD=[DB_PASSWORD] \ --from-literal=DB_NAME=[DB_NAME]
前提条件
Google Cloud Platform (GCP) アカウント gcloud コマンドラインツール Docker Kubernetes CLI (kubectl)
手順
1. GCPプロジェクトの作成
GCPコンソールで新しいプロジェクトを作成してください。
2. GKE Clusterの設定
2.1 gcloudの設定
sh
gcloud init 2.2 GKEクラスタの作成 sh
gcloud container clusters create todo-cluster --num-nodes=3 --zone=[YOUR_ZONE] gcloud container clusters get-credentials todo-cluster --zone=[YOUR_ZONE] [YOUR_ZONE]を適切なGCPゾーンに置き換えます。
3. デプロイ用のDockerイメージを作成&プッシュ
3.1 Dockerfileの作成
フロントエンド: todo-app/Dockerfile
Dockerfile
バックエンド: todo-api/Dockerfile
Dockerfile
3.2 コンテナイメージのビルドとプッシュ
まず、GCPのコンテナレジストリに認証を行います。
sh
次に、次のコマンドでコンテナイメージをビルドし、GCPのコンテナレジストリにプッシュします。
sh
[YOUR_PROJECT_ID]はGCPのプロジェクトIDに置き換えます。
4. Kubernetes (GKE) デプロイメントの設定
4.1 YAMLファイルの作成
k8s/deployment.yaml
yaml
apiVersion: apps/v1 kind: Deployment metadata: name: todo-app spec: replicas: 2 selector: matchLabels: app: todo-app template: metadata: labels: app: todo-app spec: containers:
apiVersion: apps/v1 kind: Deployment metadata: name: todo-api spec: replicas: 2 selector: matchLabels: app: todo-api template: metadata: labels: app: todo-api spec: containers:
apiVersion: v1 kind: Service metadata: name: todo-app-service spec: type: LoadBalancer ports:
apiVersion: v1 kind: Service metadata: name: todo-api-service spec: type: LoadBalancer ports:
4.2 デプロイメントの適用
sh
kubectl apply -f k8s/deployment.yaml Kubernetesクラスタがこれらの設定に基づいてPodとServiceを作成し、GKEはロードバランサを設定してくれます。
5. データベースの設定
GCPのCloud SQLを使用することをお勧めします。Cloud SQLをGKEクラスタに接続するための設定は少し手間がかかりますが、以下の手順を参考にしてください。
Cloud SQLインスタンスを作成し、PostgreSQLをインストールする。 Cloud SQLインスタンスの外部IPやVPCを設定。 KubernetesのSecretを作成し、データベースの接続情報を保存。 Podがデータベースに接続する際に、Secretを環境変数として読み込む。 例: Kubernetes Secretの作成
sh
kubectl create secret generic postgres-secret \ --from-literal=DB_HOST=[CLOUD_SQL_HOST] \ --from-literal=DB_PORT=5432 \ --from-literal=DB_USER=[DB_USER] \ --from-literal=DB_PASSWORD=[DB_PASSWORD] \ --from-literal=DB_NAME=[DB_NAME]