私たちは通常、Kubernetesは単なるKubernetesであり、OpenShiftはすでにMicrosoftAKSやAmazonEKSなどのKubernetesプラットフォームであるという説から始めます。これらのプラットフォームにはそれぞれ独自の利点があり、1人または別のターゲットオーディエンスを対象としています。そしてその後、会話はすでに特定のプラットフォームの長所と短所を比較することに波及しています。
一般に、この投稿は、「聞いてください。OpenShiftまたはAKS、EKS、一部のカスタムKubernetes、または任意のKubernetesでコードを実行する場所は関係ありません(簡潔にするために、それを呼び出しましょう)のような結論で書くことを考えました。 KUK)は、あちこちで本当にシンプルです。」
次に、最も単純な「Hello World」を取り上げ、その例を使用して、KUKとRed Hat OpenShift Container Platform(以下、OCPまたは単にOpenShift)の共通点と相違点を示すことを計画しました。
しかし、この投稿を書いているうちに、OpenShiftの使用に非常に長い間慣れていたため、OpenShiftがどのように成長し、単なるKubernetesディストリビューション以上の素晴らしいプラットフォームに変わったかを理解できませんでした。私たちは、OpenShiftの成熟度とシンプルさを当然のことと考えながら、その輝きを見失っています。
一般的に、積極的な悔い改めの時が来ました。今度は、KUKとOpenShiftでの「HelloWorld」の試運転を段階的に比較し、可能な限り客観的に行います(おそらく、主題に対して個人的な態度を示すこともあります)。この問題に関する純粋に主観的な意見に興味がある場合は、ここ(EN)で読むことができます。この投稿では、事実と事実のみに固執します。
クラスター
したがって、「HelloWorld」にはクラスターが必要です。サーバー、レジストリ、ネットワーク、データ転送などにお金を払わないように、パブリッククラウドにはノーとしましょう。したがって、Minikube(KUKの場合)およびCode Ready Containers(OpenShiftクラスターの場合)で単純な単一ノードクラスターを選択します。これらのオプションはどちらもインストールが非常に簡単ですが、ラップトップにかなりのリソースが必要になります。

KUK-eでの集会
じゃ、行こう。
ステップ1-コンテナイメージを構築する
まず、「ハローワールド」をミニクベに展開します。これには以下が必要です。
- 1.インストールされたDocker。
- 2.インストールされたGit。
- 3.インストールされたMaven(実際には、このプロジェクトはmvnwバイナリを使用するため、それがなくても実行できます)。
- 4.実際には、ソース自体、つまり リポジトリのクローンgithub.com/gcolman/quarkus-hello-world.git
最初のステップは、Quarkusプロジェクトを作成することです。Quarkus.ioを使用したことがない場合でも、心配する必要はありません。簡単です。プロジェクトで使用するコンポーネント(RestEasy、Hibernate、Amazon SQS、Camelなど)を選択するだけで、Quarkus自体が参加せずに、mavenアーキタイプを構成し、すべてをgithubにアップロードします。つまり、文字通り1回のマウスクリックで完了です。それがQuarkusが大好きな理由です。

「HelloWorld」をコンテナイメージに組み込む最も簡単な方法は、quarkus-maven Docker拡張機能を使用することです。これにより、すべての作業が実行されます。Quarkusの登場により、これは非常に簡単でシンプルになりました。container-image-docker拡張機能を追加すると、mavenコマンドを使用して画像を作成できます。
./mvnw quarkus:add-extension -Dextensions=”container-image-docker”
最後に、Mavenを使用してイメージを作成します。その結果、ソースコードは、コンテナランタイムですでに起動できる既製のコンテナイメージに変わります。

./mvnw -X clean package -Dquarkus.container-image.build=true
実際、これですべてです。これで、docker runコマンドを使用してコンテナを起動できます。これで、サービスをポート8080にマップして、アクセスできるようになりました。
docker run -i — rm -p 8080:8080 gcolman/quarkus-hello-world

