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

序章

Dockercontainerizationツールであり、実行に必要なすべてのものを保持するファイルシステムをアプリケーションに提供し、ソフトウェアが一貫したランタイム環境を持ち、関係なく同じように動作することを保証します。それが展開されている場所の。 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.

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

  1. sudo apt update

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

  1. sudo apt install golang

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

  1. cd && mkdir go-app

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

  1. cd go-app/

使用する nano または、お好みのテキストエディタで次の名前のファイルを作成します main.go これには、Goアプリケーションのコードが含まれます。

  1. nano main.go

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

go-app / main.go
package main

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

go-app / main.go
package main

import (
  "fmt"
  "net/http"
)

次に、 homePage 2つの引数を取る関数: http.ResponseWriter とへのポインタ http.Request. 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 関数。 これにより、アプリケーションが開始されたことを示す文字列が出力されます。 その後、 setupRoutes ポートでGoアプリケーションをリッスンして提供する前に機能する 3000.

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 ファイルを作成し、開発マシンでローカルに実行します。

  1. go run main.go
Output
Go 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:

  1. 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

Dockerに実行するように指示する行を追加します go build -o main 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イメージを作成できます。 docker build 指図。 このコマンドには、 -t 値が渡されたときにフラグ go-web-app、Dockerイメージに名前を付けます go-web-app そしてタグそれ。

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

  1. docker build -t sammy/image_name:tag_name .

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

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

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

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

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

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

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

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

  1. docker run -it -p 3000:3000 sammy/go-web-app
Output
Go Web App Started on Port 3000

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

http://your_server_ip:3000

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

http://localhost:3000

アプリケーションがブラウザで期待どおりに動作することを確認した後、を押してアプリケーションを停止します CTRL + C あなたのターミナルで。

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

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

  1. docker login

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

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

  1. 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:

  1. mkdir ~/.kube

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

  1. mv clusterconfig.yaml ~/.kube/config

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

  1. kubectl get nodes

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

Output
NAME 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:

  1. nano deployment.yml

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

go-app / deployment.yml
---
apiVersion: apps/v1
kind: Deployment

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

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

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

go-app / deployment.yml
. . .
metadata:
	name: go-web-app
spec:
  replicas: 5

次に、 selector 下にネストされたブロック spec ブロック。 これは、ポッドのラベルセレクターとして機能します。 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

これの2番目の部分 template ブロックは 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 ブロック。 そこで、定義します containerPort これは、Goアプリケーションがリッスンするポート番号と一致する必要があります。 この場合、ポート番号は 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

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

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

  1. kubectl apply -f deployment.yml

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

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

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

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

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

と呼ばれる新しいファイルを作成します service.yml:

  1. nano service.yml

もう一度定義して、このファイルを開始します apiVersion そしてその kind あなたと同じようにフィールド deployment.yml ファイル。 今回は、 apiVersion フィールドに v1、サービスに一般的に使用されるKubernetes API:

go-app / service.yml
---
apiVersion: v1
kind: Service

次に、サービスの名前をに追加します metadata あなたがしたようにブロックする deployment.yml. これはあなたが好きなものなら何でもかまいませんが、わかりやすくするためにこれを呼びます 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

これにより、ポートで着信HTTPリクエストが取得されます 80 そしてそれらをに転送します targetPort3000. これ 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

最後に、 selector あなたがしたようにブロックする deployments.yml ファイル。 これ 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

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

  1. kubectl apply -f service.yml

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

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

  1. kubectl get services
Output
NAME 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チュートリアルが役立つ場合があります。

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