復元力のあるGoアプリケーションをDigitalOceanKubernetesにデプロイする方法

提供:Dev Guides
移動先:案内検索

著者は、 Write for DOnations プログラムの一環として、 Girls WhoCodeを選択して寄付を受け取りました。

序章

Dockercontainerizationツールであり、実行に必要なすべてのものを保持するファイルシステムをアプリケーションに提供し、ソフトウェアが一貫したランタイム環境を持ち、関係なく同じように動作することを保証します。それが展開されている場所の。 Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのクラウドプラットフォームです。

Dockerを活用することで、Dockerをサポートする任意のシステムにアプリケーションをデプロイでき、常に意図したとおりに機能するという自信があります。 一方、Kubernetesを使用すると、クラスター内の複数のノードにアプリケーションをデプロイできます。 さらに、コンテナのいずれかがクラッシュした場合に新しいコンテナを起動するなどの重要なタスクを処理します。 これらのツールを組み合わせることで、アプリケーションのデプロイプロセスが合理化され、開発に集中できるようになります。

このチュートリアルでは、 Go で記述されたサンプルアプリケーションを作成し、開発マシンでローカルに起動して実行します。 次に、Dockerを使用してアプリケーションをコンテナー化し、Kubernetesクラスターにデプロイして、アプリケーションへの公開エントリポイントとして機能するロードバランサーを作成します。

前提条件

このチュートリアルを開始する前に、次のものが必要です。

  • アプリケーションのデプロイ元となる開発サーバーまたはローカルマシン。 このガイドの手順はほとんどのオペレーティングシステムでほぼ機能しますが、このチュートリアルでは、 Ubuntu 18.04の初期サーバー設定で説明されているように、sudo権限を持つroot以外のユーザーで構成されたUbuntu18.04システムにアクセスできることを前提としています。 チュートリアル。
  • 開発マシンにインストールされているdockerコマンドラインツール。 これをインストールするには、 Ubuntu18.04にDockerをインストールして使用する方法に関するチュートリアルのステップ1と2に従ってください。
  • 開発マシンにインストールされているkubectlコマンドラインツール。 これをインストールするには、Kubernetesの公式ドキュメントこのガイドに従ってください。
  • DockerイメージをプッシュするDockerHubの無料アカウント。 これを設定するには、 Docker Hub Webサイトにアクセスし、ページの右上にある Get Started ボタンをクリックして、登録手順に従います。
  • Kubernetesクラスター。 Kubernetesクイックスタートガイドに従って、DigitalOceanKubernetesクラスターをプロビジョニングできます。 別のクラウドプロバイダーからクラスターをプロビジョニングする場合でも、このチュートリアルを完了することができます。 クラスタを調達する場合は常に、構成ファイルを設定し、開発サーバーからクラスタに接続できることを確認してください。

ステップ1—GoでサンプルWebアプリケーションを構築する

このステップでは、Goで記述されたサンプルアプリケーションを作成します。 このアプリをDockerでコンテナ化すると、ポート3000でサーバーのIPアドレスへのリクエストに応じて、My Awesome Go Appが提供されます。

最近更新していない場合は、サーバーのパッケージリストを更新することから始めます。

sudo apt update

次に、次のコマンドを実行してGoをインストールします。

sudo apt install golang

次に、ホームディレクトリにいることを確認し、すべてのプロジェクトファイルを含む新しいディレクトリを作成します。

cd && mkdir go-app

次に、この新しいディレクトリに移動します。

cd go-app/

nanoまたはお好みのテキストエディタを使用して、Goアプリケーションのコードを含むmain.goという名前のファイルを作成します。

nano main.go

Goソースファイルの最初の行は、常にpackageステートメントであり、ファイルが属するコードバンドルを定義します。 このような実行可能ファイルの場合、packageステートメントはmainパッケージを指している必要があります。

go-app / main.go

package main

