Container Storage Interface (CSI) コンポーネントである csi-plugin と csi-provisioner は、ストレージボリュームの動的プロビジョニング、マウント、アンマウント、サイズ変更などの操作を自動化します。これにより、クラウドディスクや NAS などの Alibaba Cloud ストレージリソースを、ネイティブの Kubernetes リソースのようにシームレスに利用できます。
コンポーネントの概要
コンポーネント
CSI コンポーネントは、デフォルトで Container Service for Kubernetes (ACK) クラスターにインストールされます。csi-plugin と csi-provisioner コンポーネントは連携して、ストレージボリュームのライフサイクルを管理します。
|
コンポーネント |
説明 |
デプロイタイプ |
|
各ノードで実行され、ストレージボリュームのマウントやアンマウント、ファイルシステムのフォーマットなど、ノードレベルの操作を実行します。 |
DaemonSet |
|
|
中央コントローラーとして実行され、ストレージボリュームの動的プロビジョニング、削除、サイズ変更、スナップショット作成を処理します。クラウドディスク、NAS、OSS ストレージボリュームの管理をサポートします。 |
Deployment |
csi-provisioner のマネージドモードとアンマネージドモード
安定性を向上させ、運用オーバーヘッドを削減するために、csi-provisioner はマネージドモードとアンマネージドモードを提供します。新しいクラスターはデフォルトでマネージドモードを使用します。
-
マネージドモード (デフォルト)
コンポーネントの Pod は ACK によって管理され、kube-system 名前空間には表示されません。ACK がコンポーネントを維持し、そのリソースを調整します。 -
アンマネージドモード
コンポーネントの Pod は、kube-system 名前空間に Deployment としてデプロイされます。リソース構成の管理 (Deployment の YAML を変更) や問題のトラブルシューティングは、お客様自身で行う必要があります。
CSI コンポーネントのアップグレード
コンソールの アドオン管理 ページでコンポーネントのバージョンを表示し、アップグレードを実行できます。
アップグレード前のチェック
-
バージョンの互換性の確認:変更履歴 (csi-provisioner、csi-plugin) を参照して、ターゲットの CSI バージョンが現在のクラスターバージョンと互換性があることを確認します。
-
FlexVolume の移行ステータスの確認:クラスターが以前に
csi-compatible-controllerコンポーネントを使用して FlexVolume から CSI に移行した場合、未完了の移行タスクがあると CSI コンポーネントの自動アップグレードがブロックされます。まず移行を完了するか、「コンポーネントのアップグレード」を参照して移行中に手動でアップグレードを実行してください。 -
アップグレード順序の遵守:ストレージコンポーネントには依存関係があります。互換性と安定性を確保するために、次の順序でアップグレードしてください:storage-operator→csi-provisioner→csi-plugin。
アップグレード手順
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、クラスターの名前をクリックします。 左側のナビゲーションウィンドウで、[コンポーネントとアドオン] をクリックします。
-
ボリューム タブをクリックします。
csi-provisionerとcsi-pluginを見つけ、順にアップグレードします。アップグレードに失敗した場合は、「コンポーネントのアップグレード失敗」をご参照ください。
アップグレード後、コンポーネントカードでバージョンが期待通りであることを確認できます。
本番運用時の注意点
-
セキュリティ強化とメタデータアクセスの競合:
csi-pluginコンポーネントは、リージョンやアベイラビリティゾーンなどのノード情報を取得するために、インスタンスメタデータにアクセスする必要があります。メタデータアクセスを無効にすると、コンポーネントの起動に失敗したり、異常に実行されたりします。必要なコンポーネントのバージョンについては、「セキュリティ強化モードでの ECS インスタンスメタデータへのアクセス」をご参照ください。セキュリティグループやノードのセキュリティポリシーを設定する際は、
csi-pluginコンポーネントの Pod がインスタンスメタデータサービスにアクセスできることを確認してください。 -
デフォルトの StorageClass の維持:
ACK は、
alicloud-disk-essdなどのデフォルトの StorageClass オブジェクトを提供します。これらのオブジェクトのprovisionerやparametersなどのプロパティを変更すると、コンポーネントのアップグレードが失敗する可能性があります。
よくある質問
コンポーネントの問題
起動失敗:exec /usr/bin/plugin.csi.alibabacloud.com: exec format error
現象
csi-plugin Pod 内の csi-plugin コンテナの起動に失敗し、ログに exec /usr/bin/plugin.csi.alibabacloud.com: exec format error というエラーが表示されます。
原因
このエラーは通常、CPU アーキテクチャの不一致を示します。しかし、csi-plugin はデフォルトで amd64 と arm64 の両方のアーキテクチャをサポートしています。したがって、サポートされているノードでこのエラーが発生した場合、最も可能性の高い原因は CSI イメージファイルの破損です。
これは、強制シャットダウンなどによってイメージのプルプロセスが中断された場合に発生する可能性があります。これにより、ノード上に不完全なイメージファイルが残ります。イメージのメタデータは存在しますが、バイナリ実行可能ファイルが無効または破損しているため、csi-plugin コンテナが起動できなくなります。
解決策
ストレージコンポーネントの OOM 問題
csi-provisioner コンポーネント Pod のサイドカーコンテナは、Pod、PV、PVC などのリソース情報をキャッシュします。大規模なクラスターでは、これが大量のメモリを消費し、コンテナがメモリ不足 (OOM) エラーを経験する可能性があります。
-
マネージド
csi-provisioner: チケットを起票してお問い合わせください。 -
アンマネージドモードの
csi-provisioner:OOM エラーが発生した場合は、クラスターの規模に応じてリソース制限を調整します。クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、[コンポーネントとアドオン] をクリックします。
-
csi-provisionerコンポーネントを見つけ、
アイコンをクリックし、YAML の表示 をクリックします。 -
コンポーネントの YAML を編集して、クラスターの規模に応じてリソース制限を調整します。
containers: - name: external-disk-provisioner image: registry-vpc.cn-huhexxxx.yuncs.com/acs/csi-provisioner:v3.0.0-080f01e64-aliyun resources: requests: cpu: 10m memory: 16Mi limits: cpu: 500m memory: 1024Mi
csi-plugin の高いネットワークトラフィック
現象
クラスターの Pod モニタリングダッシュボードで、csi-plugin コンポーネントの Pod が高いネットワークトラフィックを示します。
原因
これは想定される動作です。csi-plugin コンポーネントは、ノードへの NAS ストレージボリュームのマウントを管理します。アプリケーション Pod が NAS マウントポイントを介してデータを読み書きすると、その結果生じるネットワークトラフィックは csi-plugin Pod のネットワーク名前空間を通過します。そのため、モニタリングシステムはこのトラフィックを csi-plugin Pod に帰属させます。
解決策
対応は不要です。この現象は無視して問題ありません。トラフィックは会計目的で csi-plugin Pod に帰属されるだけで、実際にはそのリソースを消費せず、トラフィックの二重計上や重複課金も発生しません。これはパフォーマンスに影響を与えないモニタリング上のアーティファクトです。
csi-provisioner コンポーネントのログに failed to renew lease xxx timed out waiting for the condition エラーが報告される
現象
kubectl logs csi-provisioner-xxxx -n kube-system コマンドを実行して CSI のログを表示すると、failed to renew lease xxx timed out waiting for the condition エラーが報告されます。
原因
csi-provisioner コンポーネントは、高可用性のためにマルチレプリカモデルを使用します。一度に 1 つのインスタンスのみがリクエストを処理するようにするため、レプリカはリーダー選出のために Kubernetes のリース (Lease) メカニズムを使用します。このメカニズムは、API サーバーとの安定した通信に大きく依存しています。
このエラーは、csi-provisioner が API サーバーにアクセスできず、リーダー選出プロセスが失敗していることを示します。その結果、どのレプリカもリーダーになれず、サービスを提供できません。
解決策
クラスターのネットワーク接続と API サーバーのステータスを確認してください。問題が解決しない場合は、チケットを送信してください。
コンポーネントのアップグレード失敗
csi-plugin のアップグレード前チェックの失敗
この問題は通常、FlexVolume ストレージプラグインから CSI への移行中に発生します。次のコマンドを実行して、両方のストレージプラグインが共存しているかどうかを確認できます。
kubectl -nkube-system get ds csi-plugin flexvolume
出力が次のようになっている場合:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
csi-plugin 4 4 4 4 4 kubernetes.io/os=linux 7d
flexvolume 4 4 4 4 4 kubernetes.io/os=linux 7d
これは、両方のストレージプラグインが共存していることを示します。
FlexVolume と CSI は共存している間はアップグレードできません。CSI コンポーネントをアップグレードするには、まずすべての FlexVolume PV と PVC を CSI に移行し、その後 FlexVolume コンポーネントをアンインストールします。詳細については、「ストレージクラスターなしで FlexVolume を CSI に移行する」をご参照ください。
これが原因でなく、クラスターに重要なビジネスデータがホストされている場合は、お問い合わせいただき、支援付きの手動アップグレードをリクエストしてください。
事前チェック後の csi-plugin アップグレードの失敗
csi-plugin コンポーネントは DaemonSet としてデプロイされており、すべてのノードが正常な状態であることが必要です。クラスターに NotReady または Running 以外の状態のノードがあると、アップグレードは失敗します。
まず障害のあるノードを修復してから、アップグレードを再試行する必要があります。原因が特定できない場合は、お問い合わせいただき、支援付きの手動アップグレードをリクエストしてください。
コンソールに csi-provisioner が表示されない
csi-provisioner の古いバージョン (1.14 以前) は StatefulSet としてデプロイされます。現在のクラスターに csi-provisioner の StatefulSet インスタンスがまだ存在する場合は、再インストールする前に手動で削除する必要があります (kubectl delete sts csi-provisioner)。
この操作中に問題が発生した場合は、お問い合わせいただき、支援付きの手動アップグレードをリクエストしてください。
csi-provisioner のアップグレード前チェックの失敗
この問題は通常、FlexVolume ストレージプラグインから CSI への移行中に発生します。次のコマンドを実行して、両方のストレージプラグインが共存しているかどうかを確認できます。
kubectl -nkube-system get ds csi-plugin flexvolume
出力が次のようになっている場合:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
csi-plugin 4 4 4 4 4 kubernetes.io/os=linux 7d
flexvolume 4 4 4 4 4 kubernetes.io/os=linux 7d
これは、両方のストレージプラグインが共存していることを示します。
FlexVolume と CSI は共存している間はアップグレードできません。CSI コンポーネントをアップグレードするには、まずすべての FlexVolume PV と PVC を CSI に移行し、その後 FlexVolume コンポーネントをアンインストールします。詳細については、「ストレージクラスターなしで FlexVolume を CSI に移行する」をご参照ください。
これが原因でなく、クラスターに重要なビジネスデータがホストされている場合は、お問い合わせいただき、支援付きの手動アップグレードをリクエストしてください。
事前チェック後の csi-provisioner アップグレードの失敗
お問い合わせいただき、支援付きの手動アップグレードをリクエストしてください。
csi-provisioner アップグレード失敗:ノード数または権限
現象
-
シナリオ 1:
csi-provisionerコンポーネントのアップグレード前チェックが失敗し、クラスターに十分なノードがないことが示されます。 -
シナリオ 2:csi-provisioner コンポーネントの事前チェックとアップグレードは成功します。しかし、コンポーネントの Pod が
CrashLoopBackOff状態になり、ログに403 Forbiddenエラーが表示されます。time="2023-08-05T13:54:00+08:00" level=info msg="Use node id : <?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n <head>\n <title>403 - Forbidden</title>\n </head>\n <body>\n <h1>403 - Forbidden</h1>\n </body>\n</html>\n"
原因と解決策
-
シナリオ 1
-
原因:
csi-provisionerコンポーネントはアクティブ/スタンバイのデプロイモデルを使用しており、その 2 つのレプリカはアンチアフィニティ要件を満たすために異なるノードにスケジュールされる必要があります。単一ノードのクラスターではこのスケジューリング条件を満たせないため、2 番目のレプリカがPending状態のままになり、アップグレードが正常に完了しません。 -
解決策:クラスターに少なくとももう 1 つノードを追加して、複数のレプリカが正しくスケジュールされるようにします。
-
-
シナリオ 2
-
原因:
csi-provisionerコンポーネントは、Alibaba Cloud API を呼び出すために必要なインスタンス ID やリージョンなどの情報を取得するために、ノードのインスタンスメタデータにアクセスする必要があります。ノードでセキュリティ強化が有効になっている場合や、厳格なネットワークポリシーが設定されている場合、メタデータサービスへのアクセスがブロックされる可能性があります。 -
解決策:ノードのセキュリティ強化ポリシーを調整または無効にして、Pod がメタデータサービスにアクセスできるようにします。また、セキュリティグループのルール、OS のファイアウォール設定、および関連するセキュリティスクリプトも確認してください。
-
csi-provisioner アップグレード失敗:StorageClass の変更
現象
csi-provisioner のインストールまたはアップグレードが事前チェックで失敗し、StorageClass のプロパティが期待値を満たしていないことが示されます。
原因
ACK が提供するデフォルトの StorageClass は固定構成であり、provisioner や parameters などのコアフィールドは変更できません。同じ名前の StorageClass を手動で削除して再作成すると、検証に失敗し、コンポーネントのアップグレードプロセスが中断されます。
CSI インストーラーは、一貫したコンポーネントの動作を保証するために、これらのリソースの整合性を厳密に検証します。
解決策
-
クラスターからデフォルトの StorageClass オブジェクト (
alicloud-disk-essd、alicloud-disk-available、alicloud-disk-efficiency、alicloud-disk-ssd、alicloud-disk-topologyを含む) を削除します。この操作は、既存の PV および PVC の通常の使用には影響しません。
-
StorageClass オブジェクトを削除した後、
csi-provisionerを再インストールします。インストーラーが自動的に StorageClass オブジェクトを再作成します。追加の操作は不要です。
カスタムの StorageClass が必要な場合は、常に異なる名前で新しいものを作成してください。デフォルトの StorageClass オブジェクトを変更したり、再作成したりしないでください。
お問い合わせ
手動アップグレードのサポートをリクエストするには、DingTalk でグループ番号 35532895 を検索し、グループに参加して支援を求めてください。
参考資料
-
CSI の詳細については、「alibaba-cloud-csi-driver」をご参照ください。
-
CSI コンポーネントの変更履歴については、「csi-provisioner」および「csi-plugin」をご参照ください。
-
その他のストレージコンポーネントについては、「storage-operator コンポーネントの管理」、「cnfs-nas-daemon コンポーネントの管理」、および「cnfs-controller コンポーネントの管理」をご参照ください。