IBM Cloudが提供するコンテナ３サービス触ってみた

IBM Cloudが提供する以下の3つのコンテナサービス"Code Engine", "IBM Cloud Kubernetes Service", "Red Hat OpenShift on IBM Cloud" を利用したことのない方に向けて、サービス概要・料金体系・各サービス上でアプリケーションの実行・外部公開をできる手順を書きました。コンテナ・Kubernetesの一般的な用語の解説はしておりません。



# IBM Cloud Code Engine
IBM Cloud® Code Engineは、Web アプリ、マイクロサービス、イベント・ドリブン機能、バッチ・ジョブなどのコンテナ化されたワークロードを実行する、フルマネージドのサーバーレス・プラットフォームです。インフラやクラスターを管理する必要が無いことが特徴です。


## 【アーキテクチャ】
![スクリーンショット 2023-12-14 15.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/459eb6bd-7634-053f-014e-1a1a565d1584.png)




## 【料金体系】
Code Engineは従量課金制のサービスで、主にアプリケーションを動かしている分だけお金がかかります。
* ビルド時のリソース使用量/秒　CPU, Memory/秒
(ソースコードを元にコンテナイメージをビルドする場合のみ。
ビルド済みのコンテナイメージを指定してデプロイする場合は不要です)
* ランタイム時のリソース使用量/秒　CPU, Memory/秒
* HTTPリクエスト数/月


## 【触ってみた】
### 目標：コンテナイメージからアプリケーションをデプロイし、インターネットからアクセスする。

Code Engineを使ってアプリケーションをデプロイする方法は幾つかあります。
・アプリケーションのソースコードを元にビルド・デプロイ
・Dockerfileを使ってビルド・デプロイ
・コンテナイメージを指定してデプロイ　←今回はこちら

### 1. プロジェクトの作成
プロジェクトとは、アプリケーション、ジョブ、ビルドなどの Code Engine エンティティーをグループにまとめるものです。ロケーション、名前、リソースグループを選択して、作成します。
![スクリーンショット_2023-12-14_14_54_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/dd8ef4ba-c654-1136-bd10-bb0b90262b8c.png)



### 2. アプリケーションの作成
アプリケーションの作成時に、コンテナイメージを指定するか、ソースコードを元にビルドするか選ぶことができます。今回はCode Engineがサンプルとして提供しているhelloworldのイメージを使ってみます。
コンテナイメージを選択し、アプリケーション作成ボタンを押します。
![スクリーンショット 2023-12-05 10.13.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/af51a1e5-3228-f424-dfc1-dd86763366ca.png)
StatusがReadyになったらデプロイ完了です。
![スクリーンショット 2023-12-05 10.17.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/4af8465f-7488-2bb5-fc68-004afb507505.png)

プロジェクトのアプリ一覧の画面にて、今デプロイされたアプリケーションを確認することができます。
![スクリーンショット 2023-12-05 10.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/295bd4de-f8b0-5c64-d1d8-0e8d3297ad23.png)

### 3. アクセスしてみる
『URLを開く』からアプリケーションにアクセスしてみます。
![スクリーンショット 2023-12-05 10.22.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/ab59aed3-1ae6-7fc8-a617-47e6e2e285c8.png)


helloworldのアプリケーションが表示されました！
IBM Cloudの画面を使って簡単にアプリケーションをデプロイし、外部からアクセス出来ることがわかりました。

# IBM Cloud Kubernetes Service
IBM Cloud Kubernetes Serviceは、オープンソースのコンテナオーケストレーションツール”Kubernetes”を、フルマネージドで提供するサービスです。


## 【アーキテクチャ】
![スクリーンショット 2023-12-13 18.08.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/96696446-25e6-0ad3-0f9e-21a2f5537d27.png)

## 【料金体系(VPC)】
IBM Cloud Kubernetes Serviceは、主に作成するクラスターのサイズ(ワーカーノードのスペックと台数)によって値段が決まります。


* ワーカーノード
    * 選択したマシンタイプと合計稼働台数に対して課金が発生
    * 仮想サーバーは時間課金
* サブネットIPアドレス
    * Floating IPの費用が発生（月課金）
* ロード・バランサー
    * Load Balancer for VPC の費用が発生（時間課金）
* パブリックアウトバウンド利用料金
    * データ通信量に応じて課金発生

(Classicの料金体系は今回は記載しておりません)



## 【触ってみた】
### 目標：クラスターにアプリケーションをデプロイし、Ingressを用いてインターネットからアクセスできるようにする。

構成イメージ
![スクリーンショット 2023-12-14 15.09.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/bb4c1e2c-d306-3b23-bca0-5fc70ec2837e.png)


