第3章 コアとなる概念
3.1. 概要
以下のトピックでは、OpenShift Container Platform を使用する際に生じるコアとなる概念およびオブジェクトについてのハイレベルのアーキテクチャー情報を提供します。これらのオブジェクトの多くは、さらに機能が充実した開発ライフサイクルプラットフォームを提供するために OpenShift Container Platform で拡張された Kubernetes のオブジェクトです。
- コンテナーおよびイメージは、アプリケーションのビルディングブロックです。
- 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 は終了後に削除されるか、コンテナーのログへのアクセスを有効にするために保持される可能性があります。
OpenShift Container Platform は Pod をほとんどがイミュータブルなものとして処理します。Pod が実行中の場合は Pod に変更を加えることができません。OpenShift Container Platform は既存 Pod を終了し、これを変更された設定、ベースイメージのいずれかまたはその両方で再作成して変更を実装します。Pod は拡張可能なものとして処理されますが、再作成時に状態を維持しません。そのため、通常 Pod はユーザーから直接管理されるのでははく、ハイレベルの コントローラーで管理される必要があります。
OpenShift Container Platform ノードホストの最大数については、「クラスター制限」を参照してください。
レプリケーションコントローラーによって管理されないベア Pod はノードの中断時に再スケジュールされません。
以下は、実際に OpenShift Container Platform インフラストラクチャーの一部である統合コンテナーレジストリーという、長期に実行されるサービスの Pod のサンプル定義です。これは数多くの 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 グループの選択や管理が可能になります。これらのラベルは、キー/値形式で
メタデータ
ハッシュに保存されます。この例で使用されているラベルは docker-registry=default です。 - 2
- Pod にはそれらの namespace 内に任意の名前がなければなりません。Pod 定義は
generateName
属性で名前のベースを指定できますが、一意の名前を生成するためにランダムな文字が自動的に追加されます。 - 3
コンテナー
はコンテナー定義の配列を指定します。この場合 (ほとんどの場合)、これは 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 |
| |
マシンごとに 1 回実行される必要のある 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 に挿入するオブジェクトです。
OpenShift Container Platform 3.7 の時点で、Pod の Preset はサポートされなくなりました。
挿入できる Pod の Preset オブジェクトの使用
- シークレットオブジェクト
-
ConfigMap
オブジェクト - ストレージボリューム
- コンテナーボリュームのマウント
- 環境変数
開発者は、すべての情報を Pod に追加するために Pod ラベルが PodPreset のラベルセレクターに一致することを確認する必要があります。Pod のラベルは Pod を一致するラベルセレクターを持つ 1 つ以上の Pod Preset オブジェクトに関連付けます。
Pod Preset を使用し、開発者は Pod が消費するサービスの詳細を把握せずに Pod のプロビジョニングを実行できます。管理者はサービスの設定項目を開発者に非表示にできます。この際、開発者の Pod のデプロイを妨げることはありません。
Pod Preset 機能は Service Catalog がインストールされている場合にのみ利用できます。
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
を除くすべてのアプリコンテナーのフィールドが含まれます。Init コンテナーは Pod 起動が継続するために終了する必要があり、完了以外の readiness を定義することはできません。
Init コンテナーには Pod の activeDeadlineSeconds
およびコンテナーの livenessProbe
を追加し、init コンテナーが完全に機能しなくなるのを防ぐことができます。有効な期限には init コンテナーで使用される時間が含まれます。
3.3.3. Services
Kubernetes サービスは内部ロードバランサーとして機能します。これは、受信する接続をプロキシー送信するために一連のレプリケートされた Pod を特定します。バッキング Pod は、サービスが一貫して利用可能な状態の間に任意でサービスに追加されたり、削除されたりします。これにより、サービスに依存して同じアドレスの Pod を参照するすべてのものを有効にします。デフォルトのサービス clusterIP アドレスは OpenShift Container Platform 内部ネットワークからのもので、Pod が相互にアクセスできるように使用されます。
サービスへの外部アクセスを許可するには、クラスターの「外部」にある追加の externalIP
および ingressIP
アドレスをサービスに割り当てることができます。これらの externalIP
アドレスには、サービスへの「高可用」アクセスを提供する仮想 IP アドレスを使用することもできます。
サービスには 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
レコードを検出する際に、サービスの loadbalanced 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 および初期化および停止時に DNS を解決する必要のあるユースケースで使用する場合、publishNotReadyAddresses
を true
に設定します (デフォルト値は false
です)。publishNotReadyAddresses
が true
に設定されている場合、これは DNS 実装がサービスに関連付けられたエンドポイントのサブセットの notReadyAddresses
を公開する必要があることを示します。
3.3.4. ラベル
ラベルは、API オブジェクトを編成し、分類し、選択するために使用されます。たとえば、Pod にはラベルで「タグ付け」されてから、サービスはラベルセレクターを使用してそれらがプロキシー送信する Pod を識別します。これにより、サービスが Pod のグループを参照することを可能にし、Pod を関連エンティティーとして異なるコンテナーで処理することもできます。
ほとんどのオブジェクトには、そのメタデータにラベルを組み込むことができます。そのため、ラベルは任意で関連付けられたオブジェクトを分類するために使用できます。たとえば、特定アプリケーションのすべての Pod、サービス、レプリケーションコントローラー、およびデプロイメント設定を分類できます。
ラベルは、以下の例にあるように単純なキー/値のペアです。
labels: key1: value1 key2: value2
以下を検討してください。
- nginx コンテナーで構成される、ラベル role=webserver を持つ Pod。
- Apache httpd コンテナーで構成される、同じラベル role=webserver を持つ Pod。
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 要求は、匿名
システムユーザーによって要求される際に認証されます。認証が実行されると、ユーザーが実行を認証されている内容がポリシーによって決定されます。
3.4.2. Namespace
Kubernetes namespace はクラスターのリソースのスコープを設定するメカニズムを提供します。OpenShift Container Platform では、プロジェクトは追加のアノテーションを含む Kubernetes namespace です。
Namespace は以下の一意のスコープを提供します。
- 基本的な命名の衝突を避けるための名前付きリソース。
- 信頼されるユーザーに委任された管理権限。
- コミュニティーリソースの消費を制限する機能。
システム内の大半のオブジェクトのスコープは namespace で設定されますが、一部はノードやユーザーを含め、除外され、namaspace が設定されません。
Kubernetes ドキュメントには namespace についての詳細が記載されています。
3.4.3. プロジェクト
プロジェクトは追加のアノテーションを持つ Kubernetes namespace であり、通常ユーザーのリソースへのアクセスが管理される中心的な手段です。プロジェクトはユーザーのコミュニティーが他のコミュニティーとは切り離してコンテンツを編成し、管理することを許可します。ユーザーには、管理者によってプロジェクトへのアクセうが付与される必要があり、許可される場合はプロジェクトを作成でき、それらの独自のプロジェクトへのアクセスが自動的に付与されます。
プロジェクトには、別個の名前
、displayName
、および説明
を含めることができます。
-
必須の
name
はプロジェクトの一意の ID であり、CLI ツールまたは API を使用する場合に最も明確に表示されます。名前の最大長さは 63 文字です。 -
オプションの
displayName
はプロジェクトが Web コンソールで表示される方法を示します (デフォルトはname
に設定されます)。 -
オプションの
description
には、プロジェクトのさらに詳細な記述を施与うでき、これも Web コンソールで表示できます。
各プロジェクトは、以下の独自のセットのスコープを設定します。
オブジェクト |
Pod、サービス、レプリケーションコントローラーなど。 |
ポリシー |
ユーザーがオブジェクトに対してアクションを実行できるか、できないかについてのルール。 |
制約 |
制限を設定できるそれぞれの種類のオブジェクトのクォータ。 |
サービスアカウント |
サービスアカウントは、プロジェクトのオブジェクトへの指定されたアクセスで自動的に機能します。 |
クラスター管理者は「プロジェクトの作成」や、プロジェクトの「管理者権限の委任」をユーザーコミュニティーの任意のメンバーに対して実行できます。また、クラスター管理者は開発者が「独自のプロジェクト」を作成することも許可します。
開発者および管理者は、「CLI」または「Web コンソール」を使用してプロジェクトとの対話が可能です。
3.4.3.1. インストール時にプロビジョニングされるプロジェクト
OpenShift Container Platform は、追加設定なしで使用できるプロジェクトが多数含まれていますが、openshift-
で始まるプロジェクトがユーザーにとって最も重要なプロジェクトです。
3.10 以降のバージョンでは、openshift-
で始まるプロジェクトが多数あり、Pod や他のインフラストラクチャーコンポーネントとしてマスターコンポーネントをホストすることができます。「重要な Pod アノテーション」が指定されている場合に、これらの namespace で作成された Pod は、重要とみなされ、kubelet で必ず受け付けられるようになります。これらの namespace でマスターコンポーネント用に作成された 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 Pipeline プラグインで実行できるように、Jenkins パイプライン を定義することができます。ビルドは他のビルドタイプの場合と同様に OpenShift Container Platform での起動、モニタリング、管理が可能です。
Pipeline ワークフローは、ビルド設定に直接組み込むか、Git リポジトリーに配置してビルド設定で参照して Jenkinsfile で定義します。
プロジェクトが Pipeline ストラテジーを使用してはじめてビルド設定を定義する場合に、OpenShift Container Platform は Jenkins サーバーをインスタンス化して Pipeline を実行します。プロジェクトの後続の Pipeline ビルド設定はこの Jenkins サーバーを共有します。
Jenkins サーバーのデプロイ方法や自動プロビジョニングの設定または無効にする方法についての詳細は、「Pipeline 実行の設定」を参照してください。
Jenkins サーバーは、すべての Pipeline ビルド設定が削除されても自動的に削除されないため、ユーザーが手動で削除する必要があります。
Jenkins Pipeline についての詳細は、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 イメージタグを直接ポイントしない)、イメージストリームタグが今後別のイメージストリームタグに従うように更新される可能性があります。また、これにより、互換性のないバージョンの変更が選択される可能性があります。
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 リソースオブジェクトです。以下の「イメージストリームのイメージ」を参照してください。
- イメージストリームトリガー
- イメージストリームタグの変更時に特定のアクションを生じさせるトリガーです。たとえば、インポートにより、タグの値が変更され、これにより Deployments、Builds またはそれらをリッスンする他のリソースがある場合にトリガーが実行されます。以下の「イメージストリームトリガー」を参照してください。
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
イメージストリームタグは permanent タグまたは tracking タグにすることができます。
- 永続タグ は、Python 3.5 などの特定バージョンのイメージをポイントするバージョン固有のタグです。
追跡タグ は別のイメージストリームタグに従う参照タグで、シンボリックリンクなどのように、フォローするイメージを変更するために今後更新される可能性があります。このような新規レベルでは後方互換性が確保されない点に注意してください。
たとえば、OpenShift Container Platform に同梱する
latest
イメージストリームタグは追跡タグです。これは、latest
イメージストリームタグのコンシューマーが新規のレべうが利用可能になるとイメージで提要されるフレームワークの最新レベルに更新されることを意味します。v3.6
へのlatest
イメージストリームタグはいつでもv3.7
に変更される可能性があります。これらのlatest
イメージストリームタグは Dockerlatest
タグと異なる動作をすることに注意してください。この場合、latest
イメージストリームタグは Docker リポジトリーの最新イメージをポイントしません。これは、イメージの最新バージョンでない可能性のある別のイメージストリームタグをポイントします。たとえば、3.3
バージョンのリリース時に、latest
イメージストリームタグがイメージのv3.2
をポイントする場合、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 ago
3.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>
たとえば、以下は latest
タグを更新し、3.6
タグをイメージタグに反映させます。
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. Deployments (デプロイメント)
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 作成/削除/更新のオーケストレーションにはデプロイメントでレプリカセットを使用します。デプロイメントは、自動的にレプリカセットを管理し、Pod に宣言の更新を加えるので、作成するレプリカセットを手動で管理する必要はありません。
レプリカセットは、ReplicaSet
と呼ばれるコアの Kubernetes オブジェクトです。
以下は、ReplicaSet
定義のサンプルです。
apiVersion: apps/v1 kind: ReplicaSet metadata: name: frontend-1 labels: tier: frontend spec: replicas: 3 selector: 1 matchLabels: 2 tier: frontend matchExpressions: 3 - {key: tier, operator: In, values: [frontend]} template: metadata: labels: tier: frontend spec: containers: - image: openshift/hello-openshift name: helloworld ports: - containerPort: 8080 protocol: TCP restartPolicy: Always
3.6.3. ジョブ
ジョブは、その目的が特定の理由のために Pod を作成することである点でレプリケーションコントローラーと似ています。違いは、レプリケーションコントローラーの場合は、継続的に実行されている Pod を対象としていますが、ジョブは 1 回限りの 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.4. デプロイメントおよびデプロイメント設定
レプリケーションコントローラーでビルドする 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 3
3.7. テンプレート
3.7.1. 概要
テンプレートは、OpenShift Container Platform で作成されるオブジェクトの一覧を生成するためにパラメーター化され、処理されるオブジェクトのセットを記述します。作成するオブジェクトには、ユーザーがプロジェクト内で作成するパーミッションを持つすべてのものを作成します。たとえば、サービス、ビルド設定、およびデプロイメント設定などがあります。テンプレートは、テンプレートで定義されたすべてのオブジェクトに適用されるラベルのセットも定義します。
テンプレートの作成および使用についての詳細は、「テンプレートについてのガイド」を参照してください。