【GCP】ASP.NET CoreのWebアプリケーションをGCE、GKE、GAEにデプロイしてみた

デプロイするアプリ

デプロイするASP.NET Core Webアプリケーションを作成します。

デプロイするアプリケーションの作成

「新しいプロジェクトの作成」を選択します。

「ASP.NET Core Webアプリケーション」を選択します。

適当なプロジェクト名を入力して、作成を押下します。ここでは「SampleApp」としました。

.NET Coreのバージョンは「3.1」選択、「React.jsとRedux」を選択、「HTTPS用の構成」のチェックを外し、作成を押下します。
これでデプロイするアプリの作成は完了です。 

ビルド

アプリをビルドします。
「.csproj」(この例の場合は、SampleApp.csproj)のあるフォルダに移動し、以下のコマンドを実行します。

$ dotnet publish -c Release -r linux-x64 --self-contained true

GCE(Google Compute Engine)にデプロイ

GCEの設定

GCEの設定は以下のようにしました。

OSはCentOS8を選択。80番ポートにアクセスしたいので「HTTP トラフィックを許可する」をチェックします。

前準備

ファイアウォールの無効化
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
SELinuxの無効化
$ sudo vi /etc/selinux/config
SELINUX=disabled
再起動
$ sudo shutdown -r now
SELinuxの確認
$ getenforce
Disabled

アップデート

$ sudo dnf update -y

.NET Coreのインストール

$ sudo dnf install https://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm -y
$ sudo dnf install dotnet-sdk-3.1 -y

デプロイ

ビルドしてできた「bin\Release\netcoreapp3.1\linux-x64\」にあるpublishフォルダを「/home/my-user」に置きます。

アプリを「/var/web/sampleapp」に配置する事にします。