### 1. VPCにクラスターを作成
クラスターの作成画面です。
![スクリーンショット_2023-12-05_14_44_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/62f6cbe3-272d-f9fe-a38d-49670e7cb1b4.png)


今回はハンズオン用のため、以下のような最小構成にします。
* インフラストラクチャー：VPC
* ワーカーゾーン：シングルゾーン
* 1ゾーンあたりのワーカーノード：2台
* フレーバー(ノードが払い出されるサーバーのスペック)：cx2.2x4(2vCPU,4GBメモリ)
* サービスエンドポイント：public・private
    
   

    
### 2. アプリケーションをクラスターにデプロイ
作成したクラスターにアプリケーションをデプロイします。ここから、ブラウザーを介してアクセスできるIBM Cloud Shellを使って操作しました。ブラウザーベースのshell環境で、IBM Cloudのサービスリソースの作成や編集、操作をするために必要なCLIなどが事前にセットアップされています。画面右上のシェルアイコンから開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/b5e36ea8-e6a4-9588-37da-860228a307ed.png)


以下のコマンドで、デプロイメントを作成します。
今回デプロイするアプリケーション：websphere-liberty
レプリカ数は３に指定しました。

```
kubectl create deployment websphere-liberty --image=websphere-liberty -r=3 
```



### 3. Serviceの作成
アプリケーションを公開するために、作成したデプロイメントのサービスを作成します。

```
kubectl expose deployment/websphere-liberty --name websphere-liberty --port 80 --target-port 9080
```


### 4. Ingressを使って、外部からアクセスできるようにする
外部からアプリケーションにアクセスできるように、Ingressを作成します。
IBM Cloud Kubernetes Serviceでは、クラスターごとに専用のアプリケーション公開用URLが提供されているので、今回はそちらを利用します。

提供されたドメイン名、TLSシークレットなどを確認する為、以下のコマンドでクラスターの情報を表示します。
```
ibmcloud ks cluster get --cluster　クラスター名|grep Ingress
```
以下の内容が出力されました。
```
Ingress Subdomain:              XXXXXX.eu-de.containers.appdomain.cloud
Ingress Secret:                 YYYYYY
Ingress Status:                 healthy
Ingress Message:                All Ingress components are healthy.
```


出力結果を元に、以下のIngressファイルを作成します
```
vi ingress.yaml　
```

Ingressリソースファイルの中身：
```
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: websphereIngress
spec:
  tls:
  - hosts:
    - webapp.XXXXXX.eu-de.containers.appdomain.cloud
    secretName: YYYYYY
  rules:
  - host: webapp.XXXXXX.eu-de.containers.appdomain.cloud
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: websphere-liberty 
            port:
              number: 80
```



作成したIngressファイルを適用します。
```
kubectl apply -f ingress.yaml　
```


### 5.外部からアクセスできるか確認
クラスターのドメイン webapp.XXXXXX.eu-de.containers.appdomain.cloudをブラウザで開いて、コンテナアプリにアクセス出来るか見てみます。

![スクリーンショット 2023-12-13 15.12.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/bbc9bc58-e7b3-fdf1-4f99-029ddfdd5fff.png)

表示されました！
IBM Kubernetes Serviceが提供しているドメインを利用して、アプリケーションを公開することができました。



# Red Hat OpenShift on IBM Cloud
Red Hat OpenShiftとは、エンタープライズ対応の Kubernetes コンテナ・プラットフォームで、コンテナの開発、運用に必要な高度なツール類も提供します。Red Hat OpenShift on IBM Cloudは、そのOpenShiftをマネージドサービスとして提供します。

## 【アーキテクチャ】
![スクリーンショット 2023-12-21 15.28.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/93511e9f-ac4b-1831-70a6-f96531e59982.png)


## 【料金体系(VPC)】
Red Hat OpenShift on IBM Cloudは、主に作成するクラスターのサイズ(ワーカーノードのスペックと台数)と、OpenShift Container Platform (OCP) ライセンスの有無によって値段が決まります。

* ワーカーノード
    * 選択したマシンタイプと合計稼働台数に対して課金が発生
    * 仮想サーバーは時間課金
    * OpenShift Container Platform (OCP) ライセンスの有無によってワーカーノードの課金金額が変わります。
        * Cloud Paksに含まれるOCPライセンスの持ち込みも可能
* サブネットIPアドレス
    * Floating IPの費用が発生（月課金）
* ロード・バランサー
    * Load Balancer for VPC の費用が発生（時間課金）
* パブリックアウトバウンド利用料金
    * データ通信量に応じて課金発生
