【コンテナ入門】OpenShiftの要素技術を整理してみた

# 1.はじめに
本記事は、「Kubernetesとは？OpenShiftとは？」の状態で急遽OpenShift基盤のシステム構築PJ（要件定義みたいな工程のみの参加）にアサインされた筆者のキャッチアップ備忘録になります。一応、Dockerについてはある程度知っていたので、Kubernetesもコンテナ界隈の技術であることは知ってたのですが、具体的な概念までは把握していませんでした。（OpenShiftにいたっては名前だけ聞いたことあるなレベル）

なので、対象者としては以下のような人を想定しています。
* コンテナ（Docker）に関する知見はある程度持ち合わせている人
* KubernetesとOpenShiftについては何も知らない人

一緒に、KubernetesとOpenShiftについて理解を深めましょう。

# 2. Kubernetes
コンテナは単一のアプリケーションを動かすには便利ですが、複数のコンテナをスケールし、効率的に運用するためのプラットフォームが必要です。そこで登場するのがKubernetesです。コンテナオーケストレーションツールとして、複数のコンテナ環境を一元管理するために利用します。（以降はk8sと略します。）
k8sを使うことで、コンテナをデプロイする度/コンテナが止まる度に実行していた「docker runコマンド」は不要になるとイメージしていただければと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/4afaf559-5f4b-77fe-e107-72c3f0b36d9f.png)

## 2-1.Dockerとの違いって？
Docker（コンテナ）との違いとしては、簡単にまとめると以下の通りです。
* **Docker** 
コンテナ技術を提供するプラットフォームで、アプリケーションをコンテナ化し、そのコンテナを実行するためのツール。単一のホスト上でコンテナを作成し、実行することに特化。


* **k8s**
複数のコンテナを管理・オーケストレーションするためのシステムで、スケーリングや高可用性の確保を支援します。複数のノードにまたがるコンテナの配置、負荷分散、スケール管理、障害からの回復を担当。

なので、k8sの世界においてはDockerはk8sの一部として使われることが多いです。K8sは「コンテナランタイム」としてDockerを使用し、その上でコンテナを管理します。

::: note info
コンテナランタイムに関して、Dockerは2022年4月以降非推奨となっています。
現在はcontainerd等が推奨となっています。
https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/
:::

## 2-2. k8sって？
既に沢山の方が整理してくださっているので、そちらの記事を参考にしてください。

* **k8sの概要、要素技術について**
k8sの概要、各ノードのコンポーネントの内容についてはこちらをご覧いただければと思います。
https://qiita.com/tadashiro_ninomiya/items/6e6fea807b2a16732b5b
<br>

* **k8sによる監視(ヘルスチェック)の仕組みについて**
k8sにおいては、Probeと呼ばれる設定を行うことで、k8s基盤上で稼働するPod・Pod内のコンテナの監視を行います。Probeについては、以下の記事が非常に分かりやすく整理されているのでご覧いただければと思います。
https://zenn.dev/nekoshita/articles/4e838ae224ed56
<br>

* **k8sで内部的に利用されているアーキテクチャについて**
以下をご覧いただければと思います。異なるノード間のコンテナがどうして疎通できるのか、整理されています。
https://www.slideshare.net/slideshow/cni-124981353/124981353


# 3.OpenShift
それでは、OpenShiftについて整理していきましょう。
基本的にはk8sと同じですが、OpenShiftはRed Hatが提供するコンテナプラットフォームで、アプリケーションの開発、デプロイ、および管理を容易にするためのツールとサービスを備えています。オープンソースプロジェクトであるOpenShift Originを基にした商用製品であり、クラウドやオンプレミス環境で利用可能です。OpenShiftは開発者にとって使いやすい環境を提供し、効率的なCI/CD（継続的インテグレーション/継続的デリバリー）をサポートします。実際の業務や本番システムの運用はk8s単体だととても大変なので、OpenShift等のより優れたツールを使用することが多いと思います。

## 3-1.k8sとの違いって？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/27f8b396-5ab9-c728-900b-bf73ef7f0d5c.png)
以下の観点で、k8sよりもより開発者にとって扱いやすいツールになっています。
* **インターフェースと使いやすさ**
OpenShiftは、開発者や運用担当者が使いやすいGUIやCLIツールを追加しており、KubernetesのAPIを利用しつつもユーザーフレンドリーなインターフェースを提供します。
※👇こういう画面で管理できるみたいです。
https://zenn.dev/gachigachi/articles/72c1065bb14488