続いて、importステートメントを追加します。このステートメントでは、アプリケーションに必要なすべてのライブラリを一覧表示できます。 ここには、フォーマットされたテキストの入出力を処理するfmtと、HTTPクライアントおよびサーバーの実装を提供するnet/httpを含めます。

go-app / main.go

package main

import (
  "fmt"
  "net/http"
)

次に、http.ResponseWriterhttp.Requestへのポインターの2つの引数を取るhomePage関数を定義します。 Goでは、ResponseWriterインターフェースを使用してHTTP応答を作成し、http.Requestは着信要求を表すオブジェクトです。 したがって、このブロックは着信HTTPリクエストを読み取り、応答を作成します。

go-app / main.go

. . .

import (
  "fmt"
  "net/http"
)

func homePage(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "My Awesome Go App")
}

この後、setupRoutes関数を追加します。この関数は、着信要求を目的のHTTPハンドラー関数にマップします。 このsetupRoutes関数の本体に、/ルートのマッピングを新しく定義したhomePage関数に追加します。 これは、不明なエンドポイントに対して行われた要求に対しても、My Awesome Go Appメッセージを出力するようにアプリケーションに指示します。

go-app / main.go

. . .

func homePage(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "My Awesome Go App")
}

func setupRoutes() {
  http.HandleFunc("/", homePage)
}

そして最後に、次のmain関数を追加します。 これにより、アプリケーションが開始されたことを示す文字列が出力されます。 次に、ポート3000でGoアプリケーションをリッスンして提供する前に、setupRoutes関数を呼び出します。

go-app / main.go

. . .

func setupRoutes() {
  http.HandleFunc("/", homePage)
}

func main() {
  fmt.Println("Go Web App Started on Port 3000")
  setupRoutes()
  http.ListenAndServe(":3000", nil)
}

これらの行を追加すると、最終的なファイルは次のようになります。

go-app / main.go

package main

import (
  "fmt"
  "net/http"
)

func homePage(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, "My Awesome Go App")
}

func setupRoutes() {
  http.HandleFunc("/", homePage)
}

func main() {
  fmt.Println("Go Web App Started on Port 3000")
  setupRoutes()
  http.ListenAndServe(":3000", nil)
}

このファイルを保存して閉じます。 nanoを使用してこのファイルを作成した場合は、CTRL + XYENTERの順に押して作成します。

次に、次のgo runコマンドを使用してアプリケーションを実行します。 これにより、main.goファイルのコードがコンパイルされ、開発マシンでローカルに実行されます。

go run main.go
OutputGo Web App Started on Port 3000

この出力は、アプリケーションが期待どおりに機能していることを確認します。 ただし、無期限に実行されますので、CTRL + Cを押して閉じてください。

このガイド全体を通して、このサンプルアプリケーションを使用してDockerとKubernetesを試してみます。 そのためには、Dockerを使用してアプリケーションをコンテナ化する方法を学ぶために読み続けてください。

ステップ2—GoアプリケーションをDocker化する

現在の状態では、作成したGoアプリケーションは開発サーバーでのみ実行されています。 このステップでは、Dockerでコンテナー化することにより、この新しいアプリケーションをポータブルにします。 これにより、Dockerコンテナをサポートするすべてのマシンで実行できるようになります。 Dockerイメージをビルドし、DockerHubの中央パブリックリポジトリにプッシュします。 このようにして、Kubernetesクラスターはイメージをプルダウンして、クラスター内のコンテナーとしてデプロイできます。

アプリケーションをコンテナ化するための最初のステップは、Dockerfileと呼ばれる特別なスクリプトを作成することです。 Dockerfileには通常、ベースイメージに対して特定のアクションを自動的に実行したり、新しいアクションを作成したりするために、順番に実行される命令と引数のリストが含まれています。

注:このステップでは、Goアプリケーションを単一のステージでビルドして実行する単純なDockerコンテナーを構成します。 将来、Goアプリケーションが本番環境で実行されるコンテナーのサイズを縮小したい場合は、多段階ビルドを調べることをお勧めします。


