【IBM Cloud】IBM Cloud Kubernetes ServiceログデータをIBM Cloud Logsに送るための設定の流れ

## はじめに
今回の記事ではIBM Cloud Kubernetes Service（IKS）のログデータをIBM Cloud Logsに送るための設定についてまとめています。すでにIBM Cloud Logsのインスタンスを作成していることを前提としていますので、必要に応じて以下の記事もご参考ください。
[①【IBM Cloud】 Log AnalysisからCloud LogsへのLogs Routingサービス変更の流れ](https://qiita.com/Sungyun_Moon/items/1a51879fd2fd478ec84d)
[②【IBM Cloud】 Activity TrackerからCloud LogsへのActivity Tracker Event Routing設定変更の流れ](https://qiita.com/Sungyun_Moon/items/445f44bbbffa975c2905)
[③【IBM Cloud】 Log AnalysisからCloud Logsへのマイグレーションの流れ](https://qiita.com/Sungyun_Moon/items/f3a2ea36eae12c9da7e6)
[④【IBM Cloud】IBM Cloud LogsダッシュボードでTCO Optimizerを構成してみた](https://qiita.com/Sungyun_Moon/items/03a103e937a0bca163cb)
[⑤【IBM Cloud】IBM Cloud LogsのAlert機能ため、Event Notificationsと統合してみた](https://qiita.com/Sungyun_Moon/items/992c036551f7290ef44e)

今回の内容にはIBM Cloudの[アカウント](https://cloud.ibm.com/docs/account?topic=account-accounts)（無料利用可能）も前提となっています。
なお、今回の検証はMacにて実施しています。

## 設定の流れ
### IBM Cloud Kubernetes Serviceクラスターの作成
まずはCloud Logsにログを送る主体となるIBM Cloud Kubernetes Serviceのクラスターを作成します。

[IBM Cloudコンソール](https://cloud.ibm.com/)にアクセスし、ナビゲーションメニューをクリックして`Kubernetes`→`クラスター`にアクセスします。
![スクリーンショット 2023-08-09 17.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/da351ab1-b9f2-5d4b-3f07-42eb4a5de1d1.png)
![スクリーンショット 2023-08-09 17.05.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/ec3968fb-6eb5-b119-5896-e93817c325d9.png)

右上の`クラスターの作成`をクリックします。
![スクリーンショット 2023-08-09 17.05.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/f32db8c7-99bd-9450-9ad0-6917defd5536.png)

クラスターのインフラ設定を行います。インフラの種類にはVPCとClassicの２種類があるので、必要に応じて適宜選択します。また、その他リソースグループの設定やリージョンの設定を行います。
![スクリーンショット 2023-08-09 17.07.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/608317f4-b44f-a70b-501f-3b83e81b1619.png)

その後、Kubernetesのバージョン選択や、スペック（フレーバー）を選択します。そのほかAdd onなどを設定し、全ての選択が終わったら`作成`ボタンにてインスタンスを作成します。
以下の画像では最小スペックになっていますが、実際には`2vCPU、16GBメモリー`でうまくデプロイできました。
![スクリーンショット 2023-08-09 17.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/b2c06dcd-e5ac-888b-0751-fa2a7c24a2c5.png)

:::note warn
上記の通り、今回画像では最小スペックとして`2vCPU、4GBメモリー`にしていますが、デプロイの際メモリーが不足しているとのエラーが表示され、デプロイできない現象がありました。
複数回ワーカーノードのスペックを上げた結果、`2vCPU、16GBメモリー`でデプロイできましたので、必ず余裕を持ったクラスターを作成ください。
(IBM Cloud Docsに最小要件が記載なかったため、この段階でかなり苦戦しました)
:::

### Kubernetesクラスターに接続
Kubernetesクラスターを作成したらターミナルにてクラスターに接続します。クラスター接続のためにまずはIBM Cloudにログインします。
IBM Cloud右上のプロフィールアイコンをクリックし、`CLIとAPIにログイン`をクリックしますと、以下のログインCLIが表示されます。IBM Cloud CLIをコピーしターミナルにコマンド入力することで簡単にログインできます。
また、必要に応じてリージョンを選択しますが、今回は東京（jp-tok）で実施しています。
![スクリーンショット 2023-01-27 14.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/85389613-4b70-eda8-43d4-a0da1211064c.png)
![スクリーンショット 2023-01-27 14.52.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/04c3ad3e-31da-6abc-804c-506a5536429d.png)
```shell:結果
moonsy@moon ~ % ibmcloud login -a https://cloud.ibm.com -u passcode -p xxxxxxxxxx
API エンドポイント: https://cloud.ibm.com
認証中です...
OK

ターゲットのアカウント itz-cp-jpn (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx


リージョンを選択します (または Enter キーを押してスキップします):
1. au-syd
2. in-che
3. jp-osa
4. jp-tok
5. eu-de
6. eu-es
7. eu-gb
8. ca-tor
9. us-south
10. us-south-test
11. us-east
12. br-sao
数値を入力してください> 4
ターゲットのリージョン jp-tok


API エンドポイント:   https://cloud.ibm.com
Region:               jp-tok
ユーザー:             S.Moon@ibm.com
アカウント:           itz-cp-jpn (xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx) <-> xxxxxxx
リソース・グループ:   リソース・グループがターゲットになっていません。'ibmcloud target -g RESOURCE_GROUP' を使用してください
```

IBM Cloud Kubernetes Serviceのコマンド実行のためには、IKSのCLIプラグインをインストールする必要があります。もしインストールされていない場合は、以下のコマンドを実行しCLIをインストールします。
IKS CLIを利用できるようになったら、`kubectl`コマンドを実行することができます。
今回私はすでにIKS CLIがインストールされていたため、以下のような結果でした。
```
ibmcloud plugin install ks
```
```shell:結果
moonsy@moon ~ % ibmcloud plugin install ks
リポジトリー 'IBM Cloud' から 'ks' を検索しています...
プラグイン 'container-service[kubernetes-service/ks] 1.0.674' がリポジトリー 'IBM Cloud' 内で見つかりました
プラグイン 'container-service[kubernetes-service/ks] 1.0.579' は既にインストールされていました。 'container-service[kubernetes-service/ks] 1.0.674' で更新しますか? [y/N] > y
バイナリー・ファイルをダウンロードしようとしています...
 30.00 MiB / 30.00 MiB [======================================================================================================================] 100.00% 0s
31456738 バイトがダウンロードされました
バイナリーをインストールしています...
OK
プラグイン 'container-service 1.0.674' は /Users/moonsungyun/.bluemix/plugins/container-service に正常にインストールされました。 'ibmcloud plugin show container-service' を使用して詳細を表示してください。
```

インストールが完了し、`kubectl`コマンドが利用可能になりましたら、上記で作成したKubernetesクラスターに接続するために以下のコマンドに実行します。
なお、`cluster_name`には以下のクラスターIDを利用することも可能です。
![スクリーンショット 2023-08-09 17.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/b21d2f5f-74f0-40c2-f3e9-278bc26b04b9.png)
```
ibmcloud ks cluster config --cluster <cluster_name>
```
```shell:結果
moonsy@moon ~ % ibmcloud ks cluster config --cluster xxxxxxxxxxxxxxxxxxx
OK
xxxxxxxxxxxxxxxxxxx の構成は正常にダウンロードされました。

csumuk4t06fvg6slhv4g のコンテキストを現在の kubeconfig ファイルに追加しました。
You can now run 'kubectl' commands against your cluster. For example, run 'kubectl get nodes'
```
### APIキーの作成
次は、デーモンセットとして利用するロギングエージェントをインストールするために、APIキーを作成します。デーモンセットとは、Kubernetesクラスター内の各ノードで特定のPodが常に実行されるように保証する役割を果たすワークロードリソースですが、ここではロギングエージェントをデーモンセットとして利用します。

まずは以下のコマンドにてサービスIDを作成します。
なお、--descriptionの設定文は変更可能ですので、適宜変更しても問題ございません。
```
ibmcloud iam service-id-create kubernetes-logs-agent --description "Service ID for sending logs from IKS"
```
```shell:結果
moonsy@moon ~ % ibmcloud iam service-id-create kubernetes-logs-agent --description "Service ID for sending logs from IKS"
S.Moon@ibm.com として 現行アカウント にバインドされるサービス ID kubernetes-logs-agent を作成しています...
OK
サービス ID kubernetes-logs-agent が正常に作成されました
             
ID           ServiceId-d9c2718e-e7df-4afa-a2ea-0d0e4239778f
名前         kubernetes-logs-agent
説明         Service ID for sending logs from IKS
CRN          crn:v1:bluemix:public:iam-identity::a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx::serviceid:ServiceId-xxxxxx-xxxxxx-xxxxxx-a2ea-xxxxxxxxxxxxx
バージョン   1-8c23737d8a5db0dce71c767e6e4b5fff
ロック中     false
```
サービスIDが作成されましたら、エージェントから直接IBM Logsにログを送信するように設定します。
その際は、Trusted ProfileがIBM Cloud Logsサービスの`Sender`ロールを持つ必要があるため、以下のコマンドを実行して、作成したサービスIDにIBM Cloud Logsの`Sender`ロールを付与します。

```
ibmcloud iam service-policy-create kubernetes-logs-agent --service-name logs --roles Sender
```
```shell:結果
moonsy@moon ~ % ibmcloud iam service-policy-create kubernetes-logs-agent --service-name logs --roles Sender
S.Moon@ibm.com としてサービス ID kubernetes-logs-agent の 現行アカウント にポリシーを作成しています...
OK
サービス・ポリシーは正常に作成されます

               
ポリシー ID:   xxxxxxxx-ae7d-xxxxxxxx-a850-xxxxxxxxxxxxxxxx
バージョン:    1-4dbdce8319aceeca6163a67919a8f2f9
役割:          Sender
リソース:                   
               サービス名   logs
```

次は以下のコマンドを実行してAPIキーを作成します。APIキーの作成の際には必要に応じてキー名（kubernetes-logs-agent-apikey）と説明（--d）をカスタマイズできますので、適宜変更してください。
また、APIキーを作成するたびに新しいIAMシークレットが生成されるようになります。APIキーには機密情報が含まれているため保管に注意してください。
```
ibmcloud iam service-api-key-create kubernetes-logs-agent-apikey kubernetes-logs-agent --description "API key for sending logs to the IBM Cloud Logs service"
```
```shell:結果
moonsy@moon ~ % ibmcloud iam service-api-key-create kubernetes-logs-agent-apikey kubernetes-logs-agent --description "moon-API key for sending logs to the IBM Cloud Logs service"
S.Moon@ibm.com としてアカウント 27dc483dc1f14d2f821e8b3a4193ad13 にサービス ID kubernetes-logs-agent の API キー kubernetes-logs-agent-apikey を作成しています...
OK
サービス ID API キー kubernetes-logs-agent-apikey が作成されます

API キーを保存してください。 作成後に取得することはできません。
                     
ID                   ApiKey-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
名前                 kubernetes-logs-agent-apikey
説明                 moon-API key for sending logs to the IBM Cloud Logs service
ロック中             false
CRN                  crn:v1:bluemix:public:iam-identity::a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx::apikey:ApiKey-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
バージョン           1-97fec7b99753a5bdfb14fbb39cac7091
Disabled             false
Leaked               false
Action when leaked   disable
Session supported    false
API キー             iE_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```
### エンドポイントの確認
APIキーを作成したら、次はIBM Cloud Logsインスタンスをマウントする際に必要とされるため取り込みエンドポイントを確認します。以下のコマンドを実行し、エンドポイントを確認します。
```
ibmcloud resource service-instances --service-name logs --long --output JSON | jq '[.[] | {name: .name, id: .id, region: .region_id, ingestion_endpoint: .extensions.external_ingress}]'
```
```shell:結果
moonsy@moon ~ % ibmcloud resource service-instances --service-name logs --long --output JSON | jq '[.[] | {name: .name, id: .id, region: .region_id, ingestion_endpoint: .extensions.external_ingress}]'
[
  {
    "name": "Cloud Logs-common",
    "id": "crn:v1:bluemix:public:logs:eu-es:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxxxxxxxxx::",
    "region": "eu-es",
    "ingestion_endpoint": "xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.ingress.eu-es.logs.cloud.ibm.com"
  },
  {
    "name": "Logs-common-osa",
    "id": "crn:v1:bluemix:public:logs:jp-osa:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxxxxxxxxx::",
    "region": "jp-osa",
    "ingestion_endpoint": "xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.ingress.jp-osa.logs.cloud.ibm.com"
  },
  {
    "name": "Logs-investigation-tor",
    "id": "crn:v1:bluemix:public:logs:ca-tor:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxxxxxxxxx::",
    "region": "ca-tor",
    "ingestion_endpoint": "xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.ingress.ca-tor.logs.cloud.ibm.com"
  },
  {
    "name": "Logs-common-tok",
    "id": "crn:v1:bluemix:public:logs:jp-tok:a/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx:xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxx-xxxxxxxxxxxxxx::",
    "region": "jp-tok",
    "ingestion_endpoint": "xxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.ingress.jp-tok.logs.cloud.ibm.com"
  }
]
```

### エージェントYAMLファイルの作成
次は、エージェント・デーモンセットを構成するために使用するYAMLファイルを作成します。
本来は別途用意されていたYAMLファイルをダウンロードし、コードを修正して実行させる必要がありましたが、現在はHelmチャートを使ったデプロイが可能になりましたので、その方法を記載しています。

まず、Container Registryの利用可能な最新バージョンを確認するために、以下のコマンドを実行します。
当然ですが、最も数字が大きいものが最新版となります。今回は`1.4.2`が最新でした。
```
ibmcloud cr images --restrict ibm/observe/logger-agent-plugin
```
```shell:結果
moonsy@moon ~ % ibmcloud cr images --restrict ibm/observe/logger-agent-plugin
イメージをリストしています...

リポジトリー                             タグ    ダイジェスト   名前空間   作成日          サイズ   セキュリティー状況
icr.io/ibm/observe/logger-agent-plugin   1.0.0   e37324ab54e0   ibm        1 year ago      77 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.0.1   ac53710f048e   ibm        1 year ago      77 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.0.2   9d7eeb343eac   ibm        1 year ago      94 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.0.3   801f6a859e7a   ibm        11 months ago   94 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.0.4   56a53b9a3f9b   ibm        10 months ago   98 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.0.5   504d0ba2fbac   ibm        9 months ago    104 MB   -
icr.io/ibm/observe/logger-agent-plugin   1.1.0   a7b8c3e61d2a   ibm        8 months ago    104 MB   -
icr.io/ibm/observe/logger-agent-plugin   1.1.1   80b538cf5a90   ibm        7 months ago    106 MB   -
icr.io/ibm/observe/logger-agent-plugin   1.2.0   886882f03ed0   ibm        6 months ago    91 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.2.2   0e4a7fbbf01c   ibm        6 months ago    97 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.2.3   92163c1328aa   ibm        5 months ago    97 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.2.4   ead481b07a5d   ibm        4 months ago    90 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.3.0   eec0d4e506c7   ibm        3 months ago    102 MB   -
icr.io/ibm/observe/logger-agent-plugin   1.3.1   85e898de7a0a   ibm        2 months ago    95 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.3.2   e28137e4efa3   ibm        2 months ago    100 MB   -
icr.io/ibm/observe/logger-agent-plugin   1.3.3   32d6baf536eb   ibm        1 month ago     100 MB   -
icr.io/ibm/observe/logger-agent-plugin   1.4.0   da3551277c49   ibm        3 weeks ago     94 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.4.1   0611deda14df   ibm        3 weeks ago     94 MB    -
icr.io/ibm/observe/logger-agent-plugin   1.4.2   a0fd33299651   ibm        5 days ago      94 MB    -

OK

```

次は、`logs-values.yaml`名前のYAMLファイルを以下の内容で作成します。

```
metadata:
  name: "logs-agent"
image:
  version: "1.4.2"  # required

clusterName: ""     # Enter the name of your cluster. This information is used to improve the metadata and help with your filtering.

env:
  # ingestionHost is a required field. For example:
  # ingestionHost: "<logs instance>.ingress.us-east.logs.cloud.ibm.com"
  ingestionHost: "" # required

  # If you are using private CSE proxy, then use port number "3443"
  # If you are using private VPE Gateway, then use port number "443"
  # If you are using the public endpoint, then use port number "443"
  ingestionPort: "" # required

  iamMode: "IAMAPIKey or TrustedProfile"
  # trustedProfileID - trusted profile id - required for iam trusted profile mode
  trustedProfileID: "Profile-yyyyyyyy-xxxx-xxxx-yyyy-zzzzzzzzzzzz" # required if iamMode is set to TrustedProfile
```

:::note
今回の入力項目
- image：最新バージョンの`1.4.2`
- ingestionHost：上記で確認したTOKの`ingress endpoint`
- iamMode：上記で発行した`IAMAPIKey`
    - IAMAPIKeyの場合は"`IAMAPIKey`"と記載するだけですが、もしTrustedProfileを利用する場合には、ProfileIDまで記載する必要があります。
:::

### デーモンセットのデプロイ
上記で作成したAPIキー、エンドポイントURL、変更済みYAMLファイルが揃いましたら、これをもってデーモンセットのデプロイを実施します。
まずは以下のコマンドを実行し、Container RegistryのCLIをインストールします。私はすでにインストールされているので、以下のような結果となります。
```
ibmcloud plugin install cr
```
```shell:結果
moonsy@moon ~ % ibmcloud plugin install cr
リポジトリー 'IBM Cloud' から 'cr' を検索しています...
プラグイン 'container-registry[cr] 1.3.12' がリポジトリー 'IBM Cloud' 内で見つかりました
プラグイン 'container-registry[cr] 1.3.4' は既にインストールされていました。 'container-registry[cr] 1.3.12' で更新しますか? [y/N] > y
バイナリー・ファイルをダウンロードしようとしています...
 11.79 MiB / 11.79 MiB [======================================================================================================================] 100.00% 0s
12358194 バイトがダウンロードされました
バイナリーをインストールしています...
OK
プラグイン 'container-registry 1.3.12' は /Users/moonsungyun/.bluemix/plugins/container-registry に正常にインストールされました。 'ibmcloud plugin show container-registry' を使用して詳細を表示してください。
```
次はContainer Registryのリージョンを選択します。今回はGlobalに設定しています。
```
ibmcloud cr region-set global
```
```shell:結果
moonsy@moon ~ % ibmcloud cr region-set global
地域は「global」に設定されました。地域は「icr.io」です。

OK
```

また、Helmがインストールされているか確認します。
Helmがインストールされていない場合には、[手順に従って](https://helm.sh/docs/intro/)自分のPCなどの開発環境にHelmをインストールします。（2024/12/18現在、v3.13.1で作業しました。）

インストールが完了したら、コマンドにてHelmのバージョンを確認します。
```shell:Helmのバージョン確認
helm version
```

```shell:Helmのバージョン確認結果
version.BuildInfo{Version:"v3.13.1", GitCommit:"472c5736ab01133de504a826bd9ee12cbe4e7904", GitTreeState:"clean", GoVersion:"go1.18.10"}
```

最後に以下のコマンドを実行し、デーモンセットをデプロイします。値はすでに取得したものに適宜置き換えてください。
- `install-name` はHelmのインストール名（例えば'logging-agent）
- `chart-version` はヘルムチャートのバージョン（今回は`1.4.2`）
- `PATH` は `logs-values.yaml`ファイルがあるディレクトリパス
- `APIKey-value` は、上記で作成したServiceIDに関連するIAM apikey

```
helm install <install-name> oci://icr.io/ibm/observe/logs-agent-helm --version <chart-version> --values <PATH>/logs-values.yaml -n ibm-observe --create-namespace --set secret.iamAPIKey=<APIKey-value>
```

```shell:結果
Pulled: icr.io/ibm/observe/logs-agent-helm:1.4.2
Digest: sha256:d2065465b3de3b79929817905b74d69345934a6792829d9153cea73718d09d78
NAME: logging-agent
LAST DEPLOYED: Wed Dec 18 18:42:57 2024
NAMESPACE: ibm-observe
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The agent for IBM Cloud Logs is starting up on each node in your cluster.
Logs will start to appear in your instance in a minute.

To verify the agents are started, run:
  $ kubectl -n ibm-observe get ds logs-agent

Some changes to the configuration may require the pods to be restarted:
  $ kubectl -n ibm-observe rollout restart ds/logs-agent 
```
問題なくデプロイされた場合、`ibm-observe`というポッドが作成されるはずです。
インストールが完了したら、以下のコマンドにてポッドが正常に作成され稼働しているか確認します。
エラーが出ていた時には`READY`項目が`0/1`のままで`RESTARTS`が永遠と増えていました。
```
kubectl get pods -n ibm-observe
```
```shell:結果
moonsy@moon ~ % kubectl get pods -n ibm-observe
NAME               READY   STATUS    RESTARTS   AGE
logs-agent-lvv6w   1/1     Running   0          22s
```
### 結果確認
前提のCloud Logsのダッシュボードにアクセスし、左のカテゴリーにて`▶ Livetail`をクリックします。その後、`Start`をクリックするとリアルタイムでログを確認することができます。
![スクリーンショット 2024-12-19 14.15.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/cadb9854-6c16-73ca-acf3-a69d5eb2eea6.png)
また、ダッシュボードからもデプロイされたエージェントを確認することができます。
![スクリーンショット 2024-12-19 14.16.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/bf2cc921-1c1f-da06-1759-c96329669374.png)
最後にCloud Logsと連携されているObject Storageにもログファイルが入ってくることが確認できます。
![スクリーンショット 2024-12-19 14.17.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/34894ee3-a54d-8a1e-6ddd-71a1ef75b868.png)

## 間違いやすいポイントとその対策
検証にあたって間違いやすいと思うポイントや解決策を何点か記載します。
#### 1. Kubernetesクラスターのスペック不足
上記の内容にも記載していますが、最初クラスターのスペックを`2vCPU、4GBメモリー`で作成しましたが、メモリー不足のエラーが何度も表示されました。エージェントのデプロイだったためメモリー容量があまり必要ないと思っていましたが、デフォルトで入る各種機能がメモリーを占めてしまうため、`16GBメモリー以上`の環境を用意する必要があります。

#### 2. YAMLファイル作成時、Cloud LogsのIngress Endpointの記載間違い
今回の検証で使ったKubernetesクラスターは外部からアクセスができない`プライベートエンドポイントクラスター`でした。そのため、以下のようにIngress Endpointもprivateを使用しましたが、こちらはpublicに設定する必要があります。
例）
```
(⭕️)<logs instance>.ingress.jp-tok.logs.cloud.ibm.com
(❌)<logs instance>.ingress.private.jp-tok.logs.cloud.ibm.com
```
なお、上記のIngress Endpointをpublicにすることによって、ingestionPortもpublicの`443`を使用する必要があります。

```
(⭕️)ingestionPort: "443" # required
(❌)ingestionPort: "3443" # required
```
Ingress Endpointを間違えると、宛先のingressに辿り着けず、Cloud Logsにログが送れなくなります。

また、YAMLファイルのインデント間違いによってもうまく稼働しないので、ご注意ください。

#### 3. IBM Cloud セキュリティーグループの設定
セキュリティーグループの設定の中、外部にアクセスできるルール設定ができていませんでした。
それにより、セキュリティーグループでインターネット経由のIAM認証が弾かれていたのにAPI Key(もしくはTrusted Profile)が認証できず、Podを立ち上げることができなくなりLoopBackが発生していました。
セキュリティーグループはホワイトリスト形式なので、ルール設定を行わないと外部へのアクセスは許可されない仕様です。そのため、接続先がクラスターに紐づいているセキュリティーグループのルールを変更することによって解決しています。

![スクリーンショット 2024-12-19 14.29.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/83560c6e-e685-72aa-ac5d-5a8c71139da4.png)

#### 4. クラスターの状況の確認方法
以下のコマンドにてクラスターのStatusの確認ができます。
```
kubectl get pods -n ibm-observe -o wide
```
```shell:結果
moonsy@moon ~ % kubectl get pods -n ibm-observe -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP              NODE         NOMINATED NODE   READINESS GATES
logs-agent-xxxxx   1/1     Running   0          19h   xxx.xx.xxx.xx   xx.xx.x.xx   <none>           <none>
```
また、以下のコマンドにて、クラスターのログをリアルタイムで確認できます。
もしエラーが出ている場合、下端の`flush backlog chunk`の後ろに`Succeeded`がつかず、エラー内容が表示されるようになります。
```
kubectl logs `POD_NAME` -n ibm-observe
```
```shell:結果
moonsy@moon ~ % kubectl logs logs-agent-xxxxx -n ibm-observe
Defaulted container "fluent-bit" out of: fluent-bit, create-db-dir (init)
Fluent Bit v3.1.9-ibm
* Copyright (C) 2015-2024 The Fluent Bit Authors
* Fluent Bit is a CNCF sub-project under the umbrella of Fluentd
* https://fluentbit.io

______ _                  _    ______ _ _           _____  __  
|  ___| |                | |   | ___ (_) |         |____ |/  | 
| |_  | |_   _  ___ _ __ | |_  | |_/ /_| |_  __   __   / /`| | 
|  _| | | | | |/ _ \ '_ \| __| | ___ \ | __| \ \ / /   \ \ | | 
| |   | | |_| |  __/ | | | |_  | |_/ / | |_   \ V /.___/ /_| |_
\_|   |_|\__,_|\___|_| |_|\__| \____/|_|\__|   \_/ \____(_)___/

Registering the logger-icl-output-plugin with commitSHA: 5e29045cd8b22d994a4ab6e1afc292219f95a680
[2024/12/18 09:43:04] [ info] [fluent bit] version=3.1.9-ibm, commit=, pid=1
[2024/12/18 09:43:04] [ info] [storage] ver=1.5.2, type=memory+filesystem, sync=normal, checksum=off, max_chunks_up=192
[2024/12/18 09:43:04] [ info] [storage] backlog input plugin: storage_backlog.1
[2024/12/18 09:43:04] [ info] [cmetrics] version=0.9.6
[2024/12/18 09:43:04] [ info] [ctraces ] version=0.5.6
[2024/12/18 09:43:04] [ info] [input:tail:tail.0] initializing
[2024/12/18 09:43:04] [ info] [input:tail:tail.0] storage_strategy='filesystem' (memory + filesystem)
[2024/12/18 09:43:04] [ info] [input:tail:tail.0] multiline core started
[2024/12/18 09:43:04] [ info] [input:tail:tail.0] db: delete unmonitored stale inodes from the database: count=1
[2024/12/18 09:43:04] [ info] [input:storage_backlog:storage_backlog.1] initializing
[2024/12/18 09:43:04] [ info] [input:storage_backlog:storage_backlog.1] storage_strategy='memory' (memory only)
[2024/12/18 09:43:04] [ info] [input:storage_backlog:storage_backlog.1] queue memory limit: 95.4M
[2024/12/18 09:43:04] [ info] [filter:kubernetes:kubernetes.0] https=1 host=kubernetes.default.svc port=443
[2024/12/18 09:43:04] [ info] [filter:kubernetes:kubernetes.0]  token updated
[2024/12/18 09:43:04] [ info] [filter:kubernetes:kubernetes.0] local POD info OK
[2024/12/18 09:43:04] [ info] [filter:kubernetes:kubernetes.0] testing connectivity with Kubelet...
[2024/12/18 09:43:05] [ info] [filter:kubernetes:kubernetes.0] connectivity OK
{"level":"info","ts":"2024-12-18T09:43:05.01966866Z","logger":"logs-router-icl-output-plugin","caller":"internal/logger-icl-output-plugin-impl.go:95","msg":"Initializing the plugin","ID":"logs-router-icl-output-plugin"}
{"level":"info","ts":"2024-12-18T09:43:05.019752411Z","logger":"logs-router-icl-output-plugin","caller":"internal/logger-icl-output-plugin-impl.go:101","msg":"maximum payload size in bytes","#":2097152}
{"level":"info","ts":"2024-12-18T09:43:05.019854709Z","logger":"logs-router-icl-output-plugin","caller":"internal/logger-icl-output-plugin-impl.go:137","msg":"Using IAM Token Manager to authenticate.","authentication mode: ":"IAMAPIKey"}
INFO: token.go:373: [Transaction-Id: 0ddff58d-6446-4b18-9faf-51173c3fa67b] Akamai-GRN Header: 0.051fd517.1734514985.b0c2e5b8
{"level":"info","ts":"2024-12-18T09:43:05.211086399Z","logger":"logs-router-icl-output-plugin","caller":"plugin/logger-icl-output-plugin.go:102","msg":"Starting Plugin","ID":"logs-router-icl-output-plugin"}
[2024/12/18 09:43:05] [ info] [output:logger-icl-output-plugin:logger-icl-output-plugin.0] worker #1 started
[2024/12/18 09:43:05] [ info] [output:logger-icl-output-plugin:logger-icl-output-plugin.0] worker #2 started
[2024/12/18 09:43:05] [ info] [output:logger-icl-output-plugin:logger-icl-output-plugin.0] worker #0 started
[2024/12/18 09:43:05] [ info] [output:logger-icl-output-plugin:logger-icl-output-plugin.0] worker #1 started
[2024/12/18 09:43:05] [ info] [output:logger-icl-output-plugin:logger-icl-output-plugin.0] worker #3 started
.
.
(省略)
.
.
[2024/12/18 09:43:10] [ info] [engine] flush backlog chunk '1-1734514706.25704021.flb' succeeded: task_id=117, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514706.198421463.flb' succeeded: task_id=119, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514691.252188636.flb' succeeded: task_id=94, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514693.233196617.flb' succeeded: task_id=98, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514692.70858092.flb' succeeded: task_id=96, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514707.194399406.flb' succeeded: task_id=121, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514695.200123417.flb' succeeded: task_id=100, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514708.142653123.flb' succeeded: task_id=123, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514709.212355373.flb' succeeded: task_id=125, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)
[2024/12/18 09:43:11] [ info] [engine] flush backlog chunk '1-1734514696.197685726.flb' succeeded: task_id=104, input=storage_backlog.1 > output=logger-icl-output-plugin.0 (out_id=0)

```
## 参考
- [IBM CLoud Docs](https://cloud.ibm.com/docs/cloud-logs?topic=cloud-logs-kube2logs)