Kubernetes にデプロイする

このガイドでは、Bitbucket Pipelines を構成してコンテナ化したアプリケーションを Kubernetes に自動的にデプロイする方法を説明します。ここでは、アプリケーションの複数のインスタンスを実行する デプロイメントを Kubernetes 内に作成し、当社の Node.js アプリの新しいバージョンを Docker イメージの新しいバージョン内でパッケージ化し、このイメージを DockerHub にプッシュします。最後に、Pipelines を使用してデプロイメントを更新し、サービスを停止することなく新しい Docker イメージをリリースします。 

すべてのコード スニペットはサンプル リポジトリでも入手できます。

前提条件

以下が必要です。

  • イメージのプッシュ先となる、既存の DockerHub アカウント (または他の Docker レジストリ)

  • 既存の kubernetes クラスタまたは minikube テスト環境

アーティファクトのビルド

以下の例では、Node.js アプリをパッケージ化してデプロイします。Node.js プロジェクトを簡単にビルドするには、bitbucket-pipelines.yml を次のように構成します。 

bitbucket-pipelines.yml

1 2 3 4 5 6 7 pipelines: default: - step: script: # Modify the commands below to build your repository. # build and test the Node app - npm install - npm test

オンライン バリデーターを使用して bitbucket-pipelines.yml ファイルをチェックすることができます。

Docker イメージのビルドとプッシュ

次に、Node.js アプリを Docker イメージとしてパッケージ化します。これを行うには、リポジトリで Docker を有効にし、Docker イメージを作成して、レジストリにプッシュする必要があります。この例では、DockerHub にプッシュします。 

最初に、リポジトリのルートに Dockerfile が必要です。以下を使用します。 

Dockerfile

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 FROM node:boron # Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Install app dependencies COPY package.json /usr/src/app/ RUN npm install # Bundle app source COPY . /usr/src/app EXPOSE 8080 CMD [ "npm", "start" ]

次に、Docker イメージをビルドして、DockerHub レジストリ内のプライベート リポジトリにプッシュします。Bitbucket Pipelines で変数として DockerHub 資格情報を構成する必要があります。

Bitbucket でリポジトリ設定 > [Pipelines] > [リポジトリ変数] の順に移動して、DockerHub のユーザー名とパスワードを追加します。

以下に示すように、資格情報を bitbucket-pipelines.yml ファイルに追加します。

bitbucket-pipelines.yml

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 pipelines: default: - step: name: Test script: - npm install - npm test - step: name: Build script: - export IMAGE_NAME=$DOCKER_HUB_USERNAME/$APPLICATION_NAME:$BITBUCKET_COMMIT # build the Docker image (this will use the Dockerfile in the root of the repo) - docker build -t $IMAGE_NAME . # authenticate with the Docker Hub registry - docker login --username $DOCKER_HUB_USERNAME --password $DOCKER_HUB_PASSWORD # push the new Docker image to the Docker registry - docker push $IMAGE_NAME services: - docker

ここでは APPLICATION_NAME の環境変数を使用していますが、独自のものを設定することも静的に定義することもできます。

アプリケーションの複数のインスタンスを実行するデプロイメントを Kubernetes で作成する

これは、Kubernetes クラスターを構成するために Pipelines 外で一度だけ行う必要がある手動プロセスです。Kubernetes サーバーの場所を kubectl に構成済みであることを前提としています。

Bitbucket Pipelines を使用して継続的デプロイを実行するには、Kubernetes でアプリを実行するためのデプロイを構成する必要があります。kubectl コマンド ライン インターフェイスを使用して次のコマンドを実行し、デプロイを作成します。

次のプレースホルダーを上記で使用した値に置き換える必要があります。 

  • <my.dockerhub.username>  

  • <my.app>

1 kubectl run <my.app> --labels="app=<my.app>" --image=<my.dockerhub.username>/<my.app>:latest --replicas=2 --port=8080

これでアプリケーションは Kubernetes で実行されている状態になりますが、Kubernetes サービスとして公開されるまでは外部からアクセスできません。ただし、この例では Pipelines を使用してアプリケーションを更新する方法を紹介しているため、ここでは公開方法は説明していません。

要約

上記のすべてのステップを完了することで bitbucket-pipelines.yml ファイルが完成します。

bitbucket-pipelines.yml スニペット

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 pipelines: default: - step: name: Test script: - npm install - npm test - step: name: Build script: - export IMAGE_NAME=$DOCKER_HUB_USERNAME/$APPLICATION_NAME:$BITBUCKET_COMMIT # build the Docker image (this will use the Dockerfile in the root of the repo) - docker build -t $IMAGE_NAME . # authenticate with the Docker Hub registry - docker login --username $DOCKER_HUB_USERNAME --password $DOCKER_HUB_PASSWORD # push the new Docker image to the Docker registry - docker push $IMAGE_NAME services: - docker - step: name: Deploy deployment: production script: - sed -i "s|{{image}}|$DOCKER_HUB_USERNAME/$APPLICATION_NAME:$BITBUCKET_COMMIT|g" deployment.yml - pipe: atlassian/kubectl-run:1.1.2 variables: KUBE_CONFIG: $KUBE_CONFIG KUBECTL_COMMAND: 'apply' RESOURCE_PATH: 'deployment.yml'

アトラシアンのオンライン バリデーターでご使用の bitbucket-pipelines.yml ファイルをチェックすることができます。

その他のヘルプ