Dockerfileという名前の新しいファイルを作成します。

nano Dockerfile

ファイルの先頭で、Goアプリに必要なベースイメージを指定します。

go-app / Dockerfile

FROM golang:1.12.0-alpine3.9

次に、アプリケーションのソースファイルを保持するコンテナ内にappディレクトリを作成します。

go-app / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app

その下に、rootディレクトリ内のすべてをappディレクトリにコピーする次の行を追加します。

go-app / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app

次に、作業ディレクトリをappに変更する次の行を追加します。これは、このDockerfile内の次のすべてのコマンドがその場所から実行されることを意味します。

go-app / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
WORKDIR /app

go build -o mainコマンドを実行するようにDockerに指示する行を追加します。これにより、Goアプリのバイナリ実行可能ファイルがコンパイルされます。

go-app / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN go build -o main .

次に、バイナリ実行可能ファイルを実行する最後の行を追加します。

go-app / Dockerfile

FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN go build -o main .
CMD ["/app/main"]

これらの行を追加したら、ファイルを保存して閉じます。

プロジェクトのルートにこのDockerfileがあるので、次のdocker buildコマンドを使用して、それに基づいてDockerイメージを作成できます。 このコマンドには-tフラグが含まれており、値go-web-appが渡されると、Dockerイメージにgo-web-appおよびタグという名前が付けられます。

:Dockerでは、タグを使用すると、バージョン番号など、特定のイメージに固有の情報を伝達できます。 次のコマンドは特定のタグを提供しないため、Dockerはデフォルトのタグlatestでイメージにタグを付けます。 画像にカスタムタグを付けたい場合は、次のように、画像名にコロンと選択したタグを追加します。

docker build -t sammy/image_name:tag_name .

このように画像にタグを付けると、画像をより細かく制御できます。 たとえば、v1.1とタグ付けされたイメージを本番環境にデプロイし、別のタグ付けされたv1.2を本番環境またはテスト環境にデプロイできます。


渡す最後の引数はパス.です。 これは、現在の作業ディレクトリの内容からDockerイメージをビルドすることを指定します。 また、必ずsammyをDockerHubのユーザー名に更新してください。

docker build -t sammy/go-web-app .

このビルドコマンドは、Dockerfileのすべての行を読み取り、それらを順番に実行してからキャッシュし、将来のビルドをはるかに高速に実行できるようにします。

Output. . .
Successfully built 521679ff78e5
Successfully tagged go-web-app:latest

このコマンドの作成が完了すると、次のようにdocker imagesコマンドを実行したときに画像を表示できるようになります。

docker images
OutputREPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
sammy/go-web-app   latest              4ee6cf7a8ab4        3 seconds ago       355MB

次に、次のコマンドを使用して、作成したイメージに基づいてコンテナを作成して起動します。 このコマンドには、コンテナがインタラクティブモードで実行されることを指定する-itフラグが含まれています。 また、開発マシンでGoアプリケーションが実行されているポート(ポート3000)をDockerコンテナーのポート3000にマップする-pフラグもあります。

docker run -it -p 3000:3000 sammy/go-web-app
OutputGo Web App Started on Port 3000

そのポートで他に何も実行されていない場合は、ブラウザを開いて次のURLに移動することで、アプリケーションの動作を確認できます。

http://your_server_ip:3000

注:サーバーではなくローカルマシンからこのチュートリアルを実行している場合は、代わりに次のURLにアクセスしてアプリケーションにアクセスしてください。

http://localhost:3000

ブラウザでアプリケーションが正常に動作することを確認した後、端末でCTRL + Cを押してアプリケーションを停止します。

コンテナ化されたアプリケーションをKubernetesクラスタにデプロイするときは、一元化された場所からイメージをプルできる必要があります。 そのために、新しく作成したイメージをDockerHubイメージリポジトリにプッシュできます。

次のコマンドを実行して、ターミナルからDockerHubにログインします。

