復元力のあるGoアプリケーションをDigitalOceanKubernetesにデプロイする方法
著者は、 Write for DOnations プログラムの一環として、 Girls WhoCodeを選択して寄付を受け取りました。
序章
Dockerはcontainerizationツールであり、実行に必要なすべてのものを保持するファイルシステムをアプリケーションに提供し、ソフトウェアが一貫したランタイム環境を持ち、関係なく同じように動作することを保証します。それが展開されている場所の。 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.ResponseWriter
とhttp.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 + X
、Y
、ENTER
の順に押して作成します。
次に、次の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.yml
のspec
ブロックを構築します。 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
ブロックを追加して、アプリへのアクセス方法を定義します。 このブロック内にネストされ、次のフィールドを追加します。
name
、http
を指していますport
、ポート80
を指していますtargetPort
、ポート3000
を指しています
これにより、ポート80
で着信HTTPリクエストが取得され、3000
のtargetPort
に転送されます。 この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>
状態のままであるLoadBalancer
のEXTERNAL-IP
アドレスが表示される場合があります。 ] 指図。 この場合は、数分待ってからコマンドを再実行して、ロードバランサーが作成され、期待どおりに機能していることを確認してください。
ロードバランサーは、ポート80
でリクエストを受け取り、クラスター内で実行されているポッドの1つに転送します。
これで、ロードバランサーと組み合わせたKubernetesサービスを作成し、アプリケーションへの単一の安定したエントリポイントを提供します。
結論
このチュートリアルでは、Goアプリケーションをビルドし、Dockerでコンテナー化してから、Kubernetesクラスターにデプロイしました。 次に、このアプリケーションへの復元力のあるエントリポイントを提供するロードバランサーを作成し、クラスター内のノードの1つに障害が発生した場合でも高可用性を維持できるようにしました。 このチュートリアルを使用して、独自のGoアプリケーションをKubernetesクラスターにデプロイするか、手順1で作成したサンプルアプリケーションを使用して他のKubernetesとDockerの概念を学習し続けることができます。
今後は、ロードバランサーのIPアドレスを制御するドメイン名にマッピングして、ロードバランサーのIPではなく人間が読める形式のWebアドレスを介してアプリケーションにアクセスできるようにすることができます。 さらに、次のKubernetesチュートリアルが役立つ場合があります。
- CircleCIを使用してDigitalOceanKubernetesへのデプロイを自動化する方法
- ホワイトペーパー:DigitalOceanKubernetesでのクラウドネイティブアプリケーションの実行
最後に、Goについて詳しく知りたい場合は、Goでのコーディング方法に関するシリーズを確認することをお勧めします。