OpenShift 全部俺 Advent Calendar 2017
OpenShiftにはKubernetesに無いImageStreamというオブジェクトがあります。ImageStreamは内部的にタグに対応するDockerレジストリを管理し、それに追加で機能を提供します。ImageStreamは大きく以下の三つの機能を提供しています。
- Dockerレジストリのタグにpushされたイメージのバージョン履歴(Stream)を保持する機能
- 実際にはImageStreamのタグは「Dockerレジストリのタグ」だけではなく任意のコンテナイメージ履歴をトラックできる、後述のイメージプロモーションなど
- Dockerレジストリにpushなど、ImageStreamのタグが更新されたら自動的にアクションを起動できるImageChange更新トリガーの提供
- OpenShift内部レジストリとの連携、イメージキャッシュ
ImageStreamは内部で管理されるDockerレジストリのイメージのメタデータを参照しています。イメージのレイヤーデータは保持していません。oc explain is
のdescriptionは以下のようになっています。
ImageStream stores a mapping of tags to images, metadata overrides that are applied when images are tagged in a stream, and an optional reference to a Docker image repository on a registry.
OpenShiftのBuildConfig、DeploymentConfigはこのImageStreamの機能を利用することにより、たとえばベースイメージのセキュリティ脆弱性の修正を更新をトリガーに、それに依存しているコンテナを全て再ビルド再デプロイしてセキュリティ修正を反映させる、というようなユースケースが実現できます。ImageStreamはこのようなコンテナイメージの管理の効率化、自動化を行う上で必要となる機能を提供しています。
たとえばdev, test, stage, prodというようなタグを定義しておき、devはDockerレジストリapp:latest
に対応していて開発者によりpushされ継続的に更新されている、それをテスト環境へリリースするにはoc tag app:dev app:test
を実行するとその時点でのapp:dev
が指しているイメージがapp:test
タグに追加され、ImageChangeトリガーによってテスト環境へリリースされる、というようなイメージプロモーションによる迅速なリリースを実現することができます。
https://docs.openshift.org/3.11/dev_guide/application_lifecycle/promoting_applications.html
KubernetesにはOpenShiftのDeploymentConfig由来のDeploymentsというオブジェクトがありますが、KubernetesにはImageStreamがないので、その関連機能ももちろんスコープ外となっており、OpenShiftのDeploymentConfigの方が基本的には高機能なものとなっています。