コンテナインスタンスが開始された後、サービスが実行されていることをcurlコマンドで確認するだけです。

だからすべてがうまくいき、それは本当に簡単でシンプルでした。
ステップ2-コンテナをコンテナイメージリポジトリにプッシュする
これまでに作成したイメージは、ローカルのコンテナストレージにローカルに保存されています。このイメージをKUK環境で使用する場合は、他のリポジトリに配置する必要があります。Kubernetesにはそのような機能がないため、dockerhubを使用します。なぜなら、第一に、それは無料であり、第二に、(ほとんど)誰もがそれをするからです。
これも非常に簡単で、必要なのはdockerhubアカウントだけです。
そこで、dockerhubをインストールして、そこに画像を送信します。

ステップ3-Kubernetesを起動する
「HelloWorld」を実行するためにkubernetes構成を構築する方法はたくさんありますが、最も単純なものを使用します。私たちは私たちのような人々です...
まず、minikubeクラスターを開始します。
minikube start
ステップ4-コンテナイメージを展開する
次に、コードとコンテナイメージをkubernetes構成で変換する必要があります。つまり、dockerhub上のコンテナイメージを示すポッドと展開の定義が必要です。これを行う最も簡単な方法の1つは、イメージを指すcreatedeploymentコマンドを実行することです。

kubectl create deployment hello-quarkus — image =gcolman/quarkus-hello-world:1.0.0-SNAPSHOT
このコマンドを使用して、コンテナイメージのポッド仕様を含む展開構成を作成するようにKUKに指示しました。このコマンドは、この構成をminikubeクラスターにも適用し、コンテナーイメージをダウンロードして、クラスターでポッドを開始するデプロイメントを作成します。
ステップ5-私たちのサービスへのオープンアクセス
コンテナイメージがデプロイされたので、このRestfulサービスへの外部アクセスを構成する方法について考えてみましょう。実際には、コードでプログラムされています。
多くの方法があります。たとえば、exposeコマンドを使用して、サービスやエンドポイントなどの適切なKubernetesコンポーネントを自動的に作成できます。実際、これは、デプロイメントオブジェクトに対してexposeコマンドを実行することによって実行することです。
kubectl expose deployment hello-quarkus — type=NodePort — port=8080
少しの間、exposeコマンドの「-type」オプションに焦点を当てましょう。
サービスの実行に必要なコンポーネントを公開して作成するときは、特に、外部からSDN内にあるhello-quarkusサービスに接続できるようにする必要があります。また、typeパラメーターを使用すると、ロードバランサーなどを作成して接続し、トラフィックをこのネットワークにルーティングできます。
たとえば、type = LoadBalancerと書くと、パブリッククラウドのロードバランサーを自動的に初期化して、Kubernetesクラスターに接続します。もちろん、これはすばらしいことですが、このような構成は特定のパブリッククラウドに厳密に関連付けられ、異なる環境のKubernetesインスタンス間で転送するのがより困難になることを理解する必要があります。
この例では、type = NodePortです。つまり、サービスへの呼び出しは、ノードのIPアドレスとポート番号によって行われます。このオプションを使用すると、パブリッククラウドを使用できなくなりますが、いくつかの追加手順が必要になります。まず、独自のロードバランサーが必要なので、クラスターにNGINXロードバランサーを展開します。
ステップ6-ロードバランサーをインストールします
Minikubeには、入力コントローラーなど、外部アクセスに必要なコンポーネントを簡単に作成できるプラットフォーム機能が多数あります。MinikubeにはNginx入力コントローラーが付属しており、有効にして構成するだけです。
minikube addons enable ingress
ここで、コマンドを1つだけ使用して、minikubeクラスター内で機能するNginx入力コントローラーを作成します。
ingress-nginx-controller-69ccf5d9d8-j5gs9 1/1 Running 1 33m
ステップ7-入力の構成
次に、hello-quarkus要求を受け入れるようにNginx入力コントローラーを構成する必要があります。