$ sudo mkdir -p /var/web/sampleapp
$ sudo cp -r /home/my-user/publish/* /var/web/sampleapp
$ cd /var/web/sampleapp
$ sudo dotnet SampleApp.dll

以上でGCEへのデプロイは完了です。

GAE(Google App Engine)にデプロイ

Cloud Shellの起動

「Cloud Shellをアクティブにする」を押下します。 

ビルドファイルのアップロード

ビルドしてできた「bin\Release\netcoreapp3.1\linux-x64\」にあるpublishフォルダをアップロードします。
ローカルでコマンドプロンプトを起動し、「bin\Release\netcoreapp3.1\linux-x64」まで移動して以下のコマンドを実行します。

$ gcloud alpha cloud-shell scp localhost:publish cloudshell:/home/my-user --recurse

Dockerfileの作成

$ touch Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
ADD /publish /app

ENTRYPOINT dotnet SampleApp.dll --urls=http://*:8080

app.yamlの作成

$ gcloud beta app gen-config --custom
$ vi app.yaml

env: flex
runtime: custom
service: sample-app

デプロイ先を指定します。

$ gcloud app deploy

 [1] asia-east2    (supports standard and flexible)
 [2] asia-northeast1 (supports standard and flexible)
 [3] asia-northeast2 (supports standard and flexible)
 [4] asia-northeast3 (supports standard and flexible)

デプロイが完了すると、

Deployed service [sample-app] to [https://${PROJECT_ID}.uc.r.appspot.com]

が表示されるので、このURLにアクセスすればアプリが表示されます。

GKE(Google Kubernetes Engine)にデプロイ

Cloud Shellの起動

「Cloud Shellをアクティブにする」を押下します。 

ビルドファイルのアップロード

ビルドしてできた「bin\Release\netcoreapp3.1\linux-x64\」にあるpublishフォルダをアップロードします。
ローカルでコマンドプロンプトを起動し、「bin\Release\netcoreapp3.1\linux-x64」まで移動して以下のコマンドを実行します。

$ gcloud alpha cloud-shell scp localhost:publish cloudshell:/home/my-user --recurse

Dockerfileの作成

$ touch Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
ADD /publish /app

ENTRYPOINT dotnet SampleApp.dll --urls=http://*:80

Dockerのコンテナ化

$ docker build -t gcr.io/${PROJECT_ID}/sample-app:1.0 .
$ docker push gcr.io/${PROJECT_ID}/sample-app:1.0

Kubernetesクラスターの作成

$ gcloud container clusters create sample-app-cluster --cluster-version=latest --num-nodes=3 --machine-type=g1-small --zone europe-west1-b

deploymentの作成

$ kubectl run sample-app --image=gcr.io/${PROJECT_ID}/sample-app:1.0 --port=80

上記コマンドして実行してdeploymentを作成後、以下のコマンドを入力します。

$ kubectl get deployments

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
sample-app   1/1     1            1           19s
$ kubectl get pods

NAME                          READY   STATUS    RESTARTS   AGE
sample-app-69b6865df6-2c9kk   1/1     Running   0          32s

serviceの作成

$ kubectl expose deployment sample-app --type="LoadBalancer" --port=80

上記コマンドして実行してserviceを作成後、以下のコマンドを入力します。

$ kubectl get services

NAME         TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)          AGE
kubernetes   ClusterIP      10.19.240.1     <none>          443/TCP          13m
sample-app   LoadBalancer   10.19.255.134   35.205.42.220   80:31955/TCP   95

sample-appのEXTERNAL-IPのIPアドレスでアクセスするとアプリが表示されます。

削除

アプリの削除
$ kubectl delete service,deployment sample-app
Kubernetesクラスターの削除
$ gcloud container clusters delete sample-app-cluster --zone=europe-west1-b
Container Registryの削除
$ gsutil ls

// 以下のようなものが表示されるので、それをgsutil rmに指定します。
gs://artifacts.${PROJECT_ID}.appspot.com/

$ gsutil rm -r gs://artifacts.${PROJECT_ID}.appspot.com/

yamlで作成①

「GKE(Google Kubernetes Engine)にデプロイ」の番外編①です。
上記の「deploymentの作成」「serviceの作成」をyamlで実行します。

apiVersion: v1
kind: Service
metadata:
  name: sample-app-service
  labels:
    app: sample-app
spec:
  type: LoadBalancer
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: sample-app
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: sample-app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sample-app
        version: "1.0"
    spec:
      containers:
      - name: sample-app
        image: gcr.io/${PROJECT_ID}/sample-app:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

yamlで作成②

「GKE(Google Kubernetes Engine)にデプロイ」の番外編②です。
「yamlで作成①」ではserviceで外部公開しましたが、ingressで外部公開します。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: sample-app-ingress
  labels:
    app: sample-app
spec:
  rules:
  - http:
      paths:
      - path: /*
        backend:
          serviceName: sample-app-service
          servicePort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: sample-app-service
  labels:
    app: sample-app
spec:
  type: NodePort
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: sample-app
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: sample-app
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sample-app
    spec:
      containers:
      - name: sample-app
        image: gcr.io/${PROJECT_ID}/sample-app:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80

Ingressはアクセスできるようになるまで数分掛かります。

$ kubectl get ingress

NAME                 HOSTS   ADDRESS         PORTS   AGE
sample-app-ingress   *       34.107.174.16   80      15m

実行

kubectl apply -f sample-app.yaml

削除

kubectl delete -f aspnetcore.yaml

番外編① Ingressを固定IPにする

以下のコマンドでグローバルIPを作成します。

gcloud compute addresses create test-ip --global

作成したグローバルUPをIngressに指定してあげるだけです。

kind: Ingress
metadata:
  name: sample-app-ingress
  labels:
    app: sample-app
  annotations:                                                    // add
    kubernetes.io/ingress.global-static-ip-name: "sample-app-ip"  // add

番外編② アカウントとプロジェクトの確認と切り替えのコマンド

認証済アカウントの一覧

$ gcloud auth list

ACTIVE  ACCOUNT
*       sample1@uts-corp.co.jp
        sample2@uts-corp.co.jp

デフォルトアカウントの切り替え

$ gcloud auth login sample2@uts-corp.co.jp

プロジェクトプロパティの一覧

$ gcloud config list project

[core]
project = hoge-app

プロジェクト指定

$ gcloud config set project sample-app

未分類GCP

Posted by ababa