第3章 コアとなる概念
3.1. 概要
以下のトピックでは、OpenShift Container Platform の使用時に使われるコアとなる概念およびオブジェクトについてのハイレベルのアーキテクチャー情報を提供します。これらのオブジェクトの多くは Kubernetes をベースとしており、さらに機能が充実した開発ライフサイクルプラットフォームを提供するために OpenShift Container Platform によって拡張されています。
- コンテナーおよびイメージは、アプリケーションをデプロイするための構成要素です。
- Pod およびサービスは、コンテナーの相互通信およびプロキシー接続を可能にします。
- プロジェクトおよびユーザーは、コミュニティーがコンテンツを共同で編成し、管理するためのスペースと手段を提供します。
- ビルドおよびイメージストリームは、有効なイメージのビルドおよび新規イメージへの対応を可能にします。
- デプロイメントは、ソフトウェア開発およびデプロイメントライフサイクルの拡張したサポートを追加します。
- ルートはサービスを一般に公開します。
- テンプレートは、カスタマイズされたパラメーターに基づく数多くのオブジェクトの同時作成を可能にします。
3.2. コンテナーおよびイメージ
3.2.1. コンテナー
OpenShift Container Platform アプリケーションの基本的な単位は コンテナー と呼ばれています。Linux コンテナーテクノロジーは、プロセスを指定されたリソースとの対話に制限するために実行中のプロセスを分離する軽量なメカニズムです。
数多くのアプリケーションインスタンスは、お互いのプロセス、ファイル、ネットワークなどが表示されない状態で単一ホストのコンテナーで実行される場合があります。コンテナーは任意のワークロードに使用されますが、通常、それぞれのコンテナーは Web サーバーまたはデータベースなどの (「マイクロサービス」と呼ばれることの多い) 単一サービスを提供します。
Linux カーネルは数年にわたりコンテナーテクノロジーの各種機能を統合してきました。最近では、Docker プロジェクトはホスト上の Linux コンテナーの便利な管理インターフェースを開発しました。OpenShift Container Platform および Kubernetes は、複数ホストのインストールで Docker 形式のコンテナーをオーケストレーションする機能を追加しています。
OpenShift Container Platform の使用時に Docker CLI またはサービスとの直接的な対話は発生しないものの、それらの機能および用語を理解しておくことは、OpenShift Container Platform におけるそれらの役割やアプリケーションのコンテナー内での機能を理解する上で重要です。docker RPM は RHEL 7、CentOS および Fedora の一部として利用できるため、これを OpenShift Container Platform と切り離して実験的に使用することができます。ガイドとなる概要情報については、『Get Started with Docker Formatted Container Images on Red Hat Systems』という記事を参照してください。
3.2.1.1. Init コンテナー
Pod にはアプリケーションコンテナーのほかに init コンテナーを含めることができます。Init コンテナーにより、セットアップスクリプトやバインディングコードを再編成できます。init コンテナーは、完了するまで常に実行される点で通常のコンテナーとは異なります。各 init コンテナーは次のコンテナーが起動する前に正常に完了している必要があります。
詳細については、「Pod およびサービス」を参照してください。
3.2.2. イメージ
OpenShift Container Platform のコンテナーは Docker 形式のコンテナー イメージ をベースにしています。イメージは、単一コンテナーを実行するためのすべての要件、およびそのニーズおよび機能を記述するメタデータを含むバイナリーです。
イメージについては、パッケージ化テクノロジーのコンテキストで考えることができます。コンテナーには、作成時にコンテナーに追加のアクセスを付与しない限り、イメージで定義されるリソースにのみアクセスできます。同じイメージを複数のホスト間の複数コンテナーにデプロイし、それらの間で負荷を分散することにより、OpenShift Container Platform はイメージにパッケージ化されたサービスの冗長性および水平方向のスケーリングを提供できます。
Docker CLI を直接使用してイメージをビルドすることができますが、OpenShift Container Platform はコードおよび設定を既存イメージに追加して新規イメージの作成を支援するビルダーイメージも提供しています。
アプリケーションは一定の期間にわたって開発されるため、単一のイメージ名が実際には「同一」イメージの数多くの異なるバージョンを参照する場合があります。それぞれの異なるイメージは、通常は 12 文字 (例: fd44297e2ddb) に省略されるハッシュ (fd44297e2ddb050ec4f… などの長い 16 進数) で一意に参照されます。
イメージバージョンタグポリシー
Docker サービスは、必要なイメージを指定するために、イメージ名に加えて、バージョン番号ではなくタグ (v1、v2.1、GA、またはデフォルト latest) の適用を可能にします。そのため、同じイメージが centos (これは latest タグを示します)、centos:centos7、または fd44297e2ddb などとして参照されます。
公式の OpenShift Container Platform イメージには latest タグを使用しないでください。これらは openshift3/ 以降のイメージであり、latest は 3.4、または 3.5 などの数多くのバージョンを参照する可能性があります。
イメージへのタグの付け方によって更新ポリシーが決定されます。より具体的なタグを使用すると、イメージが更新される頻度は低くなります。以下を使用して選択されている OpenShift Container Platform イメージポリシーを判別してください。
- vX.Y
-
vX.Y タグは X.Y.Z-<number> を参照します。たとえば、
registry-consoleイメージが v3.4 に更新されると、これは最新の 3.4.Z-<number> タグを参照します (例: 3.4.1-8)。 - X.Y.Z
- 上記の vX.Y サンプルと同様です。X.Y.Z タグは最新の X.Y.Z-<number> を参照します。たとえば、3.4.1 は 3.4.1-8 を参照します。
- X.Y.Z-<number>
- タグは一意であり、変更されません。このタグを使用する際、イメージが更新される際にイメージはタグを更新しません。たとえば、イメージが更新される場合でも、3.4.1-8 は 3.4.1-8 を常に参照します。
3.2.3. コンテナーレジストリー
コンテナーレジストリーは Docker 形式のコンテナーイメージの保存および取得を行うサービスです。レジストリーには、1 つ以上のイメージリポジトリーのコレクションが含まれます。各イメージリポジトリーには 1 つ以上のタグ付けされたイメージが含まれます。Docker は独自のレジストリーである Docker Hub を提供しますが、プライベートまたはサードパーティーのレジストリーを使用することもできます。Red Hat はサブスクリプションをお持ちのお客様に対し、registry.access.redhat.com にてレジストリーを提供しています。OpenShift Container Platform はカスタムコンテナーイメージを管理するための独自の内部レジストリーも提供します。
以下の図には、コンテナー、イメージ、およびレジストリー間の関係が示されています。

