本ページでは、アプリケーション設定を移行する際に発生する可能性のある例外およびその処理方法について説明します。

不正なファイルバージョン

エラーメッセージ
FATA Version 2.1 of Docker Compose is not supported. Please use version 1, 2 or 3

原因

Kompose はバージョン 1、2、および 3 の Docker Compose ファイルのみをサポートし、バージョン 2.X はサポートしていないため、変換が中断されます。

対応方法

Swarm compose ファイルを、version: '2.X' から version: '2' に変更して、Kompose を使用してファイルを再度変換します。

キーの解析に失敗

  • エラーメッセージ
    ERRO Could not parse config for project source : Unsupported config option for account-db service: 'external'

    原因

    Kompose が外部キーを解析できないため、変換が中断されます。

    対応方法

    重大度が ERRO または FATA の例外が発生した場合、例外の原因となった設定を Swarm Compose ファイルから削除し、Kompose を使用してファイルを再度変換します。 その後で、設定を手動で移行します。

  • エラーメッセージ
    ERRO Could not parse config for project source : Unsupported config option for gateway service: 'net'

    原因

    Kompose がネットキーを解析できないため、変換は中断されます。

    対応方法

    Swarm Compose ファイルから例外の原因となる設定を削除し、Kompose を使用してファイルを再度変換します。 後で、設定を手動で移行します。

