開発者ドキュメント

Oktetoを使用してKubernetesでアプリケーションを開発する方法

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

序章

Okteto CLI は、Kubernetesで実行されるアプリケーションのローカル開発エクスペリエンスを提供するオープンソースプロジェクトです。 これを使用すると、ローカルIDEでコードを記述でき、ファイルを保存するとすぐに、変更をKubernetesクラスターにプッシュでき、アプリがすぐに更新されます。 このプロセス全体は、Dockerイメージをビルドしたり、Kubernetesマニフェストを適用したりする必要なしに実行されます。これには、かなりの時間がかかる場合があります。

このチュートリアルでは、Kubernetesネイティブアプリケーションを開発する際に、Oktetoを使用して生産性を向上させます。 まず、Kubernetesクラスターを作成し、それを使用して標準の「HelloWorld」アプリケーションを実行します。 次に、Oktetoを使用して、ローカルに何もインストールしなくても、アプリケーションを開発して自動的に更新します。

前提条件

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

ステップ1—HelloWorldアプリケーションを作成する

「HelloWorld」プログラムは、Web開発における昔ながらの伝統です。 この場合、それはすべての要求に「HelloWorld」に応答する単純なWebサービスです。 Kubernetesクラスターを作成したので、Golangで「HelloWorld」アプリを作成し、それをKubernetesにデプロイするために使用するマニフェストを作成しましょう。

最初にホームディレクトリに移動します。

  1. cd ~

次に、という新しいディレクトリを作成します hello_world そしてその中を移動します:

  1. mkdir hello_world
  2. cd hello_world

名前で新しいファイルを作成して開きます main.go お気に入りのIDEまたはテキストエディタを使用:

  1. nano main.go

main.go メッセージを返すGolangWebサーバーになります Hello world!. それでは、次のコードを使用しましょう。

main.go
package main

import (
    "fmt"
    "net/http"
)

