Kubernetes Engine での Django の実行

Google Kubernetes Engine 上で動作する Django アプリの開発は簡単に開始できます。作成するアプリは Google のすべてのプロダクトに共通のインフラストラクチャで実行されるため、ユーザー数にかかわらず、すべてのユーザーに対して確実にサービスを提供できます。

このチュートリアルは、Django ウェブ開発の知識があることを前提としています。ここでは、公式の Django チュートリアルアプリをデプロイする方法を説明します。

Django 開発の初心者の方は、1 ステップ前のチュートリアルを実施することをおすすめします。このアプリのモデルは質問からなるアンケートで、Django 管理コンソールを使用してモデルを操作できます。

このチュートリアルには Python 2.7 または 3.4 以降が必要です。また、Docker もインストールする必要があります。

始める前に

各ステップを完了したら、そのステップのチェックボックスをオンにしてください。

  1. check_box_outline_blank check_box Google Cloud Platform Console でプロジェクトを作成します。
    まだプロジェクトを作成していない場合は、このステップで作成します。プロジェクトにより、deployment、アクセス制御、課金、サービスなど、アプリに関するすべての Google Cloud Platform リソースを管理できます。
    1. GCP Console を開きます。
    2. 上部のプルダウン メニューで、[プロジェクトを作成] を選択します。
    3. [詳細設定を表示] をクリックします。[App Engine の場所] で、日本のロケーションを選択します。
    4. プロジェクトの名前を指定します。
    5. プロジェクト ID をメモしておきます。この ID はプロジェクト名とは異なる場合があります。プロジェクト ID はコマンドや構成で使用します。
  2. check_box_outline_blank check_box プロジェクトへの課金を有効にして、無料トライアルに登録します。

    プロジェクトの課金をまだ有効にしていない場合は、課金を有効にして、無料トライアルに登録します。課金を有効にすると、インスタンスの実行やデータの保存など、課金対象のリソースをアプリで使えるようになります。 無料トライアル期間中は、どのサービスも課金されることはありません。

  3. check_box_outline_blank check_box Cloud SDK をインストールします。

    Cloud SDK をまだインストールしていない場合は、今すぐ Cloud SDK をインストールして初期化してください。Cloud SDK には、GCP 上のリソースの作成と管理に使用できるツールとライブラリが含まれています。

  4. check_box_outline_blank check_box プロジェクトで API を有効にします。

    GCP Console が開き、このチュートリアルで使用する API が自動的に有効になります。使用される API は、Cloud SQL Admin API と Compute Engine API です。

アプリをダウンロードし、実行する

前提条件が完了したら、Django サンプルアプリをダウンロードしてデプロイします。次のセクションで、このサンプルの構成、実行、デプロイについて説明します。

Django アプリのクローンを作成する

Django サンプルアプリのコードは、GitHub の GCP Python Samples リポジトリにあります。

ローカルマシンにリポジトリのクローンを作成します。

git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git

サンプルコードが含まれているディレクトリに移動します。

cd python-docs-samples/container_engine/django_tutorial

zip ファイルとしてサンプルをダウンロードして展開することもできます。

ローカル環境の設定

デプロイされたアプリは、App Engine 環境に組み込まれている Cloud SQL Proxy を使用して Cloud SQL インスタンスと通信します。ただし、アプリをローカルでテストするには、プロキシのローカルコピーを開発環境にインストールして使用する必要があります。

詳細については Cloud SQL Proxy をご覧ください。

Cloud SQL インスタンスに対する基本的な管理タスクを行うには、PostgreSQL クライアントを使用します。

Cloud SQL Proxy をインストールする

Cloud SQL Proxy をダウンロードしてインストールします。Cloud SQL Proxy は、ローカルで実行中の Cloud SQL インスタンスに接続します。

Linux 64 ビット

  1. プロキシをダウンロードします。
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

Linux 32 ビット

  1. プロキシをダウンロードします。
    wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.386 -O cloud_sql_proxy
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

macOS 64 ビット

  1. プロキシをダウンロードします。
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

macOS 32 ビット

  1. プロキシをダウンロードします。
    curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.386
    
  2. プロキシを実行できるようにします。
    chmod +x cloud_sql_proxy
    

Windows 64 ビット

https://dl.google.com/cloudsql/cloud_sql_proxy_x64.exe を右クリックして [名前を付けてリンク先を保存] を選択し、プロキシをダウンロードします。ファイルの名前を cloud_sql_proxy.exe に変更します。

Windows 32 ビット

