著者は、 Write for DOnations プログラムの一環として、 Girls WhoCodeを選択して寄付を受け取りました。
序章
Okteto CLI は、Kubernetesで実行されるアプリケーションのローカル開発エクスペリエンスを提供するオープンソースプロジェクトです。 これを使用すると、ローカルIDEでコードを記述でき、ファイルを保存するとすぐに、変更をKubernetesクラスターにプッシュでき、アプリがすぐに更新されます。 このプロセス全体は、Dockerイメージをビルドしたり、Kubernetesマニフェストを適用したりする必要なしに実行されます。これには、かなりの時間がかかる場合があります。
このチュートリアルでは、Kubernetesネイティブアプリケーションを開発する際に、Oktetoを使用して生産性を向上させます。 まず、Kubernetesクラスターを作成し、それを使用して標準の「HelloWorld」アプリケーションを実行します。 次に、Oktetoを使用して、ローカルに何もインストールしなくても、アプリケーションを開発して自動的に更新します。
前提条件
このチュートリアルを開始する前に、次のものが必要です。
- Kubernetes1.12+クラスター。 このチュートリアルでは、セットアップで3つのノードを持つ DigitalOcean Kubernetes クラスターを使用しますが、別の方法を使用してクラスターを自由に作成できます。
kubectl
とdoctl
クラスタと通信するためにインストールおよび構成。- DockerHubアカウント
- ローカルマシンで実行されているDocker。
ステップ1—HelloWorldアプリケーションを作成する
「HelloWorld」プログラムは、Web開発における昔ながらの伝統です。 この場合、それはすべての要求に「HelloWorld」に応答する単純なWebサービスです。 Kubernetesクラスターを作成したので、Golangで「HelloWorld」アプリを作成し、それをKubernetesにデプロイするために使用するマニフェストを作成しましょう。
最初にホームディレクトリに移動します。
- cd ~
次に、という新しいディレクトリを作成します hello_world
そしてその中を移動します:
- mkdir hello_world
- cd hello_world
名前で新しいファイルを作成して開きます main.go
お気に入りのIDEまたはテキストエディタを使用:
- nano main.go
main.go
メッセージを返すGolangWebサーバーになります Hello world!
. それでは、次のコードを使用しましょう。
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
次のことを行います。
- Goソースファイルの最初のステートメントは、
package
名前。 実行可能コマンドは常に使用する必要がありますpackage main
. - The
import
セクションは、コードが依存するパッケージを示します。 この場合、それは使用しますfmt
文字列操作用、およびnet/http
HTTPサーバー用。 - The
main
関数は、バイナリへのエントリポイントです。 Thehttp.HandleFunc
メソッドは、サーバーを呼び出すように構成するために使用されますhelloServer
へのリクエスト時に機能します/
パスを受信します。http.ListenAndServe
ポート上のすべてのネットワークインターフェイスでリッスンするHTTPサーバーを起動します8080
. - The
helloServer
関数には、リクエストハンドラのロジックが含まれています。 この場合、それは書きますHello world!
リクエストへの応答として。
Dockerイメージを作成し、Dockerレジストリにプッシュして、Kubernetesがイメージをプルしてアプリケーションを実行できるようにする必要があります。
名前で新しいファイルを開きます Dockerfile
お気に入りのIDEまたはテキストエディタを使用:
- nano Dockerfile
The Dockerfile
アプリケーションのDockerコンテナを構築するために必要なコマンドが含まれます。 次のコードを使用してみましょう。
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つの段階が含まれています builder
と prod
:
- The
builder
ステージにはGoビルドツールが含まれています。 ファイルのコピーとGoバイナリの構築を担当します。 - The
prod
ステージが最終画像です。 削除されたOSとアプリケーションバイナリのみが含まれます。
これは従うべき良い習慣です。 アプリケーションとそれを実行するために必要なものだけが含まれているため、本番コンテナはより小さく、より安全になります。
コンテナイメージをビルドします(置き換えます your_DockerHub_username
Docker Hubユーザー名を使用):
- docker build -t your_DockerHub_username/hello-world:latest
次に、DockerHubにプッシュします。
- docker push your_DockerHub_username/hello-world:latest
次に、Kubernetesマニフェスト用の新しいフォルダを作成します。
- mkdir k8s
Kubernetesマニフェストを使用するときは、アプリケーションをどのように実行するかをKubernetesに指示します。 今回は、deployationオブジェクトを作成します。 したがって、新しいファイルを作成します deployment.yaml
お気に入りのIDEまたはテキストエディタを使用:
- nano k8s/deployment.yaml
次のコンテンツは、を実行するKubernetesデプロイメントオブジェクトについて説明しています。 okteto/hello-world:latest
Dockerイメージ。 このコンテンツを新しいファイルに追加しますが、あなたの場合は置き換えます okteto
の後にリストされています image
ラベル your_DockerHub_username
:
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つの主要なセクションがあります。
metadata
デプロイメントの名前を定義します。replicas
実行するコピーの数を定義します。template
Kubernetesに何をデプロイし、どのラベルを追加するかを指示します。 この場合、単一のコンテナで、okteto/hello-world:latest
画像、ポートでリッスン8080
、およびapp: hello-world
ラベル。 このラベルは、selector
セクション。
ここで、アプリケーションにアクセスする方法が必要になります。 service オブジェクトを作成することで、Kubernetesでアプリケーションを公開できます。 それを行うためにマニフェストを使い続けましょう。 と呼ばれる新しいファイルを作成します service.yaml
お気に入りのIDEまたはテキストエディタを使用:
- nano k8s/service.yaml
次のコンテンツは、 hello-world
内部でDigitalOceanロードバランサーを使用するデプロイメントオブジェクト:
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つの主要なセクションがあります。
metadata
サービスに名前を付ける方法をKubernetesに指示します。type
サービスを公開する方法をKubernetesに通知します。 この場合、デジタルオーシャンロードバランサーを介して外部に公開されます。- The
ports
labelは、公開するポートと、それらをデプロイにマッピングする方法をKubernetesに指示します。 この場合、ポートを公開します80
外部からポートに転送します8080
デプロイメントで。 selector
トラフィックを転送する方法をKubernetesに指示します。 この場合、app: hello-world
ラベルはトラフィックを受信します。
これで、「HelloWorld」アプリケーションをKubernetesにデプロイする準備が整いました。 次にこれを行います。
ステップ2—HelloWorldアプリケーションをデプロイする
このステップでは、「Hello World」アプリケーションをKubernetesにデプロイしてから、正しく機能していることを検証します。
アプリケーションをKubernetesにデプロイすることから始めます。
- kubectl apply -f k8s
次の出力が表示されます。
Outputdeployment.apps "hello-world" created
service "hello-world" created
約1分後、アプリケーションのIPを取得できるようになります。 これを使って kubectl
サービスをチェックするコマンド:
- kubectl get service hello-world
Kubernetesサービスオブジェクトを一覧表示する次のような出力が表示されます。 アプリケーションのIPを EXTERNAL-IP
桁:
OutputNAME 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をインストールするには、次のコマンドを実行します。
- curl https://get.okteto.com -sSfL | sh
このコマンドを詳しく見てみましょう。
- The
curl
コマンドは、サーバーとの間でデータを転送するために使用されます。 - The
-s
フラグは出力を抑制します。 - The
-S
フラグはエラーを示します。 - The
-f
フラグを指定すると、HTTPエラーでリクエストが失敗します。 - The
-L
フラグは、リクエストをリダイレクトに従わせます。 - The
|
オペレーターはこの出力をsh
コマンド、最新のものをダウンロードしてインストールしますokteto
ローカルマシンのバイナリ。
Windowsを実行している場合は、代わりに Webブラウザからファイルをダウンロードして、手動でファイルに追加することもできます。 $PATH
.
Okteto CLIがインストールされると、「HelloWorld」アプリケーションを開発モードにする準備が整います。
ステップ4—HelloWorldアプリケーションを開発モードにする
Okteto CLIは、Kubernetesクラスターで実行されているアプリケーションをマシンにあるコードと交換するように設計されています。 そのために、OktetoはOktetoマニフェストファイルから提供された情報を使用します。 このファイルは、ローカルコードとスワップするKubernetesデプロイメントオブジェクトを宣言します。
と呼ばれる新しいファイルを作成します okteto.yaml
お気に入りのIDEまたはテキストエディタを使用:
- nano okteto.yaml
デプロイメントオブジェクト名、使用するDockerベースイメージ、およびシェルを定義する基本的なマニフェストを作成しましょう。 後でこの情報に戻ります。 次のサンプルコンテンツファイルを使用します。
name: hello-world
image: okteto/golang:1
workdir: /app
command: ["bash"]
次のコマンドを実行して、アプリケーションを開発モードにする準備をします。
- 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」アプリケーションを開発環境にスワップします。これは次のことを意味します。
-
HelloWorldアプリケーションコンテナーがDockerイメージで更新されます
okteto/golang:1
. このイメージには、「Hello World」アプリケーションをビルド、テスト、デバッグ、および実行するために必要な開発ツールが含まれています。 -
ファイル同期サービスは、ローカルファイルシステムとアプリケーションポッドの間で変更を最新の状態に保つために作成されます。
-
開発環境でリモートシェルが起動します。 これで、ローカルマシンにいるかのように、アプリケーションをビルド、テスト、および実行できます。
-
リモートシェルで実行するプロセスが何であれ、元の「Hello World」アプリケーションポッドと同じ着信トラフィック、同じ環境変数、ボリューム、またはシークレットを取得します。 これにより、非常に現実的な本番環境のような開発環境が実現します。
同じコンソールで、次のように、通常どおりに(Dockerイメージをビルドしてプッシュせずに)アプリケーションを実行します。
- go run main.go
OutputStarting hello-world server...
アプリケーションを初めて実行するときに、Goは依存関係をダウンロードしてアプリケーションをコンパイルします。 以前と同じように、ブラウザを開いてアプリケーションのページを更新することにより、このプロセスが終了してアプリケーションをテストするのを待ちます。
これで、Kubernetesで直接開発を開始する準備が整いました。
ステップ5—Kubernetesで直接開発する
「HelloWorld」アプリケーションに変更を加えてから、これらの変更がKubernetesにどのように反映されるかを見てみましょう。
を開きます main.go
お気に入りのIDEまたはテキストエディタでファイルします。 たとえば、別のコンソールを開いて、次のコマンドを実行します。
- nano main.go
次に、応答メッセージを次のように変更します Hello world from DigitalOcean!
:
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
. 次に、アプリケーションを再実行します。
- default:hello-world /app> go run main.go
OutputStarting hello-world server...
ブラウザに戻り、「HelloWorld」アプリケーションのページをリロードします。
コードの変更は、コミット、ビルド、プッシュを必要とせずに、Kubernetesに即座に適用されました。
結論
Okteto は、ボタンをクリックするだけで、Kubernetesクラスターをフル機能の開発プラットフォームに変換します。 このチュートリアルでは、 Okteto CLI をインストールして構成し、コードを入力するのと同じ速さでコードの変更をKubernetesで直接繰り返すようにしました。 これで、 Oktetoサンプルリポジトリにアクセスして、さまざまなプログラミング言語やデバッガーでOktetoを使用する方法を確認できます。
また、Kubernetesクラスタをチームと共有する場合は、同じクラスタで作業している他の開発者から分離されるように設定された安全なKubernetes名前空間へのアクセスを各メンバーに許可することを検討してください。 この優れた機能は、 DigitalOcean KubernetesMarketplaceのOktetoAppによっても提供されます。