無効な値のタイプ

  • エラーメッセージ
    ERRO Could not parse config for project source : Service 'auth-service' configuration key 'labels' contains an invalid type, it should be an array or object Unsupported config option for auth-service service: 'latest_image'

    原因

    値のタイプが無効であるため、Kompose が latest_image キーを変換することができません。

    対応方法

    Swarm Compose ファイルの値をブール型から文字列型に変更します。 たとえば、true を 'true' に変更します。

    この例外は、次のキーで生じます。
    • aliyun.latest_image: true
    • aliyun.global: true
  • エラーメッセージ
    ERRO Could not parse config for project source : Cannot unmarshal '30' of type int into a string value

    原因

    無効な値タイプが検出されました。 aliyun.log_* のキーの値が 30 かどうか確認してください。 値は整数ではなく文字列でなければならないため、値は単一引用符 (') で囲む必要があります。

    対応方法

    Swarm Compose ファイルで 30 を '30' に変更し、Kompose を使用してファイルを再度変換します。

サポートされていないキー

  • エラーメッセージ
    WARN Unsupported hostname key - ignoring

    原因

    Swarm クラスターでは、ホスト名キーにはサービスにアクセスするためのドメイン名として使用できるホスト名を指定します。 ただし、Swarm Compose ファイルはコンテナポートを指定しないため、Kompose はホスト名キーを Kubernetes クラスターの対応するサービスに自動的に変換できません。 その結果、Kubernetes クラスターのホスト名を使用して対応するアプリケーションにアクセスすることができません。

    対応方法

    最初に Kubernetes リソースファイルをデプロイしてから、Container Service - Kubernetes コンソールでサービスを作成します。 サービスを作成する際、ホスト名をサービス名として使用し、コンテナポートをサービスポートとして使用します。

  • エラーメッセージ
    WARN Unsupported links key - ignoring

    原因

    ホスト名キーと同様に、リンクキーにはサービスにアクセスするための名前またはエイリアスを指定します。 ただし、Swarm Compose ファイルはコンテナポートを指定しないため、Kompose はリンクキーを Kubernetes クラスタの対応するサービスに自動的に変換することができません。 その結果、Kubernetes クラスターのリンクキーで指定された名前またはエイリアスを使用して対応するアプリケーションにアクセスすることはできません。

    対応方法

    最初に Kubernetes リソースファイルをデプロイしてから、Container Service - Kubernetes コンソールでサービスを作成します。 サービスを作成する際、リンクキーで指定された名前またはエイリアスをサービス名として使用し、コンテナポートをサービスポートとして使用します。

キー変換時の問題

  • エラーメッセージ
    WARN Handling aliyun routings label: [{rabbitmq.your-cluster-id.alicontainer.com  http 15672}]

    原因

    Swarm クラスターでは、単純なルーティング用に Container Service for Swarm で提供されるテストドメイン名が設定されています。 このテストドメイン名には、Swarm クラスターの ID が含まれます。 Kompose は Kubernetes クラスターの ID を認識していないため、Kompose はこのテストドメイン名を Kubernetes クラスターの名前に自動的に変換することができません。 ドメイン名を手動で更新する必要があります。

    対応方法

    Ingress ごとに *-ingress.yaml ファイル を確認し、ファイルの host: your-cluster-id.alicontainer.com を Kubernetes クラスターのテストドメイン名に変換します。 Kubernetes クラスターのテストドメイン名を取得するには、次の手順に従います。
    1. Container Service - Kubernetes コンソール にログインします。 左側のナビゲーションペインで [クラスター] > [クラスター] クリックします。 [クラスター] ページで、対象のクラスター「Kubernetes-piggymetrics-cluster」を確認し、アクションの [管理] をクリックします。
    2. [基本情報] ページで Testing Domain の値 (例:*.c7f537c92438f415b943e7c2f8ca30b3b.cn-zhangjiakou.alicontainer.com) を取得します。 Ingress ごとに Kubernetes リソースファイルの .your-cluster-id.alicontainer.com をこの値に置き換えます。
  • エラーメッセージ
    WARN Handling aliyun routings label: [{gateway.your-cluster-id.alicontainer.com  http 4000} {gateway.swarm.piggymetrics.com  http 4000}]

    原因

    Swarm クラスターでは、単純なルーティング用に複数のドメイン名が設定されています。 ただし、Kompose が変換できるのは最初のドメイン名のみです。 他のドメイン名のルールは手動で追加する必要があります。

    対応方法

    生成された Kubernetes リソースファイルを変更します。

アプリケーションのデプロイ失敗

  • エラーメッセージ
    error: error validating "logtail2-daemonset.yaml": error validating data: ValidationError(DaemonSet.status): missing required field "numberReady" in io.Kubernetes.api.extensions.v1beta1.DaemonSetStatus; if you choose to ignore these errors, turn validation off with --validate=false

    原因

    Kompose は、Swarm クラスター内の aliyun.global: true キーを含むサービスを Kubernetes クラスター内の DaemonSet に自動的に変換します。 ただし、生成された Kubernetes リソースファイルには、中間ステータスを記録するステータスフィールドが含まれています。 このフィールドは、デプロイメント失敗の原因となります。

    status:
    • currentNumberScheduled: 0
    • desiredNumberScheduled: 0
    • numberMisscheduled: 0

    対応方法

    生成された Kubernetes リソースファイル *-daemonset.yaml からステータスフィールドを削除して、アプリケーションをデプロイします。

  • エラーメッセージ
    error: error parsing auth-service-deployment.yaml: error converting YAML to JSON: yaml: line 26: did not find expected key

    原因

    指定された行に想定されるフィールドが見つからないため、Kubernetes リソースファイルの解析が失敗します。 最も一般的な原因は不正なインデントであるため、Kubernetes は特定のフィールドを、並行フィールドではなく、前のフィールドのサブフィールドとして処理します。

    対応方法

    フィールドリストと Kubernetes の公式ドキュメントに従って、指定された行のインデントを調整します。

  • エラーメッセージ
    error: error parsing auth-service-deployment.yaml: error converting YAML to JSON: yaml: line 34: found character that cannot start any token

    原因

    Kubernetes リソースファイルの指定された行に、トークンに使用できない文字 (通常はタブ文字) が存在します。

    対応方法

    生成された Kubernetes リソースファイル *-daemonset.yaml で、タブ文字などのサポートされていない文字をスペース文字に置き換えます。

アプリケーションの起動エラー

  • エラーメッセージ

    ポッドが再起動を続け、ヘルスチェックが失敗しました。
    Initialized: True
    Ready: False
    ContainersReady: False
    PodScheduled: True

    原因

    Kubernetes は、活性プローブと準備プローブを使用して、ポッドが起動中で使用可能かどうかを確認します。 これらは、Swarm の aliyun.probe.url およびaliyun.probe.cmd に似ています。 Kompose は、aliyun.probe.url と aliyun.probe.cmd の両方を Kubernetes クラスターの活性プローブに変換します。 Swarm では、aliyun.probe.url および aliyun.probe.cmd は問題を検出したときにのみコンテナのステータスをマークしますが、コンテナを再起動しません。 ただし、Kubernetes の活性プローブがポッドの問題を検出すると、活性プローブはポッドの初期化を自動的に停止し、ポッドを再起動します。 活性プローブの設定が不適切な場合、ポッドは再起動を続けます。

    対応方法
    1. 例外がプローブによって引き起こされているかどうかを確認します。

      活性プローブまたは準備プローブの設定を削除し、アプリケーションが起動できるかどうかを確認します。 アプリケーションが起動する場合、プローブ設定は正しくありません。

    2. プローブ設定を修正します。

      ポッドの起動に必要な実際の時間を取得します。 Kubernetes リソースファイルの活性プローブの設定、特に initialDelaySeconds restartPolicy 、および timeoutSeconds フィールドを調整します。 詳細については、「イメージを利用したデプロイアプリケーションの作成」をご参照ください。

  • エラーメッセージ

    ポッドが再起動を続け、ヘルスチェックが失敗しました。
    Initialized: True
    Ready: False
    ContainersReady: False
    PodScheduled: True
    ポッドに対して次のログが生成されました。
    2019-05-22 06:42:09.245  INFO [gateway,,,] 1 --- [           main] c.c.c.ConfigServicePropertySourceLocator : Connect Timeout Exception on Url - http://config:8888. 利用可能な場合、次の url を試します。

    原因

    ポッドのネットワークモードが正しくないため、URL http://config:8888 へのリクエストがタイムアウトしました。 ネットワークモードが hostNetwork: true に設定されています。 Kubernetes サービスの名前を Elastic Compute Service (ECS) インスタンスのネットワーク経由で解析することhaできません。 したがって、このネットワークモードは正しくありません。

    gateway-deployment.yaml ファイルの設定を修正し、kubectl apply コマンドを使用してファイルを再度デプロイした後、このエラーが引き続き発生しました。

    対応方法

    変更された *-deployment.yaml ファイルが有効にならない場合があります。

    変更したファイルを有効化するには、Container Service - Kubernetes コンソール にログインしてアプリケーションを削除し、kubectl を使用してKubernetes リソースファイルを再度デプロイします。