docker login

これにより、DockerHubのユーザー名とパスワードの入力を求められます。 それらを正しく入力すると、コマンドの出力にLogin Succeededが表示されます。

ログイン後、次のようにdocker pushコマンドを使用して新しいイメージをDockerHubにプッシュします。

docker push sammy/go-web-app

このコマンドが正常に完了すると、Docker Hubアカウントを開いて、そこでDockerイメージを確認できるようになります。

イメージを中央の場所にプッシュしたので、Kubernetesクラスターにイメージをデプロイする準備が整いました。 ただし、最初に、kubectlコマンドの実行を大幅に軽減する簡単なプロセスについて説明します。

ステップ3—kubectlのユーザビリティを改善する

この時点で、機能するGoアプリケーションを作成し、Dockerでコンテナー化しました。 ただし、アプリケーションはまだ公開されていません。 これを解決するには、kubectlコマンドラインツールを使用して、新しいDockerイメージをKubernetesクラスターにデプロイします。 ただし、これを行う前に、Kubernetes構成ファイルに小さな変更を加えて、kubectlコマンドの実行の手間を軽減しましょう。

デフォルトでは、kubectlコマンドラインツールを使用してコマンドを実行する場合、--kubeconfigフラグを使用してクラスター構成ファイルのパスを指定する必要があります。 ただし、構成ファイルの名前がconfigで、~/.kubeという名前のディレクトリに保存されている場合、kubectlは構成ファイルの検索場所を認識し、それを取得できるようになります。 --kubeconfigフラグがそれを指していません。

そのために、まだ作成していない場合は、~/.kubeという名前の新しいディレクトリを作成します。

mkdir ~/.kube

次に、クラスター構成ファイルをこのディレクトリーに移動し、その過程で名前をconfigに変更します。

mv clusterconfig.yaml ~/.kube/config

今後は、kubectlを実行するときにクラスターの構成ファイルの場所を指定する必要はありません。これは、コマンドがデフォルトの場所にあるため、クラスターの構成ファイルを見つけることができるためです。 次のget nodesコマンドを実行して、この動作をテストします。

kubectl get nodes

これにより、Kubernetesクラスター内に存在するすべてのノードが表示されます。 Kubernetesのコンテキストでは、ノードは1つ以上のポッドをデプロイできるサーバーまたはワーカーマシンです。

OutputNAME                                        STATUS    ROLES     AGE       VERSION
k8s-1-13-5-do-0-nyc1-1554148094743-1-7lfd   Ready     <none>    1m        v1.13.5
k8s-1-13-5-do-0-nyc1-1554148094743-1-7lfi   Ready     <none>    1m        v1.13.5
k8s-1-13-5-do-0-nyc1-1554148094743-1-7lfv   Ready     <none>    1m        v1.13.5

これで、アプリケーションをKubernetesクラスターにデプロイする準備が整いました。 これを行うには、2つのKubernetesオブジェクトを作成します。1つはクラスター内のいくつかのポッドにアプリケーションをデプロイし、もう1つはアプリケーションへのアクセスポイントを提供するロードバランサーを作成します。

ステップ4—デプロイメントの作成

RESTfulリソースは、Kubernetesシステムを使用するすべての永続エンティティを構成します。このコンテキストでは、これらは一般にKubernetesオブジェクトと呼ばれます。 KubernetesオブジェクトをKubernetesに送信する作業指示と考えると便利です。必要なリソースとその動作方法をリストすると、Kubernetesは常に動作してクラスター内に存在することを確認します。

deployation として知られるKubernetesオブジェクトの一種は、同一の区別できないポッドのセットです。 Kubernetesでは、ポッドは、同じ共有ネットワークを介して通信し、同じ共有ストレージとやり取りできる1つ以上のコンテナのグループです。 デプロイメントは、一度に複数の親アプリケーションのレプリカを実行し、失敗したインスタンスを自動的に置き換えて、アプリケーションがユーザーの要求を常に処理できるようにします。