https://dl.google.com/cloudsql/cloud_sql_proxy_x86.exe を右クリックして [名前を付けてリンク先を保存] を選択し、プロキシをダウンロードします。ファイルの名前を cloud_sql_proxy.exe に変更します。
お使いのオペレーティング システムがここに記載されていない場合は、ソースからプロキシをコンパイルすることもできます。

Cloud SQL インスタンスを作成する

  1. PostgreSQL インスタンスの Cloud SQL を作成します。

    インスタンスに polls-instance などの名前を付けます。インスタンスを使用できるようになるまで数分かかることがあります。インスタンスの準備が整うと、インスタンス リストに表示されます。

  2. 次に、Cloud SDK を使用して次のコマンドを実行します。[YOUR_INSTANCE_NAME] は、Cloud SQL インスタンスの名前を表します。
    gcloud sql instances describe [YOUR_INSTANCE_NAME]

    出力の [CONNECTION_NAME] に示されている値を書き留めます。

    [CONNECTION_NAME] の値は、[PROJECT_NAME]:[REGION_NAME]:[INSTANCE_NAME] の形式になっています。

Cloud SQL インスタンスを初期化する

  1. 上記の手順の [CONNECTION_NAME] の値を使用して Cloud SQL Proxy を起動します。

    Linux と macOS

    ./cloud_sql_proxy -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:5432

    Windows

    cloud_sql_proxy.exe -instances="[YOUR_INSTANCE_CONNECTION_NAME]"=tcp:5432

    [YOUR_INSTANCE_CONNECTION_NAME] を上記の手順で記録した [CONNECTION_NAME] の値に置き換えます。

    ローカルでテストを行うために、このステップでローカル コンピュータから Cloud SQL インスタンスへの接続を確立します。ローカルでのアプリのテストが終了するまで、Cloud SQL Proxy を実行したままにしてください。

  2. Cloud SQL のユーザーとデータベースを作成します。

    GCP Console

    1. Cloud SQL インスタンス polls-instance に対して、GCP Console を使用して新しいデータベースを作成します。たとえば、polls などの名前を使用します。
    2. Cloud SQL インスタンス polls-instance に対して、GCP Console を使用して新しいユーザーを作成します。

    Postgres クライアント

    1. 別のコマンドライン タブで、Postgres クライアントをインストールします。
      sudo apt-get install postgresql
    2. Postgres クライアント、または同様のプログラムを使用して、インスタンスに接続します。プロンプトが表示されたら、構成したルート パスワードを入力します。
      psql --host 127.0.0.1 --user postgres --password
    3. 次のコマンドを使用して、必要なデータベース、ユーザー、アクセス権限を Cloud SQL データベース内に作成します。その際、[POSTGRES_USER][POSTGRES_PASSWORD] は使用するユーザー名とパスワードに置き換えます。
      CREATE DATABASE polls;
      CREATE USER [POSTGRES_USER] WITH PASSWORD '[POSTGRES_PASSWORD]';
      GRANT ALL PRIVILEGES ON DATABASE polls TO [POSTGRES_USER];
      GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO [POSTGRES_USER];
      

サービス アカウントの作成

プロキシには、Cloud SQL インスタンスに対する編集者の権限を持つサービス アカウントが必要です。サービス アカウントの詳細については、GCP Auth ガイドをご覧ください。

  1. Google Cloud Platform Console の [サービス アカウント] ページに移動します。

    [サービス アカウント] ページに移動

  2. 必要に応じて、Cloud SQL インスタンスを含むプロジェクトを選択します。
  3. [サービス アカウントを作成] をクリックします。
  4. [サービス アカウントの作成] ダイアログで、わかりやすいサービス アカウント名を指定します。
  5. [役割] で、次のいずれかの役割を選択します。
    • [Cloud SQL] > [Cloud SQL クライアント]
    • [Cloud SQL] > [Cloud SQL 編集者]
    • [Cloud SQL] > [Cloud SQL 管理者]
  6. 必要に応じて後でこのサービス アカウントを簡単に見つけられるようにするために、サービス アカウントの ID を一意のわかりやすい値に変更します。
  7. [新しい秘密鍵の提供] をクリックします。
  8. デフォルトのキータイプは JSON であり、この値を使用するのが適切です。
  9. [作成] をクリックします。

    秘密鍵ファイルがマシンにダウンロードされます。秘密鍵ファイルは、別の場所に移動できます。安全な場所に鍵ファイルを保管してください。

データベースを構成する

  1. ローカルテストでデータベースにアクセスできるように環境変数を設定します。

Linux / macOS

export DATABASE_USER=<your-database-user>
export DATABASE_PASSWORD=<your-database-password>

Windows

set DATABASE_USER=<your-database-user>
set DATABASE_PASSWORD=<your-database-password>