* **セキュリティ**
OpenShiftはデフォルトでセキュリティポリシーが強化されており、特にコンテナがrootユーザーでの実行を避けるように設定されています。これにより、セキュリティのベストプラクティスが実装されます。


* **統合機能**
OpenShiftは、Kubernetesの上にビルドされており、CI/CDパイプライン、ログ管理、モニタリングなどの機能が統合されています。


* **サポートとエコシステム**
Red Hatによる商用サポートが提供され、エンタープライズ向けの信頼性の高いサービスが利用可能です。

## 3-2.OpenShiftの基本構成と要素技術
### 基本構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/26b2c795-fa3b-8483-24f2-af88d749968f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/90be4177-8714-34a6-7d08-edcafc6966a8.png)

※ノード内のコンポーネント（赤色）については、「k8sの概要、要素技術について」の参照記事をご覧ください。
※Container Runtimeはデフォルトがcontainerdですが、CRI-Oなどに変更も可能です。（上で記載している通り、Dockerは非推奨です。）


* **マスターノード**
OpenShiftクラスタの中枢を成すノードであり、クラスタ全体の管理と制御を行います。基本的には3台以上が推奨とされています。
* **ワーカーノード**
実際にアプリケーションコンテナを実行するノードです。基本的には2台以上が推奨とされています。
* **インフラノード（構成図に未記載）**
OpenShiftの運用系のコンポーネントを動かすための専用ノード。基本的には2台以上が推奨とされています。
https://rh-open.github.io/ocp-handson/openshift-services/04_infra-nodes.html
* **Route**
外部からOpenShiftクラスタ内のサービスにアクセスできるようにするためのリソースです。具体的には、以下の機能を提供します。
 ①外部トラフィックを適切なサービスにルーティングし、ロードバランシングを行います。
 ②TLS/SSL終端をサポートし、セキュアな通信を提供します。
 ③ドメイン名でアクセスを管理し、ルートの設定に基づいてトラフィックをルーティングします。
 
* **Service**
Podのグループに対して一貫したネットワークエンドポイントを提供する抽象化レイヤーです。Serviceにはいくつかの種類があり、それぞれ異なるユースケースに対応しています。
表.OpenShift Service一覧（by ChatGPT）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3691986/0a975207-34b8-9ca5-61d3-3dfbfbbb3af8.png)

* **Pod**
Kubernetes（およびOpenShift）における最小のデプロイ単位で、一つまたは複数のコンテナをグループ化します。
基本的には1Podにつき、1コンテナと覚えていただいてよいと思います。
全てのコンテナは同じネットワーク名前空間（IPアドレス）を共有し、同じストレージボリュームをマウントできます。
* **ReplicaSet**
指定した数のPodのレプリカを維持するためのコントローラーです。Podの望ましい数を指定し、クラスタ内でその数を維持します。スケーリングが簡単で、望ましい状態を変更することでPodの数を増やしたり減らしたりできます。

### 要素技術
* **OpenShift Service Mesh**
Istioベースのサービスメッシュで、マイクロサービスの管理を容易にします。サービスメッシュとは主に、アプリケーション間の通信制御などをインフラ側で制御してしまおうという技術です。
https://www.redhat.com/ja/technologies/cloud-computing/openshift/what-is-openshift-service-mesh

* **OpenShift CLI（ocコマンド）**
クラスターの管理をコマンドラインから行うためのツール。ocコマンドという。
コマンドは以下記事を参考にしてください。
https://zenn.dev/gachigachi/articles/7ebfeeed2e3fc2
* **OpenShift Pipelines**
k8sリソースをベースとしたクラウドネイティブの継続的インテグレーションおよび継続的デリバリー (CI/CD) ソリューション。TektonというOSSがベースになっています。k8sプラットフォーム全体で移植可能な S2I (Source-to-Image)、Buildah、Buildpacks、および Kaniko などのk8sツールを使用してイメージをビルドできます。
https://rheb.hatenablog.com/entry/2021/07/19/OpenShift_Pipelines_%E3%81%AE%E3%81%94%E7%B4%B9%E4%BB%8B%28Tekton_Pipelines%E7%B7%A8%29

また、何か整理したいことがあれば追記していこうと思います。