最後に、この構成を適用する必要があります。

kubectl apply -f ingress.yml

これはすべてコンピューターで行うため、ノードのIPアドレスを/ etc / hostsファイルに追加するだけで、httpリクエストをminikubeからNGINXロードバランサーにルーティングできます。
192.168.99.100 hello-quarkus.info
これで、minikubeサービスに外部からNginx入力コントローラーを介してアクセスできるようになりました。

まあ、それは簡単でしたよね?またはそうではありませんか?

OpenShift(Code Ready Containers)で起動
次に、これがすべてRed Hat OpenShift Container Platform(OCP)でどのように行われるかを見てみましょう。
minikubeと同様に、Code Ready Containers(CRC)の形式で単一ノードのOpenShiftクラスターを持つスキーマを選択します。以前はミニシフトと呼ばれ、OpenShift Originプロジェクトに基づいていましたが、現在はCRCであり、RedHatのOpenShiftContainerPlatform上に構築されています。
ここで、申し訳ありませんが、「OpenShiftは素晴らしいです!」と言わざるを得ません。
当初、OpenShiftでの開発はKubernetesでの開発と何ら変わりはないと書いていました。そして実際にはそうです。しかし、この投稿を書く過程で、OpenShiftがないときに実行しなければならない不要な動きがいくつあるかを思い出しました。したがって、これも素晴らしいことです。すべてが簡単で、minikubeと比較してどれほど簡単であるか、私たちの例はOpenShiftで展開および実行されているため、この投稿を書くようになりました。
プロセスを実行して、何をする必要があるかを見てみましょう。
したがって、minikubeの例では、Dockerから始めました...停止します。マシンにDockerをインストールする必要はありません。
そして、ローカルgitは必要ありません。
そして、Mavenは必要ありません。
また、手でコンテナイメージを作成する必要はありません。
また、コンテナイメージのリポジトリを検索する必要はありません。
また、入力コントローラーをインストールする必要はありません。
また、入力を構成する必要もありません。
わかりますよね?OpenShiftでアプリケーションをデプロイして実行するために、上記のいずれも必要ありません。そして、プロセス自体は次のようになります。
ステップ1-OpenShiftクラスターを起動する
RedHatのCodeReady Containersを使用します。これは、基本的に同じMinikubeですが、本格的なシングルノードOpenshiftクラスターのみを使用します。
crc start
ステップ2-アプリケーションをビルドしてOpenShiftクラスターにデプロイする
この段階で、OpenShiftのシンプルさと便利さがすべての栄光に現れます。すべてのKubernetesディストリビューションと同様に、クラスター上でアプリケーションを実行する方法はたくさんあります。そして、KUKの場合と同様に、私たちは意図的に最も単純なものを選択します。
OpenShiftは、コンテナ化されたアプリケーションを構築および実行するためのプラットフォームとして常に構築されてきました。コンテナの構築は常にこのプラットフォームの不可欠な部分であるため、関連するタスクのための追加のKubernetesリソースがたくさんあります。
OpenShift Source 2 Image(S2I)プロセスを使用します。このプロセスには、ソース(コードまたはバイナリ)を取得して、OpenShiftクラスターで実行されるコンテナーイメージに変換するいくつかの異なる方法があります。
このためには、2つのことが必要です。
- gitリポジトリのソースコード
- ビルドの基礎となるビルダーイメージ。
Red Hatとコミュニティレベルの両方で管理されているそのようなイメージはたくさんあります。Javaアプリケーションを構築しているので、OpenJDKイメージを使用します。
S2Iビルドは、OpenShiftDeveloperグラフィカルコンソールとコマンドラインの両方から開始できます。new-appコマンドを使用して、ビルダーイメージとソースコードを取得する場所を指定します。