このステップでは、デプロイ用にマニフェストとも呼ばれるKubernetesオブジェクト記述ファイルを作成します。 このマニフェストには、Goアプリをクラスターにデプロイするために必要なすべての構成の詳細が含まれます。

プロジェクトのルートディレクトリgo-app/にデプロイメントマニフェストを作成することから始めます。 このような小さなプロジェクトの場合、それらをルートディレクトリに保持することで、複雑さを最小限に抑えることができます。 ただし、大規模なプロジェクトの場合は、マニフェストを別のサブディレクトリに保存して、すべてを整理しておくと便利な場合があります。

deployment.ymlという名前の新しいファイルを作成します。

nano deployment.yml

Kubernetes APIのバージョンごとに異なるオブジェクト定義が含まれているため、このファイルの先頭で、このオブジェクトの作成に使用しているapiVersionを定義する必要があります。 このチュートリアルでは、apps/v1グループ化を使用します。これには、デプロイを作成するために必要なコアKubernetesオブジェクト定義の多くが含まれているためです。 作成しているKubernetesオブジェクトのkindを説明するフィールドをapiVersionの下に追加します。 この場合、Deploymentを作成しています。

go-app / deployment.yml

---
apiVersion: apps/v1
kind: Deployment

次に、展開のmetadataを定義します。 metadataフィールドは、オブジェクトの一意のnameなどの情報が含まれているため、すべてのKubernetesオブジェクトに必要です。 このnameは、さまざまな展開を互いに区別し、人間が読める形式の名前を使用してそれらを識別することができるため、便利です。

go-app / deployment.yml

---
apiVersion: apps/v1
kind: Deployment
metadata:
    name: go-web-app

次に、deployment.ymlspecブロックを構築します。 specフィールドは、すべてのKubernetesオブジェクトの要件ですが、その正確な形式はオブジェクトのタイプごとに異なります。 デプロイメントの場合、実行するレプリカの数などの情報を含めることができます。 Kubernetesでは、レプリカはクラスターで実行するポッドの数です。 ここで、replicasの数を5に設定します。

go-app / deployment.yml

. . .
metadata:
    name: go-web-app
spec:
  replicas: 5

次に、specブロックの下にネストされたselectorブロックを作成します。 これは、ポッドのラベルセレクターとして機能します。 Kubernetesはラベルセレクターを使用して、デプロイが管理する必要のあるポッドを見つける方法を定義します。

このselectorブロック内で、matchLabelsを定義し、nameラベルを追加します。 基本的に、matchLabelsフィールドは、デプロイが適用されるポッドをKubernetesに通知します。 この例では、展開はgo-web-appという名前のすべてのポッドに適用されます。

go-app / deployment.yml

. . .
spec:
  replicas: 5
  selector:
    matchLabels:
      name: go-web-app

この後、templateブロックを追加します。 すべてのデプロイメントは、templateブロックで指定されたラベルを使用してポッドのセットを作成します。 このブロックの最初のサブフィールドはmetadataで、この展開のすべてのポッドに適用されるlabelsが含まれています。 これらのラベルは、Kubernetesオブジェクトの属性を識別するために使用されるキーと値のペアです。 後でサービスを定義するときに、このnameラベルが付いたすべてのポッドをそのサービスの下にグループ化するように指定できます。 このnameラベルをgo-web-appに設定します。

go-app / deployment.yml

. . .
spec:
  replicas: 5
  selector:
    matchLabels:
      name: go-web-app
  template:
    metadata:
      labels:
        name: go-web-app

このtemplateブロックの2番目の部分は、specブロックです。 これは、以前に追加したspecブロックとは異なります。これは、展開全体ではなく、templateブロックによって作成されたポッドにのみ適用されるためです。