* ストレージ
    * イメージレジストリ用に、オブジェクトストレージが使用される
    
(Classicの料金体系は今回は記載しておりません)

## 【触ってみた】
### 目標：クラスターにアプリケーションをデプロイし、インターネットからアクセスできるようにする。

構成イメージ
![スクリーンショット 2023-12-21 14.07.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/3142a214-c286-9cb2-b9a0-fa7732d09be7.png)
### 1. VPCにクラスターを作成
クラスターの作成画面
![スクリーンショット 2023-12-18 12.24.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/34915929-317c-d7cf-4e2c-c1e3587f8244.png)
選択した構成は以下の通りです。
* インフラストラクチャー：VPC
* ワーカーゾーン：シングルゾーン
* ワーカーノード：2台
* OpenShift Container Platform (OCP) ライセンス：ライセンスの購入
* フレーバー(ノードに利用されるサーバーのスペック)：bx2.4x16(4vCPU,16GBメモリ)
* サービスエンドポイント：public・private

### 2. CLIでクラスターにログイン
OpenShiftのクラスターにログインする際は、ocコマンドを利用します。tokenを取得するために、まずRed Hat OpenShift Web コンソールにアクセスします。

2-1. クラスター画面右上の「OpenShift Web コンソール」をクリック
![スクリーンショット 2023-12-18 12.09.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/1fe3368e-2d5f-b9a5-3ad5-ee44be1a3c95.png)
新しいタブで、このような画面が表示されます。
![スクリーンショット 2023-12-18 12.42.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/0cc574ad-10d6-b378-db50-a267b4f41770.png)
2-2. 右上の「IAM...」のプルダウンを表示し、「ログインコマンドのコピー」をクリックします。
![スクリーンショット 2023-12-18 12.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/103fd1bd-d180-a0ec-3fd6-5e4911bda774.png)

2-3. 新しいタブに「Display Token」の文字が出てくるので、文字をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/5209e30a-6603-8e76-ee01-68753fa15a4f.png)

2-4. Log in with this tokenというところに表示されるocコマンドをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/7bec1153-8ded-85cd-caca-abfc31675929.png)

2-5. IBM Cloud Portalのクラスター画面にもどり、Cloud Shellを開きます。コピーしたtokenをペーストします。
![スクリーンショット 2023-12-18 12.58.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/05bcc397-2040-dd91-c5dc-794818514130.png)

CLIでクラスターへのログインができました。

### 3. アプリケーションをクラスターにデプロイ
Red Hat OpenShift on IBM Cloud クラスターにアプリケーションを作成します。


3-1. プロジェクトを作成
今回試すアプリケーション用のプロジェクトを作成します。
```
oc new-project haruna
```
3-2. プロジェクトにアプリケーションを作成
```
oc new-app --image websphere-liberty --name webapp
```
このコマンドで、イメージを元に、アプリケーションに必要なコンポーネント(デプロイメントとサービス)も作成してくれます。

＜出力例＞
```
--> Found container image 812d841 (4 days old) from Docker Hub for "websphere-liberty"

    * An image stream tag will be created as "webapp:latest" that will track this image

--> Creating resources ...
    imagestream.image.openshift.io "webapp" created
    deployment.apps "webapp" created
    service "webapp" created
--> Success
    Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
     'oc expose service/webapp' 
    Run 'oc status' to view your app.
 ```
デプロイメントとサービスも作成されていることがわかります。


### 4. ルートの作成
続いて、アプリケーションを公開するために、ルートを作成します。
Red Hat OpenShift では、アプリケーションが必要とする TLS 終端処理のタイプに基づいて、[4 つのタイプの経路](https://cloud.ibm.com/docs/openshift?topic=openshift-openshift_routes#route-types)を利用できます。今回は、エッジルートを作成します。

```
oc create route edge --service webapp --port 9080
```
以下の通り返答が来ました。
```
route.route.openshift.io/webapp created
```
ルートが作成されました。

### 5. 外部からアクセスできるか確認
以下のコマンドで、ルートの情報を出力します。
```
oc get route 
```
＜出力例＞
```
NAME     HOST/PORT                                                     PATH   SERVICES   PORT   TERMINATION   WILDCARD
webapp   webapp-haruna.XXXXXX.eu-de.containers.appdomain.cloud         webapp     9080   edge          None

```

出力されたホスト名に`https://`をつけてブラウザからアクセスしてみます。
```
https://webapp-haruna.XXXXXX.eu-de.containers.appdomain.cloud
```
![スクリーンショット 2023-12-21 16.18.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3523945/589638ce-e2eb-51c7-afa1-8b25e0373fb1.png)

アクセスが出来ました！