3.3. Pod およびサービス
3.3.1. Pod
OpenShift Container Platform は Pod という Kubernetes の概念を使用しています。これはホスト上に同時にデプロイされる 1 つ以上のコンテナーであり、定義され、デプロイされ、管理される最小のコンピュート単位です。
Pod はコンテナーに対するマシンインスタンス (物理または仮想) とほぼ同等です。各 Pod には独自の内部 IP アドレスが割り当てられるため、各 Pod はそのポート領域全体を所有し、Pod 内のコンテナーはそれらのローカルストレージおよびネットワークを共有できます。
Pod にはライフサイクルがあります。Pod が定義されると、ノードで実行されるように割り当てられ、コンテナーが終了するまで実行されるか、またはその他の理由でコンテナーが削除されるまで実行されます。ポリシーおよび終了コードによっては、Pod は終了後に削除されるか、またはコンテナーのログへのアクセスを有効にするために保持される可能性があります。
ほとんどの場合、OpenShift Container Platform は Pod を変更不可能なものとして処理します。Pod が実行中の場合、Pod に変更を加えることはできません。OpenShift Container Platform が変更を実装する場合、まず既存の Pod を終了してから、これを変更された設定またはベースイメージのいずれかまたはその両方で再作成します。Pod は拡張可能なものとして処理されますが、再作成時に状態を維持しません。そのため、通常 Pod はユーザーから直接管理されるのでははく、ハイレベルの コントローラーで管理される必要があります。
OpenShift Container Platform ノードホストごとの Pod の最大数については、「クラスターの制限」を参照してください。
レプリケーションコントローラーによって管理されないベア Pod はノードの中断時に再スケジュールされません。
以下は Pod のサンプル定義です。これは、統合コンテナーレジストリーという OpenShift Container Platform インフラストラクチャーの一部で、長期間実行されるサービスを提供します。これは数多くの Pod の機能を示していますが、それらのほとんどは他のトピックで説明されるため、ここではこれらについて簡単に説明します。
例3.1 Pod オブジェクト定義 (YAML)
apiVersion: v1
kind: Pod
metadata:
annotations: { ... }
labels: 1
deployment: docker-registry-1
deploymentconfig: docker-registry
docker-registry: default
generateName: docker-registry-1- 2
spec:
containers: 3
- env: 4
- name: OPENSHIFT_CA_DATA
value: ...
- name: OPENSHIFT_CERT_DATA
value: ...
- name: OPENSHIFT_INSECURE
value: "false"
- name: OPENSHIFT_KEY_DATA
value: ...
- name: OPENSHIFT_MASTER
value: https://master.example.com:8443
image: openshift/origin-docker-registry:v0.6.2 5
imagePullPolicy: IfNotPresent
name: registry
ports: 6
- containerPort: 5000
protocol: TCP
resources: {}
securityContext: { ... } 7
volumeMounts: 8
- mountPath: /registry
name: registry-storage
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-br6yz
readOnly: true
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: default-dockercfg-at06w
restartPolicy: Always 9
serviceAccount: default 10
volumes: 11
- emptyDir: {}
name: registry-storage
- name: default-token-br6yz
secret:
secretName: default-token-br6yz- 1
- Pod は 1 つ以上のラベルで「タグ付け」されます。これは単一操作で Pod のグループを選択したり、管理したりするために使用できます。これらのラベルは
メタデータハッシュにキー/値形式で保存されます。この例で使用されている 1 つのラベルは docker-registry=default です。 - 2
- Pod はそれらの namespace 内で一意の名前を持つ必要があります。Pod 定義は
generateName属性で名前のベースを指定できますが、一意の名前を生成するためにランダムな文字が自動的に追加されます。 - 3
containersはコンテナー定義の配列を指定します。この場合 (ほとんどの場合)、1 つのみが指定されます。- 4
- 必要な値を各コンテナーに渡すために、環境変数を指定することができます。
- 5
- Pod の各コンテナーは独自の Docker 形式のコンテナーイメージからインスタンス化されます。
- 6
- コンテナーは、Pod の IP で利用可能にされるポートにバインドできます。
- 7
- OpenShift Container Platform は、コンテナーが特権付きコンテナーとして実行されるか、選択したユーザーが実行できるようにするかなどを指定するコンテナーのセキュリティーコンテキストを定義します。デフォルトのコンテキストには多くの制限がありますが、管理者は必要に応じてこれを変更できます。
- 8
- コンテナーは外部ストレージボリュームがマウントされるコンテナー内の場所を指定します。この場合、レジストリーのデータを保存するためのボリュームと、OpenShift Container Platform API に対する要求の実行時にレジストリーが必要とする認証情報にアクセスするためのボリュームがあります。
- 9
- 10
- OpenShift Container Platform API に対して要求を実行する Pod には共通するパターンが見られ、
serviceAccountフィールドには、要求を実行する際に Pod が認証する必要のあるサービスアカウントユーザーを指定します。これにより、カスタムインフラストラクチャーコンポーネントの詳細なアクセス制御が可能になります。 - 11
- Pod はコンテナーで使用できるストレージボリュームを定義します。この場合、レジストリーストレージの一時ボリュームおよびサービスアカウントの認証情報が含まれる
シークレットボリュームを提供します。
この Pod 定義には、Pod が作成され、ライフサイクルが開始された後に OpenShift Container Platform によって自動的に設定される属性は含まれません。Kubernetes Pod ドキュメントには、Pod の機能および目的についてのさらに詳細な情報が記載されています。
3.3.1.1. Pod 再起動ポリシー
Pod 再起動ポリシーは、Pod のコンテナーの終了時に OpenShift Container Platform がどのように反応するかを決定します。このポリシーは Pod のすべてのコンテナーに適用されます。
以下の値を使用できます。
-
Always: Pod が再起動するまで、Pod で正常に終了したコンテナーの継続的な再起動を、指数関数的バックオフ遅延値 (10 秒、20 秒、40 秒) に基づいて試行します。デフォルトはAlwaysです。 -
OnFailure: Pod で失敗したコンテナーの継続的な再起動を、5 分を上限として指数関数的バックオフ遅延値 (10 秒、20 秒、40 秒) に基づいて試行します。 -
Never: Pod で終了したコンテナーまたは失敗したコンテナーの再起動を試行しません。Pod は即時に失敗し、終了します。
ノードにバインドされた Pod は別のノードにバインドされなくなります。これは、Pod をノードの失敗後も存続させるにはコントローラーが必要であることを示しています。
| 条件 | コントローラーのタイプ | 再起動ポリシー |
|---|---|---|
|
(バッチ計算などで) 終了することが予想される Pod |
| |
|
(Web サービスなど) 終了しないことが予想される Pod |
| |
|
マシンごとに実行される必要のある Pod |
Daemonset |
任意 |
Pod のコンテナーが失敗し、再起動ポリシーが OnFailure に設定されている場合、Pod はノード上に留まり、コンテナーは再起動します。コンテナーの再起動を望まない場合には、再起動ポリシーの Never を使用します。
Pod 全体が失敗すると、OpenShift Container Platform は新規 Pod を起動します。開発者はアプリケーションが新規 Pod で再起動される可能性に対応する必要があります。とくに、アプリケーションは一時的なファイル、ロック、以前の実行で生じた未完成の出力などを処理する必要があります。
OpenShift Container Platform が失敗したコンテナーに関連して再起動ポリシーを使用する方法についての詳細は、Kubernetes ドキュメントの「Example States」を参照してください。
3.3.1.2. Pod の Preset (プリセット) を使用した情報の Pod への挿入
Pod の Preset は、ユーザーが指定する情報を Pod の作成時に Pod に挿入するオブジェクトです。
Pod の Preset はテクノロジープレビュー機能です。テクノロジープレビュー機能は Red Hat の実稼働環境でのサービスレベルアグリーメント (SLA) ではサポートされていないため、Red Hat では実稼働環境での使用を推奨していません。これらの機能は、近々発表予定の製品機能をリリースに先駆けてご提供することにより、お客様は機能性をテストし、開発プロセス中にフィードバックをお寄せいただくことができます。
Red Hat のテクノロジープレビュー機能のサポートについての詳細は、https://access.redhat.com/support/offerings/techpreview/ を参照してください。
挿入できる Pod の Preset オブジェクトの使用
- シークレットオブジェクト
-
ConfigMapオブジェクト - ストレージボリューム
- コンテナーボリュームのマウント
- 環境変数
開発者は、すべての情報を Pod に追加するために Pod ラベルが PodPreset のラベルセレクターに一致することを確認する必要があります。Pod のラベルは Pod を、一致するラベルセレクターを持つ 1 つ以上の Pod の Preset オブジェクトに関連付けます。
Pod の Preset を使用する開発者は、Pod が消費するサービスの詳細を把握していなくても Pod のプロビジョニングを実行できます。管理者はサービスの設定項目を開発者に非表示にできます。これによって、開発者の Pod のデプロイが妨げられることはありません。
Pod の Preset 機能は、サービスカタログがインストールされている場合にのみ利用できます。
Pod 仕様の Podpreset.admission.kubernetes.io/exclude: "true" パラメーターを使用して、特定の Pod が挿入されないようにすることができます。Pod 仕様のサンプルを参照してください。
詳細は、「Pod の Preset (プリセット) を使用した情報の Pod への挿入」を参照してください。
3.3.2. Init コンテナー
init コンテナーは、Pod のアプリケーションコンテナーの起動前に起動している Pod のコンテナーです。Init コンテナーは、残りのコンテナーが起動する前にボリュームを共有し、ネットワーク操作を実行し、計算を実行しています。Init コンテナーは一部の前提条件が満たされるまでアプリケーションの起動をブロックしたり、遅延させたりすることもできます。
Pod が起動し、ネットワークおよびボリュームが初期化されると、init コンテナーが順番に起動します。各 init コンテナーは、次のコンテナーが起動する前に正常に終了している必要があります。init コンテナーが (ランタイムのために) 起動に失敗するか、または失敗して終了する場合、Pod の 再起動ポリシーに基づいてリタイアします。
Pod はすべての init コンテナーが正常に実行されるまで準備状態になりません。
一部の init コンテナーの使用例については、Kubernetes ドキュメントを参照してください。
以下の例は、2 つの init コンテナーを持つ単純な Pod の概要を示しています。最初の init コンテナーは myservice を待機し、2 つ目は mydb を待機します。両方のコンテナーが正常に実行されると、Pod が起動します。
例3.2 Init コンテナー Pod オブジェクト定義のサンプル (YAML)
apiVersion: v1
kind: Pod
metadata:
name: myapp-Pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice 1
image: busybox
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb 2
image: busybox
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
各 init コンテナーには、readinessProbe を除くすべてのアプリコンテナーのフィールドが含まれます。Pod の起動を継続するには、Init コンテナーは終了している必要があり、完了 (completion) 以外の readiness を定義することはできません。
Init コンテナーには Pod の activeDeadlineSeconds およびコンテナーの livenessProbe を含めることができ、init コンテナーの永久的な失敗を防ぐことができます。有効な期限には init コンテナーで使用される時間が含まれます。
3.3.3. サービス
Kubernetes サービスは内部ロードバランサーとして機能します。これは、受信する接続をプロキシー送信するために一連の複製された Pod を特定します。サポートする Pod は、サービスが一貫して利用可能な状態である場合に任意でサービスに追加したり削除したりでき、サービスに依存するすべてのものが一貫したアドレスでサービスを参照できます。デフォルトのサービス clusterIP アドレスは OpenShift Container Platform 内部ネットワークからのもので、Pod が相互にアクセスできるようにするために使用されます。
サービスへの外部アクセスを許可するには、クラスターの外部にある追加の externalIP および ingressIP アドレスをサービスに割り当てることができます。これらの externalIP アドレスを、サービスへの高可用性のあるアクセスを提供する仮想 IP アドレスにすることもできます。
サービスには、アクセス時に該当のサポートする Pod にプロキシー化される IP アドレスとポートのペアが割り当てられます。サービスはラベルセレクターを使用して、特定のポートで特定のネットワークサービスを提供する実行中のすべてのコンテナーを見つけます。
Pod と同様にサービスは REST オブジェクトです。以下の例は、上記の定義された Pod のサービス定義を示しています。
例3.3 サービスオブジェクト定義 (YAML)
apiVersion: v1 kind: Service metadata: name: docker-registry 1 spec: selector: 2 docker-registry: default clusterIP: 172.30.136.123 3 ports: - nodePort: 0 port: 5000 4 protocol: TCP targetPort: 5000 5
Kubernetes ドキュメントには、サービスについての詳細が記載されています。
3.3.3.1. サービス externalIP
クラスターの内部 IP アドレスに加えて、ユーザーはクラスターの外部にある IP アドレスを設定することができます。管理者は、トラフィックがこの IP を持つノードに到達することを確認する必要があります。
externalIP は、master-config.yaml ファイルに設定される ExternalIPNetworkCIDRs 範囲からクラスター管理者によって選択される必要があります。master-config.yaml が変更される場合、マスターサービスは再起動する必要があります。
例3.4 externalIPNetworkCIDR /etc/origin/master/master-config.yaml のサンプル
networkConfig: ExternalIPNetworkCIDR: 192.0.1.0.0/24
例3.5 サービス externalIP 定義 (JSON)
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "my-service"
},
"spec": {
"selector": {
"app": "MyApp"
},
"ports": [
{
"name": "http",
"protocol": "TCP",
"port": 80,
"targetPort": 9376
}
],
"externalIPs" : [
"192.0.1.1" 1
]
}
}- 1
- ポート が公開される外部 IP アドレスの一覧です。これは内部 IP アドレス一覧に追加される一覧です。
3.3.3.2. サービス ingressIP
クラウド以外のクラスターでは、externalIP アドレスをアドレスのプールから自動的に割り当てることができます。これにより、管理者がそれらを手動で割り当てる必要がなくなります。
このプールは /etc/origin/master/master-config.yaml ファイルに設定されます。このファイルを変更した後はマスターサービスを再起動します。
ingressIPNetworkCIDR はデフォルトで 172.29.0.0/16 に設定されます。クラスター環境でこのプライベート範囲を使用していない場合は、デフォルトの範囲を使用するか、またはカスタム範囲を使用します。
高可用性を設定している場合、この範囲は 256 アドレス未満にする必要があります。
例3.6 ingressIPNetworkCIDR /etc/origin/master/master-config.yaml のサンプル
networkConfig: ingressIPNetworkCIDR: 172.29.0.0/16
3.3.3.3. サービス NodePort
サービス type=NodePort を設定して、フラグで設定された範囲 (デフォルト: 30000-32767) からポートを割り当てます。各ノードはそのポート (すべてのノードでポート番号が同じ) をサービスにプロキシー送信します。
選択されたポートは、サービス設定の spec.ports[*].nodePort の下に報告されます。
カスタムポートを指定するには、単純にポート番号を nodePort フィールドに設定します。カスタムポート番号は nodePorts の設定された範囲内になければなりません。'master-config.yaml' が変更される場合、マスターサービスの再起動が必要になります。
例3.7 servicesNodePortRange /etc/origin/master/master-config.yaml のサンプル
kubernetesMasterConfig: servicesNodePortRange: ""
サービスは <NodeIP>:spec.ports[].nodePort および spec.clusterIp:spec.ports[].port として表示されます。
nodePort の設定は、特権付きの操作で実行されます。
3.3.3.4. サービスプロキシーモード
OpenShift Container Platform にはサービスルーティングインフラストラクチャーの 2 つの異なる実装があります。デフォルトの実装は完全に iptables をベースとしており、エンドポイント Pod 間の着信サービス接続を分散するために確率的な iptables 再作成ルールを使用します。古い方の実装はユーザー空間プロセスを使用して着信接続を受け入れた後に、クライアントとエンドポイント Pod 間のトラフィックをプロキシー送信します。
iptables ベースの実装はより効率的ですが、この場合すべてのエンドポイントで接続が常に受け入れ可能であることが条件になります。ユーザー空間の実装は速度が遅くなりますが、機能するエンドポイントが見つかるまで複数のエンドポイントを試行できます。適切な Readiness チェック (または通常信頼できるノードおよび Pod) がある場合は、iptables ベースのサービスプロキシーが最適なオプションになります。または、クラスターのインストール時またはデプロイ後に、ノード設定ファイルを編集してユーザー空間ベースのプロキシーを有効にできます。
3.3.3.5. ヘッドレスサービス
アプリケーションが負荷分散や単一サービス IP アドレスを必要しない場合にヘッドレスサービスを作成できます。ヘッドレスサービスを作成する場合、負荷分散やプロキシーは実行されず、クラスター IP はこのサービスに割り当てられません。このサービスの場合、サービスにセレクターが定義されているかどうかに応じて DNS が自動的に設定されます。
セレクターのあるサービス: セレクターを定義するヘッドレスサービスの場合、エンドポイントコントローラーは API に Endpoints レコードを作成し、DNS 設定を変更して、サービスをサポートする Pod を直接参照する A レコード (アドレス) を返します。
セレクターなしのサービス: セレクターを定義しないヘッドレスサービスの場合、エンドポイントコントローラーは Endpoints レコードを作成しません。ただし、DNS システムは以下のレコードを検索し、設定します。
-
ExternalNameタイプサービスの場合は、CNAMEレコード。 -
それ以外のすべてのサービスタイプの場合は、名前をサービスと共有するエンドポイントの
Aレコード。
3.3.3.5.1. ヘッドレスサービスの作成
ヘッドレスサービスの作成は標準的なサービスの作成と同様ですが、ClusterIP アドレスを宣言しません。ヘッドレスサービスを作成するには、clusterIP: None パラメーター値をサービス YAML 定義に追加します。
たとえば、以下は Pod のグループを同じクラスターまたはサービスの一部として組み込む場合です。
Pod の一覧
$ oc get Pods -o wide NAME READY STATUS RESTARTS AGE IP NODE frontend-1-287hw 1/1 Running 0 7m 172.17.0.3 node_1 frontend-1-68km5 1/1 Running 0 7m 172.17.0.6 node_1
ヘッドレスサービスは以下のように定義できます。
ヘッドレスサービス定義
apiVersion: v1
kind: Service
metadata:
labels:
app: ruby-helloworld-sample
template: application-template-stibuild
name: frontend-headless 1
spec:
clusterIP: None 2
ports:
- name: web
port: 5432
protocol: TCP
targetPort: 8080
selector:
name: frontend 3
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
ヘッドレスサービスには独自の IP アドレスがありません。
$ oc get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE frontend ClusterIP 172.30.232.77 <none> 5432/TCP 12m frontend-headless ClusterIP None <none> 5432/TCP 10m
3.3.3.5.2. ヘッドレスサービスを使用したエンドポイントの検出
ヘッドレスサービスを使用する利点として、Pod の IP アドレスを直接検出できることがあります。標準サービスはロードバランサーまたはプロキシーとして機能するか、またはサービス名を使用してワークロードオブジェクトへのアクセスを付与します。ヘッドレスサービスの場合、サービス名はサービスごとに分類される Pod の IP アドレスセットに解決します。
標準サービスの DNS A レコードを検索すると、サービスの負荷分散された IP を取得できます。
$ dig frontend.test A +search +short 172.30.232.77
ヘッドレスサービスの場合には、個別 Pod の IP の一覧を取得できます。
$ dig frontend-headless.test A +search +short 172.17.0.3 172.17.0.6
ヘッドレスサービスを StatefulSet と共に、また初期化および終了時に Pod の DNS を解決する必要のある関連のユースケースで使用する場合、publishNotReadyAddresses を true に設定します (デフォルト値は false)。publishNotReadyAddresses が true に設定されている場合、これは DNS 実装で、サービスに関連付けられたエンドポイントのサブセットの notReadyAddresses を公開する必要があることを示します。
3.3.4. ラベル
ラベルは、API オブジェクトを編成し、分類し、選択するために使用されます。たとえば、Pod にはラベルによる「タグ付け」が実行されてから、サービスがラベルセレクターを使用してそれらがプロキシーする Pod を識別します。これにより、サービスが Pod のグループを参照すること、また異なるコンテナーを含む可能性のある Pod を関連エンティティーとして処理することを可能にします。
ほとんどのオブジェクトでは、ラベルをそのメタデータに組み込むことができます。そのため、ラベルは任意に関連付けられたオブジェクトをグループに分類するために使用できます。たとえば、特定アプリケーションのすべての Pod、サービス、レプリケーションコントローラー、およびデプロイメント設定をグループ化することができます。
ラベルは、以下の例のような単純なキー/値のペアになります。
labels: key1: value1 key2: value2
以下の例を見てみましょう。
- nginx コンテナーで構成される Pod に role=webserver ラベルがある。
- Apache httpd コンテナーで構成される Pod に同じラベル role=webserver がある。
この場合、role=webserver ラベルを持つ Pod を使用するように定義されたサービスまたはレプリケーションコントローラーは上記 Pod の両方を同じグループとして処理します。
Kubernetes ドキュメントには、ラベルについてのさらに詳細な情報が記載されています。
3.3.5. エンドポイント
サービスをサポートするサーバーはエンドポイントと呼ばれ、サービスと同じ名前を持つタイプ Endpoints のオブジェクトで指定されます。サービスが Pod でサポートされる場合、それらの Pod は通常はサービス仕様のラベルセレクターで指定され、OpenShift Container Platform は、それらの Pod を参照するエンドポイントオブジェクトを自動的に作成します。
サービスを作成する場合でも、OpenShift Container Platform クラスターの Pod ではなく、外部ホストでサポートされるようにする必要がある場合があります。この場合、サービスの selector フィールドを省略し、エンドポイントオブジェクトを手動で作成できます。
OpenShift Container Platform は、大半のユーザーが Pod およびサービス用に予約されたネットワークブロックの IP アドレスを参照するエンドポイントオブジェクトの手動による作成を許可しないことに注意してください。endpoints/restrictedのリソースの createパーミッション を持つクラスター管理者その他ユーザーのみがこれらのエンドポイントオブジェクトを作成できます。
3.4. プロジェクトおよびユーザー
3.4.1. ユーザー
OpenShift Container Platform との対話はユーザーに関連付けられます。OpenShift Container Platform ユーザーオブジェクトはシステム内のパーミッションを付与されるアクターを表します。パーミッションは ロールをそれらまたはそれらのグループに追加して付与されます。
ユーザーにはいくつかのタイプが存在します。
|
一般ユーザー |
ほとんどの対話型の OpenShift Container Platform ユーザーは一般ユーザーとして表示されます。一般ユーザーは、初回ログイン時にシステムに自動的に作成されるか、または API で作成できます。一般ユーザーは |
|
システムユーザー |
これらのユーザーの多くは、API との安全な対話を主な目的として、インフラストラクチャーが定義される際に自動的に作成されます。これらには、クラスター管理者 (すべてのアクセスを持つ)、ノードごとのユーザー、ルーターおよびレジストリーで使用できるユーザーなどが含まれます。また、非認証要求に対してデフォルトで使用される |
|
サービスアカウント |
これらはプロジェクトに関連付けられる特殊なシステムユーザーです。これらの中にはプロジェクトの初回作成時に自動作成されるものがありますが、プロジェクト管理者は各プロジェクトのコンテンツへのアクセスを定義する目的で追加のサービスアカウントを作成できます。サービスアカウントは |
すべてのユーザーには、OpenShift Container Platform にアクセスするために何らかの認証が必要になります。認証がないか、または認証が無効の API 要求は、anonymous (匿名) システムユーザーによる要求として認証されます。認証が実行されると、ユーザーの実行が許可される内容がポリシーによって決定されます。
3.4.2. Namespace
Kubernetes の namespace は、クラスター内でリソースのスコープを設定するメカニズムを提供します。OpenShift Container Platform において、プロジェクトは追加のアノテーションを含む Kubernetes の namespace を指します。
Namespace は以下の一意のスコープを提供します。
- 基本的な名前の衝突を避けるための名前付きリソース。
- 信頼できるユーザーに委任された管理権限。
- コミュニティーのリソース消費を制限する機能。
システムのほとんどのオブジェクトのスコープは namespace 別に設定されますが、一部にはノードやユーザーを含め、予想されるもので namaspace がないものがあります。
Kubernetes ドキュメントには namespace についてのさらに詳細な情報が記載されています。
3.4.3. プロジェクト
プロジェクトは追加のアノテーションを含む Kubernetes の namespace であり、一般ユーザーのリソースへのアクセスを管理する中心的な手段です。プロジェクトはユーザーのコミュニティーが他のコミュニティーと切り離してコンテンツを編成し、管理することを可能にします。ユーザーには、管理者によってプロジェクトへのアクセスが付与される必要があり、ユーザーがプロジェクトの作成を許可されている場合には、ユーザー独自のプロジェクトへのアクセスが自動的に付与されます。
プロジェクトには、別個のname、displayName、およびdescriptionを含めることができます。
-
必須の
nameはプロジェクトの一意の ID であり、CLI ツールまたは API を使用する場合に最も明確に表示されます。名前の最大長は 63 文字です。 -
オプションの
displayNameはプロジェクトが Web コンソールで表示される方法を示します (デフォルトはnameに設定されます)。 -
オプションの
descriptionにはプロジェクトのさらに詳細な記述を使用でき、これも Web コンソールで表示できます。
各プロジェクトは、以下の独自のセットのスコープを設定します。
|
オブジェクト |
Pod、サービス、レプリケーションコントローラーなど。 |
|
ポリシー |
ユーザーがオブジェクトに対してアクションを実行できるか/できないかについてのルール。 |
|
制約 |
制限を設定できる各種オブジェクトのクォータ。 |
|
サービスアカウント |
サービスアカウントは、プロジェクトのオブジェクトへの指定されたアクセスで自動的に機能します。 |
クラスター管理者はプロジェクトの作成を実行でき、プロジェクトの管理者権限の委任をユーザーコミュニティーの任意のメンバーに対して実行できます。また、クラスター管理者は開発者が独自のプロジェクトを作成することも許可します。
開発者および管理者は、CLI または Web コンソールを使用してプロジェクトとの対話を実行できます。
3.4.3.1. インストール時に提供されるプロジェクト
OpenShift Container Platform には追加設定なしで使用できる数多くのプロジェクトが含まれますが、openshift はユーザーにとって最も重要なプロジェクトになります。
openshift: ユーザーに表示されるプロジェクトで、主に日常的なタスクのオブジェクトを格納するために使用されます。 これらには、テンプレートやイメージなどの複数プロジェクトでアクセスされるアプリケーションオブジェクトが含まれます。これらのオブジェクトは、Pod 間の通信が不要なものである必要があります。
3.5. ビルドおよびイメージストリーム
3.5.1. ビルド
ビルド は、入力パラメーターを、作成されるオブジェクトに変換するプロセスです。ほとんどの場合、このプロセスは入力パラメーターまたはソースコードを実行可能なイメージに変換するために使用されます。BuildConfig オブジェクトはビルドプロセス全体の定義です。
OpenShift Container Platform は、Docker 形式のコンテナーをビルドイメージから作成し、それらをコンテナーレジストリーにプッシュして Kubernetes を利用します。
ビルドオブジェクトは共通する特性を共有します。これらには、ビルドの入力、ビルドプロセスを完了する必要性、ビルドプロセスのロギング、正常なビルドからのリソースの公開、およびビルドの最終ステータスの公開などが含まれます。ビルドはリソース制限を利用し、CPU 使用、メモリー使用およびビルドまたは Pod の実行時間などのリソースの制限を指定します。
OpenShift Container Platform ビルドシステムは、ビルド API で指定される選択可能なタイプに基づく、ビルドストラテジー の拡張可能なサポートを提供します。以下は利用可能な 3 つの主なビルドストラテジーです。
デフォルトでは、Docker ビルドおよび S2I ビルドがサポートされます。
ビルドの作成されるオブジェクトは、この作成に使用されるビルダーによって異なります。Docker および S2I ビルドの場合、作成されるオブジェクトは実行可能なイメージです。カスタムビルドの場合、作成されるオブジェクトはビルダーイメージの作成者が指定するものになります。
さらに Pipeline ビルドストラテジーを使用して、高度なワークフローを実装することができます。
- 継続的インテグレーション
- 継続的デプロイ
ビルドコマンドの一覧については、『開発者ガイド』を参照してください。
OpenShift Container Platform の Docker を使用したビルドについての詳細は、アップストリームドキュメントを参照してください。
3.5.1.1. Docker ビルド
Docker ビルドストラテジーは docker build コマンドを起動するため、Dockerfile とそれに含まれるすべての必要なアーティファクトのあるリポジトリーが実行可能なイメージを生成することを予想します。
3.5.1.2. Source-to-Image (S2I) ビルド
Source-to-Image (S2I) は再現可能な Docker 形式のコンテナーイメージをビルドするためのツールです。これはアプリケーションソースをコンテナーイメージに挿入し、新規イメージをアセンブルして実行可能なイメージを生成します。新規イメージはベースイメージ (ビルダー) とビルドされたソースを組み込み、docker run コマンドで使用することができます。S2I は増分ビルドをサポートします。これは以前にダウンロードされた依存関係、以前にビルドされたアーティファクトなどを再利用します。
S2I の利点には以下が含まれます。
|
イメージの柔軟性 |
S2I スクリプトを作成して、アプリケーションコードをほとんどすべての既存の Docker 形式コンテナーに挿入し、既存のエコシステムを活用することができます。現時点で S2I は |
|
スピード |
S2I の場合、アセンブルプロセスでは、各手順で新規の層を作成せずに多数の複雑な操作を実行できるため、プロセスのスピードが速くなります。さらに、S2I スクリプトを作成してアプリケーションイメージの以前のバージョンに保存されたアーティファクトを再利用できるため、ビルドの実行時に毎回ダウンロードまたはビルドを実行する必要がありません。 |
|
パッチ適用容易性 (Patchability) |
S2I では、基礎となるイメージがセキュリティー上の問題でパッチを必要とする場合にアプリケーションを一貫した方法で再ビルドできます。 |
|
運用効率 |
Dockerfile が許可するアクションを実行する代わりにビルド操作を制限することで、PaaS オペレーターはビルドシステムの意図しない、または意図的な誤用を避けることができます。 |
|
運用上のセキュリティー |
任意の Dockerfile をビルドすると、root 権限の昇格のためにホストシステムを公開します。これは Docker ビルドプロセス全体が Docker 権限を持つユーザーとして実行されるため、悪意あるユーザーによって悪用される可能性があります。S2I は root ユーザーとして実行される操作を制限し、スクリプトを root 以外のユーザーとして実行できます。 |
|
ユーザー効率 |
S2I は開発者が、アプリケーションのビルド時の開発の反復スピードを低下させる可能性がある |
|
エコシステム |
S2I は、アプリケーションのベストプラクティスを利用できるイメージの共有されたエコシステムを促進します。 |
|
再現性 |
生成されるイメージには、特定バージョンのビルドツールおよび依存関係などのすべての入力が含めることができます。これにより、イメージを正確に再現することができます。 |
3.5.1.3. カスタムビルド
カスタムビルドストラテジーにより、開発者はビルドプロセス全体を対象とする特定のビルダーイメージを定義できます。独自のビルダーイメージを使用してビルドプロセスをカスタマイズできます。
カスタムビルダーイメージは、RPM またはベースイメージのビルドなどの、ビルドプロセスのロジックで組み込まれた単純な Docker 形式のコンテナーイメージです。openshift/origin-custom-docker-builder イメージは、カスタムビルダーイメージの実装例として Docker Hub レジストリーで利用できます。
3.5.1.4. Pipeline ビルド
Pipeline ストラテジーは、開発者が Jenkins パイプラインプラグインで実行される Jenkins パイプライン を定義することを可能にします。ビルドは他のビルドタイプの場合と同様に OpenShift Container Platform で起動し、モニターし、管理できます。
Pipeline ワークフローは Jenkinsfile で定義され、ビルド設定に直接組み込まれるか、または Git リポジトリーで指定され、ビルド設定で参照されます。
プロジェクトの Pipeline ストラテジーを使用した初回のビルド設定の定義時に、OpenShift Container Platform は Jenkins サーバーをインスタンス化して Pipeline を実行します。プロジェクトの後続の Pipeline ビルド設定はこの Jenkins サーバーを共有します。
Jenkins サーバーのデプロイ方法や自動プロビジョニングの設定または無効化の方法についての詳細は、「Pipeline 実行の設定」を参照してください。
Jenkins サーバーは、すべての Pipeline ビルド設定が削除される場合でも自動的に削除されません。これはユーザーによって手動で削除される必要があります。
Jenkins パイプラインについての詳細は、Jenkins ドキュメントを参照してください。
3.5.2. イメージストリーム
イメージストリームおよびその関連付けられたタグは、OpenShift Container Platform 内で Docker イメージを参照するための抽象化を提供します。イメージストリームとそのタグを使用して、利用可能なイメージを確認し、リポジトリーのイメージが変更される場合でも必要な特定のイメージを使用していることを確認できます。
イメージストリームには実際のイメージデータは含まれませんが、イメージリポジトリーと同様に、関連するイメージの単一の仮想ビューが表示されます。
ビルドおよびデプロイメントをそれぞれ実行し、ビルドおよびデプロイメントを、新規イメージが追加される際やこれに対応する際の通知をイメージストリームで確認できるように設定できます。
たとえば、デプロイメントが特定のイメージを使用していて、そのイメージの新規バージョンが作成される場合、イメージの新規バージョンを選択するようにデプロイメントが自動的に実行されます。
ただし、デプロイメントまたはビルドで使用されるイメージストリームタグが更新されない場合、Docker レジストリーの Docker イメージが更新されている場合でもビルドまたはデプロイメントは以前の (既知の適切であると予想される) イメージの使用を継続します。
ソースイメージは以下のいずれかに保存できます。
- OpenShift Container Platform の統合レジストリー
-
registry.access.redhat.comまたはhub.docker.comなどの外部レジストリー - OpenShift Container Platform クラスターの他のイメージストリーム
(ビルド設定またはデプロイメント設定などの) イメージストリームタグを参照するオブジェクトを定義する際は、Docker リポジトリーではなくイメージストリームタグを参照します。アプリケーションのビルドまたはデプロイの実行時に、OpenShift Container Platform はイメージストリームタグを使用して Docker リポジトリーをクエリーし、イメージの関連付けられた ID を検索し、そのイメージを使用します。
イメージストリームメタデータは他のクラスター情報と共に etcd インスタンスに保存されます。
以下のイメージストリームには、Python v3.4 イメージを参照する 34 と、Python v3.5 イメージを参照する 35 の 2 つのタグが含まれます。
oc describe is python
Name: python
Namespace: imagestream
Created: 25 hours ago
Labels: app=python
Annotations: openshift.io/generated-by=OpenShiftWebConsole
openshift.io/image.dockerRepositoryCheck=2017-10-03T19:48:00Z
Docker Pull Spec: docker-registry.default.svc:5000/imagestream/python
Image Lookup: local=false
Unique Images: 2
Tags: 2
34
tagged from centos/python-34-centos7
* centos/python-34-centos7@sha256:28178e2352d31f240de1af1370be855db33ae9782de737bb005247d8791a54d0
14 seconds ago
35
tagged from centos/python-35-centos7
* centos/python-35-centos7@sha256:2efb79ca3ac9c9145a63675fb0c09220ab3b8d4005d35e0644417ee552548b10
7 seconds agoイメージストリームの使用には、いくつかの大きな利点があります。
- コマンドラインを使用して再プッシュすることなく、タグ付けや、タグのロールバック、およびイメージの迅速な処理を実行できます。
- 新規イメージがレジストリーにプッシュされると、ビルドおびデプロイメントをトリガーできます。また、OpenShift Container Platform には他のリソースの汎用トリガーがあります (Kubernetes オブジェクトなど)。
- 定期的な再インポート用のタグにマークを付けることもできます。ソースイメージが変更されると、その変更は選択され、イメージストリームに反映されます。これにより、ビルドまたはデプロイメント設定に応じてビルドおよび/またはデプロイメントフローがトリガーされます。
- 詳細なアクセス制御を使用してイメージを共有し、イメージをチーム間で迅速に分配できます。
- ソースイメージが変更されても、イメージストリームタグはイメージの既知の適切なバージョンを参照したままになり、アプリケーションが予期せずに中断しないようにします。
- イメージストリームオブジェクトのパーミッションを使用して、イメージを閲覧し、使用できるユーザーについてセキュリティー設定を行うことができます。
- クラスターレベルでイメージを読み込んだり、一覧表示するパーミッションのないユーザーは、イメージストリームを使用してプロジェクトでタグ付けされたイメージを取得できます。
選別されたイメージストリームのセットについては、OpenShift Image Streams and Templates library を参照してください。
イメージストリームの使用時に、イメージストリームタグの参照先およびタグおよびイメージへの変更による影響について把握しておくことは重要です。以下は例になります。
-
イメージストリームタグが Docker イメージタグを参照する場合、Docker イメージタグの更新方法を理解しておく必要があります。たとえば、Docker イメージタグ
docker.io/ruby:2.4はおそらく v2.4 ruby イメージを常に参照します。一方、Docker イメージタグdocker.io/ruby:latestはおそらくメジャーバージョンで変更されます。そのため、イメージストリームタグが参照する Docker イメージタグは、イメージストリームタグの安定度を示すものとなります (Docker イメージタグを参照するように設定している場合)。 - イメージストリームタグが別のイメージストリームタグをフォローする場合 (Docker イメージタグを直接参照しない場合)、イメージストリームタグが別のイメージストリームタグをフォローするように更新される可能性があります。この場合、互換性のないバージョンの変更が選択されてしまう可能性があります。
3.5.2.1. 重要な用語
- Docker リポジトリー
関連する Docker イメージおよびそれらを識別するタグのコレクションです。たとえば、OpenShift Jenkins イメージは Docker リポジトリーにあります。
docker.io/openshift/jenkins-2-centos7
- Docker レジストリー
Docker リポジトリーからイメージを保存し、提供できるコンテンツサーバーです。以下は例になります。
registry.access.redhat.com
- Docker イメージ
- コンテナーとして実行できる特定のコンテナーセットです。通常は Docker リポジトリー内の特定のタグに関連付けられます。
- Docker イメージタグ
- 特定のイメージを区別する、リポジトリー内の Docker イメージに適用されるラベルです。たとえば、ここでは 3.6.0 がタグとして使用されています。
docker.io/openshift/jenkins-2-centos7:3.6.0
新規の Docker イメージコンテンツを参照するようにいつでも更新できる Docker イメージタグです。
- Docker イメージ ID
- イメージをプルするために使用できる SHA (セキュアハッシュアルゴリズム) コードです。以下は例になります。
docker.io/openshift/jenkins-2-centos7@sha256:ab312bda324
SHA イメージ ID は変更できません。特定の SHA ID は同一の Docker イメージコンテンツを常に参照します。
- イメージストリーム
- タグで識別される任意の数の Docker 形式のコンテナーイメージへのポインターが含まれる OpenShift Container Platform オブジェクトです。イメージストリームは Docker リポジトリーと同等のものとみなすことができます。
- イメージストリームタグ
- イメージストリーム内のイメージへの名前付きポインターです。イメージストリームタグは Docker イメージタグに似ています。以下の「イメージストリームタグ」を参照してください。
- イメージストリームイメージ
- イメージがタグ付けされている特定のイメージストリームから特定の Docker イメージを取得できるようにするイメージです。イメージストリームイメージは、特定のイメージの SHA ID についてのメタデータをプルする API リソースオブジェクトです。以下の「イメージストリームイメージ」を参照してください。
- イメージストリームトリガー
- イメージストリームタグの変更時に特定のアクションを生じさせるトリガーです。たとえば、インポートによりタグの値が変更される可能性があり、これによってデプロイメント、ビルド、またはそれらについてリッスンする他のリソースがある場合はトリガーが発生します。以下の「イメージストリームトリガー」を参照してください。
3.5.2.2. イメージストリームの設定
イメージストリームのオブジェクトファイルには以下の要素が含まれます。
イメージおよびイメージストリームの管理についての詳細は、『開発者ガイド』を参照してください。
イメージストリームオブジェクト定義
apiVersion: v1
kind: ImageStream
metadata:
annotations:
openshift.io/generated-by: OpenShiftNewApp
creationTimestamp: 2017-09-29T13:33:49Z
generation: 1
labels:
app: ruby-sample-build
template: application-template-stibuild
name: origin-ruby-sample 1
namespace: test
resourceVersion: "633"
selflink: /oapi/v1/namespaces/test/imagestreams/origin-ruby-sample
uid: ee2b9405-c68c-11e5-8a99-525400f25e34
spec: {}
status:
dockerImageRepository: 172.30.56.218:5000/test/origin-ruby-sample 2
tags:
- items:
- created: 2017-09-02T10:15:09Z
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d 3
generation: 2
image: sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5 4
- created: 2017-09-29T13:40:11Z
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
generation: 1
image: sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
tag: latest 5
イメージストリームを参照するビルド設定のサンプルについては、設定の Strategy スタンザで「BuildConfig の概要」を参照してください。
イメージストリームを参照するデプロイメント設定のサンプルについては、設定の Strategy スタンザで「デプロイメント設定の作成」の部分を参照してください。
3.5.2.3. イメージストリームイメージ
イメージストリームイメージ は、イメージストリームから特定のイメージ ID を参照します。
イメージストリームイメージにより、イメージがタグ付けされている特定のイメージストリームからイメージについてのメタデータを取得できます。
イメージストリームイメージのオブジェクトは、イメージをインポートしたり、イメージストリームにタグ付けしたりする場合に OpenShift Container Platform に常に自動的に作成されます。イメージストリームイメージのオブジェクトは、イメージストリームを作成するために使用するイメージストリーム定義で明示的に定義する必要はありません。
イメージストリームイメージはリポジトリーからのイメージストリーム名およびイメージ ID で構成されており、@ 記号で区切られています。
<image-stream-name>@<image-id>
上記のイメージストリームオブジェクトサンプルのイメージを参照する際に、イメージストリームイメージは以下のようになります。
origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
3.5.2.4. イメージストリームタグ
イメージストリームタグ は、イメージストリーム のイメージに対する名前付きポインターです。これは istag として省略されることが多くあります。イメージストリームタグは、指定のイメージストリームおよびタグについてイメージを参照するか、または取得するために使用されます。
イメージストリームタグは、ローカルイメージまたは外部で管理されるイメージを参照できます。これには、タグで参照したすべてのイメージのスタックとして参照されるイメージの履歴が含まれます。新規または既存のイメージが特定のイメージストリームタグでタグ付けされる場合は常に、それは履歴スタックの最初の位置に置かれます。これまで先頭の位置を占めていたイメージは 2 番目の位置などに置かれます。これにより、タグが過去のイメージを再び参照できるよう簡単にロールバックできます。
以下のイメージストリームタグは、上記のイメージストリームオブジェクトのサンプルから取られています。
2 つのイメージが履歴に含まれるイメージストリームタグ
tags:
- items:
- created: 2017-09-02T10:15:09Z
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
generation: 2
image: sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
- created: 2017-09-29T13:40:11Z
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:909de62d1f609a717ec433cc25ca5cf00941545c83a01fb31527771e1fab3fc5
generation: 1
image: sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
tag: latest
イメージストリームタグは 永続 タグまたは トラッキング タグにすることができます。
- 永続タグ は、Python 3.5 などの特定バージョンのイメージを参照するバージョン固有のタグです。
トラッキングタグ は別のイメージストリームタグをフォローする参照タグで、シンボリックリンクなどのようにフォローするイメージを変更するために更新される可能性があります。これらの新たなレベルは後方互換性を持つことが保証されないことに注意してください。
たとえば、OpenShift Container Platform に同梱される
latestイメージストリームタグはトラッキングタグです。これは、latestイメージストリームタグのコンシューマーが、新規レべルが利用可能になるとイメージで提供されるフレームワークの最新レベルに更新されることを意味します。v3.6へのlatestイメージストリームタグはv3.7に変更される可能性が常にあります。これらのlatestイメージストリームタグは Docker のlatestタグとは異なる動作をすることに注意してください。この場合、latestイメージストリームタグは Docker リポジトリーの最新イメージを参照せず、イメージの最新バージョンでない可能性のある別のイメージストリームタグを参照します。たとえば、latestイメージストリームタグがイメージのv3.2を参照する場合、3.3バージョンがリリースされてもlatestタグはv3.3に自動的に更新されず、これがv3.3イメージストリームタグをポイントするように手動で更新されるまでv3.2を参照したままになります。注記トラッキングタグは単一のイメージストリームに制限され、他のイメージストリームを参照することはできません。
各自のニーズに合わせて独自のイメージストリームタグを作成できます。「推奨されるタグ付け規則」を参照してください。
イメージストリームタグは、コロンで区切られた、イメージストリームの名前とタグで構成されています。
<image stream name>:<tag>
たとえば、上記のイメージストリームオブジェクトのサンプルで sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d イメージを参照するためのイメージストリームタグは以下のようになります。
origin-ruby-sample:latest
3.5.2.5. イメージストリーム変更トリガー
イメージストリームトリガーにより、ビルドおよびデプロイメントは、アップストリームイメージの新規バージョンが利用可能になると自動的に起動します。
たとえば、ビルドおよびデプロイメントはイメージストリームタグの変更時に自動的に起動します。これは、特定のイメージストリームタグをモニターし、変更の検出時にビルドまたはデプロイメントに通知することで実行されます。
ImageChange トリガーにより、イメージストリームタグの内容の変更時 (新規バージョンのイメージのプッシュ時) に新規レプリケーションコントローラーが常に生成されます。
例3.8 ImageChange トリガー
triggers:
- type: "ImageChange"
imageChangeParams:
automatic: true 1
from:
kind: "ImageStreamTag"
name: "origin-ruby-sample:latest"
namespace: "myproject"
containerNames:
- "helloworld"- 1
imageChangeParams.automaticフィールドがfalseに設定されると、トリガーが無効になります。
上記の例では、origin-ruby-sample イメージストリームの latest タグの値が変更され、新規イメージの値がデプロイメント設定の helloworld コンテナーに指定される現在のイメージと異なる場合に、helloworld コンテナーの新規イメージを使用して新規のレプリケーションコントローラーが作成されます。
ImageChange トリガーがデプロイメント設定 (ConfigChange トリガーと automatic=false が設定されているか、または automatic=true が設定されている) で定義されていて、ImageChange トリガーで参照されている ImageStreamTag がまだ存在していない場合、初回のデプロイメントプロセスは、ビルドによってイメージがインポートされるか、ImageStreamTag にプッシュされるとすぐに自動的に開始されます。
3.5.2.6. イメージストリームのマッピング
統合レジストリーが新規イメージを受信すると、これは OpenShift Container Platform にマップするイメージストリームを作成し、これを送信してイメージのプロジェクト、名前、タグおよびイメージメタデータを提供します。
イメージストリームのマッピングの設定は拡張機能です。
この情報は、新規イメージを作成する際 (すでに存在しない場合) やイメージをイメージストリームにタグ付けする際に使用されます。OpenShift Container Platform は、コマンド、エントリーポイント、および環境変数などの各イメージについての完全なメタデータを保存します。OpenShift Container Platform のイメージは不変であり、名前の最大長は 63 文字です。
イメージの手動のタグ付けの詳細については、『開発者ガイド』を参照してください。
以下のイメージストリームマッピングのサンプルにより、test/origin-ruby-sample:latest のようなイメージのタグ付けが行われます。
イメージストリームマッピングオブジェクト定義
apiVersion: v1
kind: ImageStreamMapping
metadata:
creationTimestamp: null
name: origin-ruby-sample
namespace: test
tag: latest
image:
dockerImageLayers:
- name: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
size: 0
- name: sha256:ee1dd2cb6df21971f4af6de0f1d7782b81fb63156801cfde2bb47b4247c23c29
size: 196634330
- name: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
size: 0
- name: sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef
size: 0
- name: sha256:ca062656bff07f18bff46be00f40cfbb069687ec124ac0aa038fd676cfaea092
size: 177723024
- name: sha256:63d529c59c92843c395befd065de516ee9ed4995549f8218eac6ff088bfa6b6e
size: 55679776
- name: sha256:92114219a04977b5563d7dff71ec4caa3a37a15b266ce42ee8f43dba9798c966
size: 11939149
dockerImageMetadata:
Architecture: amd64
Config:
Cmd:
- /usr/libexec/s2i/run
Entrypoint:
- container-entrypoint
Env:
- RACK_ENV=production
- OPENSHIFT_BUILD_NAMESPACE=test
- OPENSHIFT_BUILD_SOURCE=https://github.com/openshift/ruby-hello-world.git
- EXAMPLE=sample-app
- OPENSHIFT_BUILD_NAME=ruby-sample-build-1
- PATH=/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- STI_SCRIPTS_URL=image:///usr/libexec/s2i
- STI_SCRIPTS_PATH=/usr/libexec/s2i
- HOME=/opt/app-root/src
- BASH_ENV=/opt/app-root/etc/scl_enable
- ENV=/opt/app-root/etc/scl_enable
- PROMPT_COMMAND=. /opt/app-root/etc/scl_enable
- RUBY_VERSION=2.2
ExposedPorts:
8080/tcp: {}
Labels:
build-date: 2015-12-23
io.k8s.description: Platform for building and running Ruby 2.2 applications
io.k8s.display-name: 172.30.56.218:5000/test/origin-ruby-sample:latest
io.openshift.build.commit.author: Ben Parees <bparees@users.noreply.github.com>
io.openshift.build.commit.date: Wed Jan 20 10:14:27 2016 -0500
io.openshift.build.commit.id: 00cadc392d39d5ef9117cbc8a31db0889eedd442
io.openshift.build.commit.message: 'Merge pull request #51 from php-coder/fix_url_and_sti'
io.openshift.build.commit.ref: master
io.openshift.build.image: centos/ruby-22-centos7@sha256:3a335d7d8a452970c5b4054ad7118ff134b3a6b50a2bb6d0c07c746e8986b28e
io.openshift.build.source-location: https://github.com/openshift/ruby-hello-world.git
io.openshift.builder-base-version: 8d95148
io.openshift.builder-version: 8847438ba06307f86ac877465eadc835201241df
io.openshift.s2i.scripts-url: image:///usr/libexec/s2i
io.openshift.tags: builder,ruby,ruby22
io.s2i.scripts-url: image:///usr/libexec/s2i
license: GPLv2
name: CentOS Base Image
vendor: CentOS
User: "1001"
WorkingDir: /opt/app-root/src
Container: 86e9a4a3c760271671ab913616c51c9f3cea846ca524bf07c04a6f6c9e103a76
ContainerConfig:
AttachStdout: true
Cmd:
- /bin/sh
- -c
- tar -C /tmp -xf - && /usr/libexec/s2i/assemble
Entrypoint:
- container-entrypoint
Env:
- RACK_ENV=production
- OPENSHIFT_BUILD_NAME=ruby-sample-build-1
- OPENSHIFT_BUILD_NAMESPACE=test
- OPENSHIFT_BUILD_SOURCE=https://github.com/openshift/ruby-hello-world.git
- EXAMPLE=sample-app
- PATH=/opt/app-root/src/bin:/opt/app-root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
- STI_SCRIPTS_URL=image:///usr/libexec/s2i
- STI_SCRIPTS_PATH=/usr/libexec/s2i
- HOME=/opt/app-root/src
- BASH_ENV=/opt/app-root/etc/scl_enable
- ENV=/opt/app-root/etc/scl_enable
- PROMPT_COMMAND=. /opt/app-root/etc/scl_enable
- RUBY_VERSION=2.2
ExposedPorts:
8080/tcp: {}
Hostname: ruby-sample-build-1-build
Image: centos/ruby-22-centos7@sha256:3a335d7d8a452970c5b4054ad7118ff134b3a6b50a2bb6d0c07c746e8986b28e
OpenStdin: true
StdinOnce: true
User: "1001"
WorkingDir: /opt/app-root/src
Created: 2016-01-29T13:40:00Z
DockerVersion: 1.8.2.fc21
Id: 9d7fd5e2d15495802028c569d544329f4286dcd1c9c085ff5699218dbaa69b43
Parent: 57b08d979c86f4500dc8cad639c9518744c8dd39447c055a3517dc9c18d6fccd
Size: 441976279
apiVersion: "1.0"
kind: DockerImage
dockerImageMetadataVersion: "1.0"
dockerImageReference: 172.30.56.218:5000/test/origin-ruby-sample@sha256:47463d94eb5c049b2d23b03a9530bf944f8f967a0fe79147dd6b9135bf7dd13d
3.5.2.7. イメージストリームの使用
以下のセクションでは、イメージストリームおよびイメージストリームタグを使用する方法について説明します。イメージストリームの使用方法についての詳細は、「イメージの管理」を参照してください。
3.5.2.7.1. イメージストリームについての情報の取得
イメージストリームについての一般的な情報およびこれが参照するすべてのタグについての詳細情報を取得するには、以下のコマンドを使用します。
oc describe is/<image-name>
以下は例になります。
oc describe is/python
Name: python
Namespace: default
Created: About a minute ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2017-10-02T17:05:11Z
Docker Pull Spec: docker-registry.default.svc:5000/default/python
Image Lookup: local=false
Unique Images: 1
Tags: 1
3.5
tagged from centos/python-35-centos7
* centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
About a minute ago特定のイメージストリームタグについて利用可能なすべての情報を取得するには、以下を実行します。
oc describe istag/<image-stream>:<tag-name>
以下は例になります。
oc describe istag/python:latest Image Name: sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 Docker Image: centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 Name: sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25 Created: 2 minutes ago Image Size: 251.2 MB (first layer 2.898 MB, last binary layer 72.26 MB) Image Created: 2 weeks ago Author: <none> Arch: amd64 Entrypoint: container-entrypoint Command: /bin/sh -c $STI_SCRIPTS_PATH/usage Working Dir: /opt/app-root/src User: 1001 Exposes Ports: 8080/tcp Docker Labels: build-date=20170801
上記の表示されている以上の情報が出力されます。
3.5.2.7.2. 追加タグのイメージストリームへの追加
既存タグのいずれかを参照するタグを追加するには、oc tag コマンドを使用できます。
oc tag <image-name:tag> <image-name:tag>
以下は例になります。
oc tag python:3.5 python:latest Tag python:latest set to python@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25.
oc describe コマンドを使用して、イメージストリームに、外部 Docker イメージを参照するタグ (3.5) と、この最初のタグに基づいて作成されているために同じイメージを参照する別のタグ (latest) の 2 つのタグが含まれることを確認します。
oc describe is/python
Name: python
Namespace: default
Created: 5 minutes ago
Labels: <none>
Annotations: openshift.io/image.dockerRepositoryCheck=2017-10-02T17:05:11Z
Docker Pull Spec: docker-registry.default.svc:5000/default/python
Image Lookup: local=false
Unique Images: 1
Tags: 2
latest
tagged from python@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
* centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
About a minute ago
3.5
tagged from centos/python-35-centos7
* centos/python-35-centos7@sha256:49c18358df82f4577386404991c51a9559f243e0b1bdc366df25
5 minutes ago3.5.2.7.3. 外部イメージのタグの追加
内部または外部イメージを参照する追加タグなど、タグ関連のすべての操作に oc tag コマンドを使用します。
oc tag <repositiory/image> <image-name:tag>
たとえば、このコマンドは docker.io/python:3.6.0 イメージを python イメージストリームの 3.6 タグにマップします。
oc tag docker.io/python:3.6.0 python:3.6 Tag python:3.6 set to docker.io/python:3.6.0.
外部イメージのセキュリティーが保護されている場合、そのレジストリーにアクセスするために認証情報を使ってシークレットを作成する必要があります。詳細については、「プライベートレジストリーからのイメージのインポート」を参照してください。
3.5.2.7.4. イメージストリームタグの更新
別のタグをイメージストリームに反映するようにタグを更新するには、以下を実行します。
oc tag <image-name:tag> <image-name:latest>
たとえば、以下では 3.6 タグをイメージタグに反映させるために latest タグを更新します。
oc tag python:3.6 python:latest Tag python:latest set to python@sha256:438208801c4806548460b27bd1fbcb7bb188273d13871ab43f.
3.5.2.7.5. イメージストリームタグのイメージストリームからの削除
古いタグをイメージストリームから削除するには、以下を実行します。
oc tag -d <image-name:tag>
以下は例になります。
oc tag -d python:3.5 Deleted tag default/python:3.5.
3.5.2.7.6. タグの定期的なインポートの設定
外部 Docker レジストリーを使用している場合、(最新のセキュリティー更新を取得する場合などに) イメージを定期的に再インポートするには、--scheduled フラグを使用します。
oc tag <repositiory/image> <image-name:tag> --scheduled
以下は例になります。
oc tag docker.io/python:3.6.0 python:3.6 --scheduled Tag python:3.6 set to import docker.io/python:3.6.0 periodically.
このコマンドにより、OpenShift Container Platform はこの特定のイメージストリームタグを定期的に更新します。この期間のデフォルト値はクラスター全体で 15 分に設定されます。
定期的なチェックを削除するには、上記のコマンド再実行しますが、--scheduled フラグを省略します。これにより、その動作がデフォルトに再設定されます。
oc tag <repositiory/image> <image-name:tag>
3.6. デプロイメント
3.6.1. レプリケーションコントローラー
レプリケーションコントローラーは、特定の数の Pod のレプリカが常に実行されるようにします。Pod が終了するか、または削除される場合、レプリケーションコントローラーは定義された数まで追加のインスタンス化を実行するように機能します。同様に、必要な数以上に実行されている場合、必要な数量に一致する数になるように追加分を削除します。
レプリケーションコントローラー設定は以下で構成されます。
- 必要なレプリカ数 (ランタイム時に調整可能)。
- 複製された Pod の作成時に使用する Pod 定義。
- 管理された Pod を識別するためのセレクター。
セレクターは、レプリケーションコントローラーで管理される Pod に割り当てられるラベルのセットです。これらのラベルはレプリケーションコントローラーがインスタンス化する Pod 定義に組み込まれます。レプリケーションコントローラーはセレクターを使用して、必要に応じて調整を行うためにすでに実行されている Pod のインスタンス数を判別します。
レプリケーションコントローラーは負荷またはトラフィックに基づいて自動スケーリングを実行せず、追跡も行いません。レプリカ数は外部の自動スケーラーで調整される必要があります。
レプリケーションコントローラーは、ReplicationController というコアの Kubernetes オブジェクトです。
以下は、ReplicationController 定義のサンプルです。
apiVersion: v1 kind: ReplicationController metadata: name: frontend-1 spec: replicas: 1 1 selector: 2 name: frontend template: 3 metadata: labels: 4 name: frontend 5 spec: containers: - image: openshift/hello-openshift name: helloworld ports: - containerPort: 8080 protocol: TCP restartPolicy: Always
3.6.2. ジョブ
ジョブは、特定の理由のために Pod を作成することを目的としている点でレプリケーションコントローラーに似ています。相違点としては、レプリケーションコントローラーは継続的に実行されている Pod を対象としていますが、ジョブは 1 回だけ実行する (one-time) Pod を対象としています。ジョブは正常に完了している状態を追跡し、指定された完了数に達するとジョブ自体が完了します。
以下の例は、π (Pi) を 2000 桁計算し、これを出力してから完了します。
apiVersion: extensions/v1
kind: Job
metadata:
name: pi
spec:
selector:
matchLabels:
app: pi
template:
metadata:
name: pi
labels:
app: pi
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Neverジョブの使用方法についての詳細は、「ジョブ」のトピックを参照してください。
3.6.3. デプロイメントおよびデプロイメント設定
レプリケーションコントローラーでビルドする OpenShift Container Platform は、デプロイメントの概念を使用したソフトウェアの開発およびデプロイメントライフサイクルの拡張サポートを追加します。最も単純なケースでは、デプロイメントにより新規アプリケーションコントローラーのみが作成され、それが Pod を起動します。ただし、OpenShift Container Platform デプロイメントは、イメージの既存デプロイメントから新規デプロイメントに移行する機能も提供し、レプリケーションコントローラーの作成前後に実行するフックも定義します。
OpenShift Container Platform の DeploymentConfig オブジェクトは、デプロイメントについての以下の詳細を定義します。
-
ReplicationController定義の要素。 - 新規デプロイメントの自動作成のトリガー。
- デプロイメント間の移行ストラテジー。
- ライフサイクルフック。
デプロイメントがトリガーされる際には常に、手動または自動であるかを問わず、デプロイヤー Pod が (古いレプリケーションコントローラーの縮小、新規レプリケーションコントローラーの拡大およびフックの実行などの) デプロイメントを管理します。デプロイメント Pod は、デプロイメントのログを維持するためにデプロイメントの完了後は無期限で保持されます。デプロイメントが別のものに置き換えられる場合、以前のレプリケーションコントローラーは必要に応じて簡単なロールバックを有効にできるように保持されます。
デプロイメントの作成およびその対話方法についての詳細は、「デプロイメント」を参照してください。
以下は、いくつかの省略およびコールアウトを含む DeploymentConfig 定義のサンプルです。
apiVersion: v1
kind: DeploymentConfig
metadata:
name: frontend
spec:
replicas: 5
selector:
name: frontend
template: { ... }
triggers:
- type: ConfigChange 1
- imageChangeParams:
automatic: true
containerNames:
- helloworld
from:
kind: ImageStreamTag
name: hello-openshift:latest
type: ImageChange 2
strategy:
type: Rolling 33.7. テンプレート
3.7.1. 概要
テンプレートは、OpenShift Container Platform で作成されるオブジェクトの一覧を生成するためにパラメーター化され、処理されるオブジェクトのセットを記述します。作成するオブジェクトには、ユーザーがプロジェクト内で作成するパーミッションを持つすべてのものが含まれます。たとえば、サービス、ビルド設定、およびデプロイメント設定などが含まれます。テンプレートは、テンプレートで定義されるすべてのオブジェクトに適用されるラベルのセットも定義します。
テンプレートの作成および使用についての詳細は、テンプレートについてのガイドを参照してください。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.