このspecブロック内に、containersフィールドを追加し、もう一度name属性を定義します。 このnameフィールドは、この特定のデプロイメントによって作成されたコンテナーの名前を定義します。 その下に、プルダウンして展開するimageを定義します。 必ずsammyを独自のDockerHubユーザー名に変更してください。

go-app / deployment.yml

. . .
  template:
    metadata:
      labels:
        name: go-web-app
    spec:
      containers:
      - name: application
        image: sammy/go-web-app

続いて、imagePullPolicyフィールドをIfNotPresentに設定します。これにより、展開でイメージをプルするように指示されます。 次に、最後にportsブロックを追加します。 そこで、Goアプリケーションがリッスンするポート番号と一致するcontainerPortを定義します。 この場合、ポート番号は3000です。

go-app / deployment.yml

. . .
    spec:
      containers:
      - name: application
        image: sammy/go-web-app
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 3000

deployment.ymlのフルバージョンは次のようになります。

go-app / deployment.yml

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: go-web-app
spec:
  replicas: 5
  selector:
    matchLabels:
      name: go-web-app
  template:
    metadata:
      labels:
        name: go-web-app
    spec:
      containers:
      - name: application
        image: sammy/go-web-app
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 3000

ファイルを保存して閉じます。

次に、次のコマンドを使用して新しい展開を適用します。

kubectl apply -f deployment.yml

注:デプロイに使用できるすべての構成の詳細については、Kubernetesの公式ドキュメントをご覧ください: Kubernetes Deployments


次のステップでは、新しいデプロイに存在するポッドへのアクセス方法を管理する別の種類のKubernetesオブジェクトを作成します。 このサービスは、単一のIPアドレスを公開するロードバランサーを作成し、このIPアドレスへのリクエストはデプロイメント内のレプリカに分散されます。 このサービスは、HTTP経由でアプリケーションにアクセスできるように、ポート転送ルールも処理します。

ステップ5—サービスの作成

Kubernetesのデプロイが成功したので、アプリケーションを外部に公開する準備が整いました。 これを行うには、別の種類のKubernetesオブジェクトであるserviceを定義する必要があります。 このサービスは、クラスターのすべてのノードで同じポートを公開します。 その後、ノードはそのポートの着信トラフィックをアプリケーションを実行しているポッドに転送します。

注:わかりやすくするために、このサービスオブジェクトを別のファイルで定義します。 ただし、---で区切られている限り、複数のリソースマニフェストを同じYAMLファイルにグループ化することができます。 詳細については、Kubernetesドキュメントこのページを参照してください。


service.ymlという名前の新しいファイルを作成します。

nano service.yml

deployment.ymlファイルと同様の方法で、apiVersionフィールドとkindフィールドを再度定義して、このファイルを開始します。 今回は、apiVersionフィールドをv1にポイントします。これは、サービスに一般的に使用されるKubernetesAPIです。

go-app / service.yml

---
apiVersion: v1
kind: Service

次に、deployment.ymlで行ったように、metadataブロックにサービスの名前を追加します。 これは好きなものでもかまいませんが、わかりやすくするためにgo-web-serviceと呼びます。

go-app / service.yml

---
apiVersion: v1
kind: Service
metadata:
  name: go-web-service

次に、specブロックを作成します。 このspecブロックは、展開に含まれているブロックとは異なり、このサービスのtypeに加えて、ポート転送構成とselectorが含まれます。

このサービスのtypeを定義するフィールドを追加し、LoadBalancerに設定します。 これにより、アプリケーションへのメインエントリポイントとして機能するロードバランサーが自動的にプロビジョニングされます。

警告:この手順で概説するロードバランサーを作成する方法は、外部ロードバランサーもサポートするクラウドプロバイダーからプロビジョニングされたKubernetesクラスターでのみ機能します。 さらに、クラウドプロバイダーからロードバランサーをプロビジョニングすると、追加のコストが発生することに注意してください。 これが懸念事項である場合は、Ingressを使用して外部IPアドレスを公開することを検討することをお勧めします。


go-app / service.yml