oc new-app registry.access.redhat.com/ubi8/openjdk-11:latest~https://github.com/gcolman/quarkus-hello-world.git
以上で、アプリケーションが作成されました。そうすることで、S2Iプロセスは次のことを行いました。
- アプリケーションの構築に関連するあらゆる種類のサービスビルドポッドを作成しました。
- OpenShiftビルド構成を作成しました。
- ビルダーイメージをOpenShiftの内部dockerレジストリにダウンロードしました。
- 「HelloWorld」をローカルリポジトリにクローンしました。
- そこにmavenpomがあるのを見て、mavenでアプリをコンパイルしました。
- コンパイルされたJavaアプリケーションを含む新しいコンテナイメージを作成し、そのイメージを内部コンテナレジストリに配置しました。
- ポッドの仕様、サービスなどを使用してKubernetesデプロイメントを作成しました。
- コンテナイメージのデプロイを開始しました。
- サービスビルドポッドを削除しました。
このリストには多くのものがありますが、主なことは、すべてのビルドがOpenShift内で排他的に行われ、内部DockerレジストリがOpenShift内にあり、ビルドプロセスがすべてのKubernetesコンポーネントを作成し、それらをクラスターで実行することです。
コンソールでS2Iの起動を視覚的に追跡すると、ビルド中にビルドポッドがどのように起動されるかを確認できます。

次に、ビルダーポッドのログを見てみましょう。まず、mavenがどのように機能するかを示し、依存関係をダウンロードしてJavaアプリケーションを構築します。

mavenビルドが終了すると、コンテナイメージのビルドが開始され、このビルドされたイメージが内部リポジトリにプッシュされます。

これで、組み立てプロセスは完了です。次に、アプリケーションのポッドとサービスがクラスターで実行されていることを確認しましょう。
oc get service

それで全部です。そしてたった1つのチーム。このサービスを外部アクセス用に公開する必要があります。
ステップ3-外部アクセス用にサービスを公開する
KUKの場合と同様に、OpenShiftプラットフォームでは、「Hello World」にも、外部トラフィックをクラスター内のサービスに転送するためのルーターが必要です。 OpenShiftはこれを非常に簡単にします。まず、HAProxyルーティングコンポーネントがデフォルトでクラスターにインストールされます(同じNGINXに変更できます)。次に、Routesと呼ばれる特別で高度にカスタマイズ可能なリソースがあります。これは古き良きKubernetesのIngressオブジェクトに似ています(実際、OpenShiftのRoutesは、OpenShiftで使用できるIngressオブジェクトの設計に強く影響しました) 、ただし、「ハローワールド」の場合、および他のほとんどすべての場合、追加構成のない標準ルートで十分です。
「HelloWorld」のルーティング可能なFQDNを作成するには(はい、OpenShiiftにはサービス名でルーティングするための独自のDNSがあります)、サービスを公開するだけです。

oc expose service quarkus-hello-world
新しく作成されたルートを見ると、そこにFQDNおよびその他のルーティング情報があります。
oc get route

最後に、ブラウザからサービスにアクセスします。

今では本当に簡単でした!
私たちはKubernetesとテクノロジーが可能にするすべてのものを愛し、シンプルさと軽さも愛しています。 Kubernetesは、分散型のスケーラブルなコンテナを非常に簡単に操作できるように構築されていますが、その単純さだけではアプリケーションを展開するのに十分ではありません。そしてここでOpenShiftが活躍します。これは時代に歩調を合わせ、主に開発者に焦点を当てたKubernetesを提供します。 S2I、ODI、開発者ポータル、OpenShiftオペレーターフレームワーク、IDE統合、開発者カタログ、Helm統合、監視などのツールの作成など、開発者向けにOpenShiftプラットフォームを作成するために多くの努力が払われてきました。
この記事がおもしろくて参考になったと思います。また、OpenShiftプラットフォームでの開発に役立つその他のリソース、資料、その他の情報については、Red HatDevelopersポータルにアクセスしてください。