復元力のあるGoアプリケーションをDigitalOceanKubernetesにデプロイする方法
著者は、 Write for DOnations プログラムの一環として、 Girls WhoCodeを選択して寄付を受け取りました。
序章
Dockerはcontainerizationツールであり、実行に必要なすべてのものを保持するファイルシステムをアプリケーションに提供し、ソフトウェアが一貫したランタイム環境を持ち、関係なく同じように動作することを保証します。それが展開されている場所の。 Kubernetes は、コンテナ化されたアプリケーションのデプロイ、スケーリング、管理を自動化するためのクラウドプラットフォームです。
Dockerを活用することで、Dockerをサポートする任意のシステムにアプリケーションをデプロイでき、常に意図したとおりに機能するという自信があります。 一方、Kubernetesを使用すると、クラスター内の複数のノードにアプリケーションをデプロイできます。 さらに、コンテナのいずれかがクラッシュした場合に新しいコンテナを起動するなどの重要なタスクを処理します。 これらのツールを組み合わせることで、アプリケーションのデプロイプロセスが合理化され、開発に集中できるようになります。
このチュートリアルでは、 Go で記述されたサンプルアプリケーションを作成し、開発マシンでローカルに起動して実行します。 次に、Dockerを使用してアプリケーションをコンテナー化し、Kubernetesクラスターにデプロイして、アプリケーションへの公開エントリポイントとして機能するロードバランサーを作成します。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- アプリケーションのデプロイ元となる開発サーバーまたはローカルマシン。 このガイドの手順はほとんどのオペレーティングシステムでほぼ機能しますが、このチュートリアルでは、 Ubuntu 18.04の初期サーバー設定で説明されているように、sudo権限を持つroot以外のユーザーで構成されたUbuntu18.04システムにアクセスできることを前提としています。 チュートリアル。
- The
docker
開発マシンにインストールされているコマンドラインツール。 これをインストールするには、 Ubuntu18.04にDockerをインストールして使用する方法に関するチュートリアルのステップ1と2に従ってください。 - The
kubectl
開発マシンにインストールされているコマンドラインツール。 これをインストールするには、Kubernetesの公式ドキュメントのこのガイドに従ってください。 - DockerイメージをプッシュするDockerHubの無料アカウント。 これを設定するには、 Docker Hub Webサイトにアクセスし、ページの右上にある Get Started ボタンをクリックして、登録手順に従います。
- Kubernetesクラスター。 Kubernetesクイックスタートガイドに従って、DigitalOceanKubernetesクラスターをプロビジョニングできます。 別のクラウドプロバイダーからクラスターをプロビジョニングする場合でも、このチュートリアルを完了することができます。 クラスタを調達する場合は常に、構成ファイルを設定し、開発サーバーからクラスタに接続できることを確認してください。
ステップ1—GoでサンプルWebアプリケーションを構築する
このステップでは、Goで記述されたサンプルアプリケーションを作成します。 このアプリをDockerでコンテナ化すると、サービスが提供されます My Awesome Go App
ポートでのサーバーのIPアドレスへの要求に応じて 3000
.
最近更新していない場合は、サーバーのパッケージリストを更新することから始めます。
- sudo apt update
次に、次のコマンドを実行してGoをインストールします。
- sudo apt install golang
次に、ホームディレクトリにいることを確認し、すべてのプロジェクトファイルを含む新しいディレクトリを作成します。
- cd && mkdir go-app
次に、この新しいディレクトリに移動します。
- cd go-app/
使用する nano
または、お好みのテキストエディタで次の名前のファイルを作成します main.go
これには、Goアプリケーションのコードが含まれます。
- nano main.go
Goソースファイルの最初の行は常に package
ファイルが属するコードバンドルを定義するステートメント。 このような実行可能ファイルの場合、 package
ステートメントは、 main
パッケージ:
package main
その後、追加します import
アプリケーションが必要とするすべてのライブラリをリストできるステートメント。 ここに含める fmt
、フォーマットされたテキストの入力と出力を処理し、 net/http
、HTTPクライアントおよびサーバーの実装を提供します。
package main
import (
"fmt"
"net/http"
)
次に、 homePage
2つの引数を取る関数: http.ResponseWriter
とへのポインタ http.Request
. Goでは、 ResponseWriter
インターフェイスはHTTP応答を構築するために使用されますが、 http.Request
着信要求を表すオブジェクトです。 したがって、このブロックは着信HTTPリクエストを読み取り、応答を作成します。
. . .
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
不明なエンドポイントに対して行われた要求に対してもメッセージ:
. . .
func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "My Awesome Go App")
}
func setupRoutes() {
http.HandleFunc("/", homePage)
}
そして最後に、以下を追加します main
関数。 これにより、アプリケーションが開始されたことを示す文字列が出力されます。 その後、 setupRoutes
ポートでGoアプリケーションをリッスンして提供する前に機能する 3000
.
. . .
func setupRoutes() {
http.HandleFunc("/", homePage)
}
func main() {
fmt.Println("Go Web App Started on Port 3000")
setupRoutes()
http.ListenAndServe(":3000", nil)
}
これらの行を追加すると、最終的なファイルは次のようになります。
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アプリに必要なベースイメージを指定します。
FROM golang:1.12.0-alpine3.9
次に、を作成します app
アプリケーションのソースファイルを保持するコンテナ内のディレクトリ:
FROM golang:1.12.0-alpine3.9
RUN mkdir /app
その下に、すべてをコピーする次の行を追加します root
ディレクトリに app
ディレクトリ:
FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
次に、作業ディレクトリを次のように変更する次の行を追加します app
、これは、このDockerfile内の次のすべてのコマンドがその場所から実行されることを意味します。
FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
WORKDIR /app
Dockerに実行するように指示する行を追加します go build -o main
Goアプリのバイナリ実行可能ファイルをコンパイルするコマンド:
FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN go build -o main .
次に、バイナリ実行可能ファイルを実行する最後の行を追加します。
FROM golang:1.12.0-alpine3.9
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN go build -o main .
CMD ["/app/main"]
これらの行を追加したら、ファイルを保存して閉じます。
今あなたはこれを持っています Dockerfile
プロジェクトのルートで、以下を使用して、それに基づいてDockerイメージを作成できます。 docker build
指図。 このコマンドには、 -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
Docker Hubユーザー名に:
- 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
フラグ。コンテナがインタラクティブモードで実行されることを指定します。 それはまた持っています -p
開発マシンでGoアプリケーションが実行されているポートをマップするフラグ—ポート 3000
—移植する 3000
Dockerコンテナ内:
- 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
コマンドの出力で。
ログイン後、を使用して新しいイメージをDockerHubにプッシュします docker push
コマンド、そのように:
- docker push sammy/go-web-app
このコマンドが正常に完了すると、Docker Hubアカウントを開いて、そこでDockerイメージを確認できるようになります。
イメージを中央の場所にプッシュしたので、Kubernetesクラスターにイメージをデプロイする準備が整いました。 ただし、最初に、実行するのがはるかに面倒にならない簡単なプロセスについて説明します。 kubectl
コマンド。
ステップ3—ユーザビリティの向上 kubectl
この時点で、機能するGoアプリケーションを作成し、Dockerでコンテナー化しました。 ただし、アプリケーションはまだ公開されていません。 これを解決するには、を使用して新しいDockerイメージをKubernetesクラスターにデプロイします kubectl
コマンドラインツール。 ただし、これを行う前に、実行に役立つ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オブジェクト定義の多くが含まれているため、グループ化。 以下にフィールドを追加します apiVersion
を説明する kind
作成しているKubernetesオブジェクトの数。 この場合、作成しているのは Deployment
:
---
apiVersion: apps/v1
kind: Deployment
次に、を定義します metadata
展開用。 A metadata
一意の情報などの情報が含まれているため、すべてのKubernetesオブジェクトにフィールドが必要です name
オブジェクトの。 これ name
さまざまな展開を互いに区別し、人間が読める名前を使用してそれらを識別することができるため、便利です。
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: go-web-app
次に、 spec
あなたのブロック deployment.yml
. A spec
フィールドはすべてのKubernetesオブジェクトの要件ですが、その正確な形式はオブジェクトのタイプごとに異なります。 デプロイメントの場合、実行するレプリカの数などの情報を含めることができます。 Kubernetesでは、レプリカはクラスターで実行するポッドの数です。 ここで、 replicas
に 5
:
. . .
metadata:
name: go-web-app
spec:
replicas: 5
次に、 selector
下にネストされたブロック spec
ブロック。 これは、ポッドのラベルセレクターとして機能します。 Kubernetesはラベルセレクターを使用して、デプロイが管理する必要のあるポッドを見つける方法を定義します。
この中で selector
ブロック、定義 matchLabels
を追加します name
ラベル。 基本的に、 matchLabels
フィールドは、デプロイが適用されるポッドをKubernetesに通知します。 この例では、デプロイメントは名前が付いたすべてのポッドに適用されます go-web-app
:
. . .
spec:
replicas: 5
selector:
matchLabels:
name: go-web-app
この後、を追加します template
ブロック。 すべてのデプロイメントは、で指定されたラベルを使用してポッドのセットを作成します template
ブロック。 このブロックの最初のサブフィールドは metadata
が含まれています labels
これは、この展開のすべてのポッドに適用されます。 これらのラベルは、Kubernetesオブジェクトの属性を識別するために使用されるキーと値のペアです。 後でサービスを定義するときに、これを使用してすべてのポッドが必要であることを指定できます name
そのサービスの下でグループ化されるラベル。 これを設定する name
にラベルを付ける go-web-app
:
. . .
spec:
replicas: 5
selector:
matchLabels:
name: go-web-app
template:
metadata:
labels:
name: go-web-app
これの2番目の部分 template
ブロックは spec
ブロック。 これはとは異なります spec
以前に追加したブロック。これは、によって作成されたポッドにのみ適用されるためです。 template
展開全体ではなく、ブロックします。
この中で spec
ブロック、追加 containers
フィールドともう一度定義します name
属性。 これ name
フィールドは、この特定のデプロイメントによって作成されたコンテナーの名前を定義します。 その下で、 image
プルダウンしてデプロイします。 必ず変更してください sammy
独自のDockerHubユーザー名に:
. . .
template:
metadata:
labels:
name: go-web-app
spec:
containers:
- name: application
image: sammy/go-web-app
その後、追加します imagePullPolicy
フィールドをに設定 IfNotPresent
これは、まだイメージをプルしていない場合にのみイメージをプルするようにデプロイメントに指示します。 次に、最後に、 ports
ブロック。 そこで、定義します containerPort
これは、Goアプリケーションがリッスンするポート番号と一致する必要があります。 この場合、ポート番号は 3000
:
. . .
spec:
containers:
- name: application
image: sammy/go-web-app
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
あなたのフルバージョン 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
もう一度定義して、このファイルを開始します apiVersion
そしてその kind
あなたと同じようにフィールド deployment.yml
ファイル。 今回は、 apiVersion
フィールドに v1
、サービスに一般的に使用されるKubernetes API:
---
apiVersion: v1
kind: Service
次に、サービスの名前をに追加します metadata
あなたがしたようにブロックする deployment.yml
. これはあなたが好きなものなら何でもかまいませんが、わかりやすくするためにこれを呼びます go-web-service
:
---
apiVersion: v1
kind: Service
metadata:
name: go-web-service
次に、 spec
ブロック。 これ spec
ブロックはデプロイメントに含まれているものとは異なり、 type
このサービスのほか、ポート転送の構成と selector
.
このサービスを定義するフィールドを追加します type
に設定します LoadBalancer
. これにより、アプリケーションへのメインエントリポイントとして機能するロードバランサーが自動的にプロビジョニングされます。
警告:この手順で概説するロードバランサーを作成する方法は、外部ロードバランサーもサポートするクラウドプロバイダーからプロビジョニングされたKubernetesクラスターでのみ機能します。 さらに、クラウドプロバイダーからロードバランサーをプロビジョニングすると、追加のコストが発生することに注意してください。 これが懸念事項である場合は、Ingressを使用して外部IPアドレスを公開することを検討することをお勧めします。
---
apiVersion: v1
kind: Service
metadata:
name: go-web-service
spec:
type: LoadBalancer
次に、 ports
アプリへのアクセス方法を定義する場所をブロックします。 このブロック内にネストされ、次のフィールドを追加します。
name
、 を指していますhttp
port
、ポートを指す80
targetPort
、ポートを指す3000
これにより、ポートで着信HTTPリクエストが取得されます 80
そしてそれらをに転送します targetPort
の 3000
. これ targetPort
Goアプリケーションが実行されているのと同じポートです。
---
apiVersion: v1
kind: Service
metadata:
name: go-web-service
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 3000
最後に、 selector
あなたがしたようにブロックする deployments.yml
ファイル。 これ selector
ブロックは、名前が付けられたデプロイ済みポッドをマップするため、重要です。 go-web-app
このサービスへ:
---
apiVersion: v1
kind: Service
metadata:
name: go-web-service
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 3000
selector:
name: go-web-app
これらの行を追加したら、ファイルを保存して閉じます。 その後、もう一度使用して、このサービスをKubernetesクラスタに適用します。 kubectl apply
そのようなコマンド:
- 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
列に関連付けられたIPアドレスをコピーします go-web-service
. この出力例では、このIPアドレスは次のとおりです。 203.0.113.20
. 次に、IPアドレスをブラウザのURLバーに貼り付けて、Kubernetesクラスタで実行されているアプリケーションを表示します。
注: Kubernetesがこの方法でロードバランサーを作成すると、非同期で作成されます。 その結果、 kubectl get services
コマンドの出力には、 EXTERNAL-IP
のアドレス LoadBalancer
に残っている <pending>
実行後しばらくの間状態 kubectl apply
指図。 この場合は、数分待ってからコマンドを再実行して、ロードバランサーが作成され、期待どおりに機能していることを確認してください。
ロードバランサーはポートでリクエストを受け取ります 80
クラスタ内で実行されているポッドの1つに転送します。
これで、ロードバランサーと組み合わせたKubernetesサービスを作成し、アプリケーションへの単一の安定したエントリポイントを提供します。
結論
このチュートリアルでは、Goアプリケーションをビルドし、Dockerでコンテナー化してから、Kubernetesクラスターにデプロイしました。 次に、このアプリケーションへの復元力のあるエントリポイントを提供するロードバランサーを作成し、クラスター内のノードの1つに障害が発生した場合でも高可用性を維持できるようにしました。 このチュートリアルを使用して、独自のGoアプリケーションをKubernetesクラスターにデプロイするか、手順1で作成したサンプルアプリケーションを使用して他のKubernetesとDockerの概念を学習し続けることができます。
今後は、ロードバランサーのIPアドレスを制御するドメイン名にマッピングして、ロードバランサーのIPではなく人間が読める形式のWebアドレスを介してアプリケーションにアクセスできるようにすることができます。 さらに、次のKubernetesチュートリアルが役立つ場合があります。
- CircleCIを使用してDigitalOceanKubernetesへのデプロイを自動化する方法
- ホワイトペーパー:DigitalOceanKubernetesでのクラウドネイティブアプリケーションの実行
最後に、Goについて詳しく知りたい場合は、Goでのコーディング方法に関するシリーズを確認することをお勧めします。