GKE を構成する

  1. このアプリケーションは、polls という名前の単一の Kubernetes 構成で表されます。polls.yaml で、<your-project-id> を実際のプロジェクト ID に置き換えます。

  2. polls.yaml で、<your-cloudsql-connection-string> を、次のコマンドで出力される connectionName の値に置き換えます。

    gcloud beta sql instances describe [YOUR_INSTANCE_NAME]
    

ローカル コンピュータでアプリを実行する

  1. ローカル コンピュータ上で Django アプリを実行するには、Python、pip、および virtualenv を含む Python 開発環境をセットアップする必要があります。

  2. 孤立した Python 環境を作成し、依存関係をインストールします。

    virtualenv env
    source env/bin/activate
    pip install -r requirements.txt
    
  3. モデルを設定するために Django の移行を実行します。

    python manage.py makemigrations
    python manage.py makemigrations polls
    python manage.py migrate
    
  4. ローカル ウェブサーバーを起動します。

    python manage.py runserver
    
  5. ブラウザで、http://localhost:8000 にアクセスします。

「Hello, world.You're at the polls index.」というテキストが記されたページが表示されます。このサンプルアプリのページは、ユーザーのコンピュータで実行されている Django ウェブサーバーによって配信されます。次に進む準備ができたら、Ctrl+C キーを押して、ローカル ウェブサーバーを停止してください。

Django 管理コンソールを使用する

  1. スーパーユーザーを作成します。

    python manage.py createsuperuser
    
  2. メイン プログラムを実行します。

    python manage.py runserver
    
  3. ブラウザで、http://localhost:8000/admin にアクセスします。

  4. createsuperuser の実行時に作成したユーザー名とパスワードで管理サイトにログインします。

アプリを GKE にデプロイする

  1. アプリが Google Cloud Platform にデプロイされている場合は、Gunicorn サーバーが使用されます。Gunicorn は静的コンテンツを処理しないため、アプリは Cloud Storage を使用して静的コンテンツを処理します。

    Cloud Storage バケットを作成して、一般公開します。<your-gcs-bucket> を任意のバケット名で置き換えます。たとえば、プロジェクト ID をバケット名として使用できます。

    gsutil mb gs://<your-gcs-bucket>
    gsutil defacl set public-read gs://<your-gcs-bucket>
    
  2. すべての静的コンテンツをローカルで 1 つのフォルダにまとめます。

    python manage.py collectstatic
    
  3. 静的コンテンツを Cloud Storage にアップロードします。

    gsutil rsync -R static/ gs://<your-gcs-bucket>/static
    
  4. mysite/settings.py で、STATIC_URL の値をこの URL に設定します。<your-gcs-bucket> を実際のバケット名に置き換えてください。

    http://storage.googleapis.com/<your-gcs-bucket>/static/
    
  5. GKE を初期化するには、GCP Console に移動します。[Kubernetes Engine is getting ready. This may take a minute or more] というメッセージが消えるまで待ちます。

  6. GKE クラスタを作成します。

    gcloud container clusters create polls \
      --scopes "https://www.googleapis.com/auth/userinfo.email","cloud-platform" \
      --num-nodes 4 --zone "us-central1-a"
    

    [Project [PROJECT_ID] is not fully initialized with the default service accounts.] というエラーが表示されましたか。

    {container_name_short} を初期化する

    エラーが表示された場合は、コンソールに移動して、プロジェクトの GKE を初期化します。

    GKE ページに移動

    [Kubernetes Engine is getting ready. This can take a minute or more] というメッセージが消えるまで待ちます。

  7. クラスタを作成した後、gcloud ツールと統合された kubectl コマンドライン ツールを使用して、GKE クラスタを操作します。gcloudkubectl は別々のツールであるため、kubectl が正しいクラスタとやり取りするように構成されていることを確認します。

    gcloud container clusters get-credentials polls --zone "us-central1-a"
    
  8. GKE アプリを Cloud SQL インスタンスに接続できるようにするには、いくつかのシークレットが必要です。1 つはインスタンスレベルのアクセス(接続)に必要となり、他の 2 つはデータベース アクセスに必要となります。この 2 つのレベルのアクセス制御の詳細については、インスタンスのアクセス制御をご覧ください。

    1. インスタンスレベルのアクセス用にシークレットを作成するには、サービスアカウントを作成したときにダウンロードしたキーの場所を指定します。

      kubectl create secret generic cloudsql-oauth-credentials --from-file=credentials.json=[PATH_TO_CREDENTIAL_FILE]
      
    2. データベース アクセスに必要なシークレットを作成します。

      kubectl create secret generic cloudsql --from-literal=username=[PROXY_USERNAME] --from-literal=password=[PASSWORD]
      
  9. Cloud SQL プロキシのパブリック Docker イメージを取得します。

    docker pull b.gcr.io/cloudsql-docker/gce-proxy:1.05
    
  10. Docker イメージを作成します。<your-project-id> は、プロジェクト ID で置き換えます。

    docker build -t gcr.io/<your-project-id>/polls .
    
  11. 認証ヘルパーとして gcloud を使用するように docker を構成します。これにより、Google Container Registry にイメージを push できます。

    gcloud auth configure-docker
    
  12. Docker イメージを push します。<your-project-id> を実際のプロジェクト ID に置き換えます。

    docker push gcr.io/<your-project-id>/polls
    
  13. GKE リソースを作成します。

    kubectl create -f polls.yaml
    
  14. リソースを作成すると、クラスタ上に polls のポッドが 3 つ生成されます。ポッドのステータスを確認します。

    kubectl get pods
    

    ポッドのステータスが Running に変わるまで待ちます。数分かかることもあります。ポッドの準備ができていないか、再起動が発生する場合は、特定のポッドのログを取得して問題を確認できます。

    kubectl logs <your-pod-id>
    