func main() {
    fmt.Println("Starting hello-world server...")
    http.HandleFunc("/", helloServer)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

func helloServer(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello world!")
}

のコード main.go 次のことを行います。

Dockerイメージを作成し、Dockerレジストリにプッシュして、Kubernetesがイメージをプルしてアプリケーションを実行できるようにする必要があります。

名前で新しいファイルを開きます Dockerfile お気に入りのIDEまたはテキストエディタを使用:

  1. nano Dockerfile

The Dockerfile アプリケーションのDockerコンテナを構築するために必要なコマンドが含まれます。 次のコードを使用してみましょう。

Dockerfile
FROM golang:alpine as builder
RUN apk --update --no-cache add bash
WORKDIR /app
ADD . .
RUN go build -o app

FROM alpine as prod
WORKDIR /app
COPY --from=builder /app/app /app/app
EXPOSE 8080
CMD ["./app"]

The Dockerfile 2つの段階が含まれています builderprod:

これは従うべき良い習慣です。 アプリケーションとそれを実行するために必要なものだけが含まれているため、本番コンテナはより小さく、より安全になります。

コンテナイメージをビルドします(置き換えます your_DockerHub_username Docker Hubユーザー名を使用):

  1. docker build -t your_DockerHub_username/hello-world:latest

次に、DockerHubにプッシュします。

  1. docker push your_DockerHub_username/hello-world:latest

次に、Kubernetesマニフェスト用の新しいフォルダを作成します。

  1. mkdir k8s

Kubernetesマニフェストを使用するときは、アプリケーションをどのように実行するかをKubernetesに指示します。 今回は、deployationオブジェクトを作成します。 したがって、新しいファイルを作成します deployment.yaml お気に入りのIDEまたはテキストエディタを使用:

  1. nano k8s/deployment.yaml

次のコンテンツは、を実行するKubernetesデプロイメントオブジェクトについて説明しています。 okteto/hello-world:latest Dockerイメージ。 このコンテンツを新しいファイルに追加しますが、あなたの場合は置き換えます okteto の後にリストされています image ラベル your_DockerHub_username:

〜/ hello_world / k8s / deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-world
spec:
  selector:
    matchLabels:
      app: hello-world
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
      - name: hello-world
        image: your_DockerHub_username/hello-world:latest
        ports:
        - containerPort: 8080

デプロイメントマニフェストには、次の3つの主要なセクションがあります。

ここで、アプリケーションにアクセスする方法が必要になります。 service オブジェクトを作成することで、Kubernetesでアプリケーションを公開できます。 それを行うためにマニフェストを使い続けましょう。 と呼ばれる新しいファイルを作成します service.yaml お気に入りのIDEまたはテキストエディタを使用:

  1. nano k8s/service.yaml

次のコンテンツは、 hello-world 内部でDigitalOceanロードバランサーを使用するデプロイメントオブジェクト:

k8s / service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
      name: http
  selector:
    app: hello-world

サービスマニフェストには、次の4つの主要なセクションがあります。

これで、「HelloWorld」アプリケーションをKubernetesにデプロイする準備が整いました。 次にこれを行います。

ステップ2—HelloWorldアプリケーションをデプロイする

このステップでは、「Hello World」アプリケーションをKubernetesにデプロイしてから、正しく機能していることを検証します。

アプリケーションをKubernetesにデプロイすることから始めます。

  1. kubectl apply -f k8s

次の出力が表示されます。

Output
deployment.apps "hello-world" created service "hello-world" created

約1分後、アプリケーションのIPを取得できるようになります。 これを使って kubectl サービスをチェックするコマンド:

  1. kubectl get service hello-world

Kubernetesサービスオブジェクトを一覧表示する次のような出力が表示されます。 アプリケーションのIPを EXTERNAL-IP 桁:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-world ClusterIP your_cluster_ip your_external_ip 8080/TCP 37s

ブラウザを開いて、 your_external_ip 「HelloWorld」アプリケーションにリストされています。 次の手順に進む前に、アプリケーションが稼働していることを確認してください。

この瞬間まで、Kubernetesを使用してアプリケーションを開発するためのかなり伝統的な方法をたどってきました。 今後は、アプリケーションのコードを変更する場合は常に、新しいDockerイメージをビルドしてプッシュし、そのイメージをKubernetesからプルする必要があります。 このプロセスにはかなりの時間がかかる場合があります。 Oktetoは、この開発の内部ループを合理化するように設計されました。 Okteto CLIを見て、それがどのように役立つかを見てみましょう。

ステップ3—OktetoCLIのインストール

Okteto CLIをインストールすることで、Kubernetes開発の生産性が向上します。 Oktetoコマンドラインインターフェースは、アプリケーションコードの変更をKubernetesで実行されているアプリケーションに同期できるオープンソースプロジェクトです。 前の手順で行ったように、コンテナーをコミット、ビルド、プッシュ、または再デプロイしてアプリケーションをテストしなくても、お気に入りのIDE、デバッガー、またはコンパイラーを引き続き使用できます。

MacOSまたはLinuxマシンにOktetoCLIをインストールするには、次のコマンドを実行します。

  1. curl https://get.okteto.com -sSfL | sh

このコマンドを詳しく見てみましょう。

Windowsを実行している場合は、代わりに Webブラウザからファイルをダウンロードして、手動でファイルに追加することもできます。 $PATH.

Okteto CLIがインストールされると、「HelloWorld」アプリケーションを開発モードにする準備が整います。

ステップ4—HelloWorldアプリケーションを開発モードにする

Okteto CLIは、Kubernetesクラスターで実行されているアプリケーションをマシンにあるコードと交換するように設計されています。 そのために、OktetoはOktetoマニフェストファイルから提供された情報を使用します。 このファイルは、ローカルコードとスワップするKubernetesデプロイメントオブジェクトを宣言します。

と呼ばれる新しいファイルを作成します okteto.yaml お気に入りのIDEまたはテキストエディタを使用:

  1. nano okteto.yaml

デプロイメントオブジェクト名、使用するDockerベースイメージ、およびシェルを定義する基本的なマニフェストを作成しましょう。 後でこの情報に戻ります。 次のサンプルコンテンツファイルを使用します。

okteto.yaml
name: hello-world
image: okteto/golang:1
workdir: /app
command: ["bash"]

次のコマンドを実行して、アプリケーションを開発モードにする準備をします。

  1. okteto up
Output
✓ Development environment activated ✓ Files synchronized Namespace: default Name: hello-world Welcome to your development environment. Happy coding! default:hello-world /app>

The okteto up コマンドは、「HelloWorld」アプリケーションを開発環境にスワップします。これは次のことを意味します。

同じコンソールで、次のように、通常どおりに(Dockerイメージをビルドしてプッシュせずに)アプリケーションを実行します。

  1. go run main.go
Output
Starting hello-world server...

アプリケーションを初めて実行するときに、Goは依存関係をダウンロードしてアプリケーションをコンパイルします。 以前と同じように、ブラウザを開いてアプリケーションのページを更新することにより、このプロセスが終了してアプリケーションをテストするのを待ちます。

これで、Kubernetesで直接開発を開始する準備が整いました。

ステップ5—Kubernetesで直接開発する

「HelloWorld」アプリケーションに変更を加えてから、これらの変更がKubernetesにどのように反映されるかを見てみましょう。

を開きます main.go お気に入りのIDEまたはテキストエディタでファイルします。 たとえば、別のコンソールを開いて、次のコマンドを実行します。

  1. nano main.go

次に、応答メッセージを次のように変更します Hello world from DigitalOcean!:

main.go
package main

import (
    "fmt"
    "net/http"
)

func main() {
    fmt.Println("Starting hello-world server...")
    http.HandleFunc("/", helloServer)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

func helloServer(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello world from DigitalOcean!")
}

ワークフローが変わるのはここです。 イメージをビルドしてコンテナを再デプロイして「HelloWorld」アプリケーションを更新する代わりに、Oktetoは変更をKubernetesの開発環境に同期します。

実行したコンソールから okteto up コマンド、の実行をキャンセルします go run main.go を押すことによって CTRL + C. 次に、アプリケーションを再実行します。

  1. default:hello-world /app> go run main.go
Output
Starting hello-world server...

ブラウザに戻り、「HelloWorld」アプリケーションのページをリロードします。

コードの変更は、コミット、ビルド、プッシュを必要とせずに、Kubernetesに即座に適用されました。

結論

Okteto は、ボタンをクリックするだけで、Kubernetesクラスターをフル機能の開発プラットフォームに変換します。 このチュートリアルでは、 Okteto CLI をインストールして構成し、コードを入力するのと同じ速さでコードの変更をKubernetesで直接繰り返すようにしました。 これで、 Oktetoサンプルリポジトリにアクセスして、さまざまなプログラミング言語やデバッガーでOktetoを使用する方法を確認できます。

また、Kubernetesクラスタをチームと共有する場合は、同じクラスタで作業している他の開発者から分離されるように設定された安全なKubernetes名前空間へのアクセスを各メンバーに許可することを検討してください。 この優れた機能は、 DigitalOcean KubernetesMarketplaceOktetoAppによっても提供されます。

モバイルバージョンを終了