OpenShift Web ConsoleでTopologyビューを眺めると、 Deployment、DeamonSet、StatefulSetといったワークロードにアイコンが表示されます。
テンプレートやHelmチャートでアプリケーションをデプロイした時は、 アイコン画像(以下の画像は公式ドキュメントに載っているもの)が出てきて素敵ですよね。
しかし、自前で適用するマニフェストの場合はデフォルトのアイコンが表示されます。 どの言語で何のフレームワークを使っているか一目で分かった方がカッコいいですよね。 そこでTopologyビューをかっこよく表示するために、アイコン画像の指定方法を探しました。
ドキュメント曰く
OpenShiftのドキュメント 2.1.5.2.7. Topology ビューに使用するラベルとアノテーション では、アイコン画像の指定方法は以下のように記載されています。
ノードに表示されるアイコン
ノードのアイコンは、最初に app.openshift.io/runtime ラベルを使用してから app.kubernetes.io/name ラベルを使用して一致するアイコンを検索して定義されます。このマッチングは、事前定義されたアイコンセットを使用して行われます。
ラベルをつければ良いだけでした。単純ですね。
それでは、 事前定義されたアイコンセットってどこにあるのでしょうか?何を指定すれば良いのでしょうか?
アイコンセットの場所
ネットの海を探したところ、以下の記事がヒットしました。OpenShift WebコンソールのGitHubリポジトリで、アイコンセットを定義したファイルを見ることが手っ取り早いようです。
https://gexperts.com/wp/empowering-developers-in-the-openshift-console/
Label app.openshift.io/runtime
...The topology view uses this to render the icon. A list of icons that are available in OpenShift can be found in github in the OpenShift console repo in the catalog-item-icon.tsx file. Note that you should select the branch that matches your OpenShift version, i.e. the “release-4.5” branch for OCP 4.5.
OpenShiftのバージョンに対応したブランチで該当ファイルを見てみます。
以下のようにKey-ValueのMapクラスに定義してありました。release-4.7
ブランチでは合計95種類のアイコンが定義されています。
この定義の後に記述されているTypescriptのコードを読み解く限り、
Mapのキーの文字列からプレフィックスの icon-
を除いた部分を、先のラベル(app.openshift.io/runtime
)の値に指定すれば良いです。
const logos = new Map<string, any>() .set('icon-3scale', threeScaleImg) .set('icon-aerogear', aerogearImg) .set('icon-amq', amqImg) .set('icon-angularjs', angularjsImg) .set('icon-ansible', ansibleImg) .set('icon-apache', apacheImg) .set('icon-beaker', beakerImg) .set('icon-camel', camelImg) .set('icon-capedwarf', capedwarfImg) .set(...);
実際にアイコンを指定してみる
実際にアイコンを指定してみます。 今回はOpenShift Developer Sandboxで検証しました。
まずはoc new-app
を実行してDeploymentにラベル指定しない場合です。
この場合はアイコン画像がデフォルト値(OpenShiftのアイコン)になります。
$ oc new-app liberty-oc-sample ...(中略)... --> Creating resources ... deployment.apps "liberty-oc-sample" created service "liberty-oc-sample" created --> Success $ oc get deployment.apps/liberty-oc-sample --show-labels NAME READY UP-TO-DATE AVAILABLE AGE LABELS liberty-oc-sample 1/1 1 1 4m46s app.kubernetes.io/component=liberty-oc-sample,app.kubernetes.io/instance=liberty-oc-sample,app=liberty-oc-sample
続いてDeploymentにラベルを指定してアイコン画像を指定します。
デプロイしたアプリはJavaで作成したので、アイコンセットから app.openshift.io/runtime=java
を指定します。
TopologyビューにはJavaのマスコットのDukeくんが表示されてますね。可愛いです。
$ oc label deployment.apps liberty-oc-sample app.openshift.io/runtime=java deployment.apps/liberty-oc-sample labeled
また、このアプリはOpenLibertyで動作するアプリケーションでもあります。
OpenLibertyもアイコンセットにアイコン画像が定義されているので、app.openshift.io/runtime=openliberty
を指定します。
TopologyビューにOpenLibertyのUFOアイコンが即時反映されました。
$ oc label deployment.apps liberty-oc-sample app.openshift.io/runtime=openliberty --overwrite deployment.apps/liberty-oc-sample labeled
ちなみにアイコンセットに定義されていないラベル名を誤って指定した場合は、 デフォルトのOpenShiftのアイコンになりました。
$ oc label deployment.apps liberty-oc-sample app.openshift.io/runtime=invalid --overwrite deployment.apps/liberty-oc-sample labeled
以上。