コンテンツにスキップ

ko: Goによる高速なKubernetesマイクロサービス開発

公開日: 2019-04-10 、  最終更新日: 2024-01-17

ko: Goによる高速なKubernetesマイクロサービス開発

著者: Matt Moore、Chainguard創業者/CTO

私はもともとKnative開発者を支援するために ko を書きました。コミュニティからの好意的なフィードバック、特に最近のKubecon Seattle 2018での ko に関するIBMブースでの講演により、この紹介記事を書くことにしました。私たちと同じように ko を楽しんでいただければ幸いです。 slack.knative.dev でのフィードバックをお待ちしています。

ここ数年、コンテナに関する話題が尽きません。Docker、Kubernetes、そして関連テクノロジーは、パブリッククラウドを席巻しました(しゃれではありません)。それと同時に、ソフトウェアプロジェクトがますます複雑になるにつれて、開発プロセスも複雑になっているようです。

最初は

すぐに

skaffold のようなツールは、任意の言語とDockerfileに対してこのプロセスをラップして管理を容易にし(そして高速化し)ますが、それでも 職人技の手作りDockerfile を書く必要があり、通常は、このオーケストレーション方法(例:何をどこにプッシュするか)をツールに指示するために *より多くの* yaml(またはその他)を書く必要があります。

ko は、Goのイディオムを活用して設定を排除するという異なるアプローチを採用しています。

そのようなGoのイディオムの1つは、バイナリが「インポートパス」によって参照されることです。Goバイナリをインストールする一般的な方法は

# e.g. installing ko itself
go get github.com/google/go-containerregistry/cmd/ko

# This example is based on:
# https://github.com/google/ko/blob/master/cmd/ko/test/test.yaml
apiVersion: v1
kind: Pod
metadata:
name: kodata
spec:
containers:
- name: test
# ko builds and publishes this Go binary, and replaces this
# with an image name.
image: github.com/google/go-containerregistry/cmd/ko/test
restartPolicy: Never

ko を使い始めるのに追加の設定ファイルは必要ありません。コンテナイメージへの参照をインポートパスに置き換えるだけです。

それだけです。

ko でこれをどのように使用しますか?

ko は、ユーザーがイメージをどこに公開したいかを知る必要もあります。これは、チームの各開発者が通常独自のものを使用するため、yamlマニフェストの外部で定義されます。

export KO_DOCKER_REPO=gcr.io/mattmoor-private/ko

たとえば、Knativeで開発する場合、私は自分の .bashrc ファイルでこれを使用します。

注:DockerHubユーザー(および場合によってはその他)の場合、DockerHubはマルチレベルリポジトリ名をサポートしていないため、これは次のようになります。 docker.io/username

ko apply -f directory/ -f file.yaml

その後、コマンドラインインターフェースは kubectl をモデルにしています。

これは kubectl apply と同じ効果がありますが、yamlから参照されるGoマイクロサービスも、はるかに少ない構成でビルド、コンテナ化、および公開します。

Kubernetes yamlとコードのみを書きます。DockerfileもMakefileもありません。1つのコマンドを実行すると、最新のコードが実行されます。

~/go/src/github.com/google/go-containerregistry
$ ko apply -f cmd/ko/test/test.yaml
Using base .. for github.com/google/go-containerregistry/cmd/ko/test
Publishing gcr.io/mattmoor-public/test-01234abcd:latest
mounted blob: sha256:deadbeef
mounted blob: sha256:baadf00d
pushed blob sha256:deadf00d
pushed blob sha256:baadbeef
pushed blob sha256:beeff00d
gcr.io/mattmoor-public/test-01234abcd:latest: digest: ... size: 915
Published gcr.io/mattmoor-public/test-01234abcd@...
pod/kodata created
~/go/src/github.com/google/go-containerregistry$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kodata 0/1 Completed 0 1

上記の例に従って(幅に合わせてトリミング)

イメージのみ

ko がサポートする最も簡単なトリックは、単にイメージをコンテナ化して公開することです。ko について何も知らなくても、ほとんどのGoバイナリで動作するのが素晴らしい点です。

~/go/src/golang.org/x/tools
$ ko publish ./cmd/goimports/
Using base .. for golang.org/x/tools/cmd/goimports
Publishing gcr.io/mattmoor-public/goimports-01234:latest
mounted blob: sha256:deadbeef
mounted blob: sha256:baadf00d
mounted blob: sha256:deadf00d
pushed blob sha256:baadbeef
pushed blob sha256:beeff00d
gcr.io/mattmoor-public/goimports-01234:latest: digest: ... size: 914
Published gcr.io/mattmoor-public/goimports-01234@...

たとえば(幅に合わせてトリミング)

ko はリリースにも使えます!

# This does everything `apply` does except it pipes to
# stdout instead of kubectl
ko resolve -f config/ > release.yaml
# Later...
kubectl apply -f release.yaml

また、 ko を使用して、再配布のために次のように公開することもできます。

たとえば、これを使用してすべてのKnativeコンポーネントをリリースしています。

試してみて、ご意見をお聞かせください。

これは、 ko でできること、そして ko があなたのためにしてくれることのほんの一部です。詳細については、 README.md を参照してください。ご質問がある場合は、 slack.knative.dev の#ko、または Twitter @mattomata でご連絡ください。

よくある落とし穴

  1. koが慣習に大きく依存しているため、注意すべき点がいくつかあります。
  2. ${GOPATH} にいる必要があります。 そうしないと、どのパッケージにいるかがわかりません。

タイプミスは最悪です。 ko はスキーマに依存しないため、「main」パッケージのインポートパスではない文字列は無視されます。そのため、インポートパスに単純なタイプミスがあると、そのまま残され、Pod ErrImagePull が表示される可能性があります。

私たちは、サイトのトラフィックを理解するために、アナリティクスとCookieを使用しています。お客様のサイト利用に関する情報は、その目的のためにGoogleと共有されます。詳細はこちら