GCP でアプリが実行されることを確認する

ポッドの準備ができたら、ロードバランサのパブリック IP アドレスを取得します。

kubectl get services polls

ブラウザで EXTERNAL-IP アドレスに移動して Django の基本ランディング ページを開き、管理コンソールにアクセスします。

コードについて

Django サンプルアプリは、Django の標準ツールを使用して作成されています。以下のコマンドは、プロジェクトと polls アプリを作成します。

django-admin startproject mysite
python manage.py startapp polls

settings.py には、SQL データベースの構成が含まれています。

DATABASES = {
    'default': {
        # If you are using Cloud SQL for MySQL rather than PostgreSQL, set
        # 'ENGINE': 'django.db.backends.mysql' instead of the following.
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'polls',
        'USER': os.getenv('DATABASE_USER'),
        'PASSWORD': os.getenv('DATABASE_PASSWORD'),
        'HOST': '127.0.0.1',
        'PORT': '5432',
    }
}

polls.yaml ファイルには、2 つの Kubernetes リソースが指定されています。1 つは、Django ウェブアプリ用の一貫した名前とプライベート IP アドレスを定義するサービスです。もう 1 つは、一般公開される外部 IP アドレスを持つ HTTP ロードバランサです。

# The polls service provides a load-balancing proxy over the polls app
# pods. By specifying the type as a 'LoadBalancer', Container Engine will
# create an external HTTP load balancer.
# For more information about Services see:
#   https://cloud.google.com/container-engine/docs/services/
# For more information about external HTTP load balancing see:
#   https://cloud.google.com/container-engine/docs/load-balancer
apiVersion: v1
kind: Service
metadata:
  name: polls
  labels:
    app: polls
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: polls

このサービスはネットワーク名と IP アドレスを提供し、GKE ポッドはこのサービスの背後でアプリのコードを実行します。polls.yaml ファイルは、GKE ポッドの宣言型更新を行うデプロイメントを指定します。このサービスは、サービスのセレクタをデプロイのラベルと照合し、トラフィックをデプロイに送信します。ここでは、セレクタ polls がラベル polls と照合されます。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: polls
  labels:
    app: polls
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: polls
    spec:
      containers:
      - name: polls-app
        # Replace  with your project ID or use `make template`
        image: gcr.io/<your-project-id>/polls
        # This setting makes nodes pull the docker image every time before
        # starting the pod. This is useful when debugging, but should be turned
        # off in production.
        imagePullPolicy: Always
        env:
            - name: DATABASE_USER
              valueFrom:
                secretKeyRef:
                  name: cloudsql
                  key: username
            - name: DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: cloudsql
                  key: password
        ports:
        - containerPort: 8080

      - image: b.gcr.io/cloudsql-docker/gce-proxy:1.05
        name: cloudsql-proxy
        command: ["/cloud_sql_proxy", "--dir=/cloudsql",
                  "-instances=<your-cloudsql-connection-string>=tcp:5432",
                  "-credential_file=/secrets/cloudsql/credentials.json"]
        volumeMounts:
          - name: cloudsql-oauth-credentials
            mountPath: /secrets/cloudsql
            readOnly: true
          - name: ssl-certs
            mountPath: /etc/ssl/certs
          - name: cloudsql
            mountPath: /cloudsql
      volumes:
        - name: cloudsql-oauth-credentials
          secret:
            secretName: cloudsql-oauth-credentials
        - name: ssl-certs
          hostPath:
            path: /etc/ssl/certs
        - name: cloudsql
          emptyDir:
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...