---
apiVersion: v1
kind: Service
metadata:
  name: go-web-service
spec:
  type: LoadBalancer

次に、portsブロックを追加して、アプリへのアクセス方法を定義します。 このブロック内にネストされ、次のフィールドを追加します。

  • namehttpを指しています
  • port、ポート80を指しています
  • targetPort、ポート3000を指しています

これにより、ポート80で着信HTTPリクエストが取得され、3000targetPortに転送されます。 このtargetPortは、Goアプリケーションが実行されているのと同じポートです。

go-app / service.yml

---
apiVersion: v1
kind: Service
metadata:
  name: go-web-service
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    targetPort: 3000

最後に、deployments.ymlファイルで行ったように、selectorブロックを追加します。 このselectorブロックは、go-web-appという名前のデプロイされたポッドをこのサービスにマップするため、重要です。

go-app / service.yml

---
apiVersion: v1
kind: Service
metadata:
  name: go-web-service
spec:
  type: LoadBalancer
  ports:
  - name: http
    port: 80
    targetPort: 3000
  selector:
    name: go-web-app

これらの行を追加したら、ファイルを保存して閉じます。 その後、次のようにkubectl applyコマンドをもう一度使用して、このサービスをKubernetesクラスターに適用します。

kubectl apply -f service.yml

このコマンドは、新しいKubernetesサービスを適用し、ロードバランサーを作成します。 このロードバランサーは、クラスター内で実行されているアプリケーションへの公開エントリポイントとして機能します。

アプリケーションを表示するには、新しいロードバランサーのIPアドレスが必要です。 次のコマンドを実行して検索します。

kubectl get services
OutputNAME             TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)        AGE
go-web-service   LoadBalancer   10.245.107.189   203.0.113.20   80:30533/TCP   10m
kubernetes       ClusterIP      10.245.0.1       <none>            443/TCP        3h4m

複数のサービスを実行している可能性がありますが、go-web-serviceというラベルの付いたサービスを見つけてください。 EXTERNAL-IP列を見つけて、go-web-serviceに関連付けられているIPアドレスをコピーします。 この出力例では、このIPアドレスは203.0.113.20です。 次に、IPアドレスをブラウザのURLバーに貼り付けて、Kubernetesクラスタで実行されているアプリケーションを表示します。

注: Kubernetesがこの方法でロードバランサーを作成すると、非同期で作成されます。 その結果、kubectl get servicesコマンドの出力には、kubectl applyを実行した後、しばらくの間<pending>状態のままであるLoadBalancerEXTERNAL-IPアドレスが表示される場合があります。 ] 指図。 この場合は、数分待ってからコマンドを再実行して、ロードバランサーが作成され、期待どおりに機能していることを確認してください。


ロードバランサーは、ポート80でリクエストを受け取り、クラスター内で実行されているポッドの1つに転送します。

これで、ロードバランサーと組み合わせたKubernetesサービスを作成し、アプリケーションへの単一の安定したエントリポイントを提供します。

結論

このチュートリアルでは、Goアプリケーションをビルドし、Dockerでコンテナー化してから、Kubernetesクラスターにデプロイしました。 次に、このアプリケーションへの復元力のあるエントリポイントを提供するロードバランサーを作成し、クラスター内のノードの1つに障害が発生した場合でも高可用性を維持できるようにしました。 このチュートリアルを使用して、独自のGoアプリケーションをKubernetesクラスターにデプロイするか、手順1で作成したサンプルアプリケーションを使用して他のKubernetesとDockerの概念を学習し続けることができます。

今後は、ロードバランサーのIPアドレスを制御するドメイン名にマッピングして、ロードバランサーのIPではなく人間が読める形式のWebアドレスを介してアプリケーションにアクセスできるようにすることができます。 さらに、次のKubernetesチュートリアルが役立つ場合があります。

最後に、Goについて詳しく知りたい場合は、Goでのコーディング方法に関するシリーズを確認することをお勧めします。