このトピックでは、Container Service for Kubernetes (ACK) クラスターでのワークロードデプロイに関するよくある質問に対する回答を提供します。
コンテナー化されたアプリケーションをACKクラスターにデプロイするにはどうすればよいですか。
アプリケーションコードは、クラウドまたはオンプレミスマシンにデプロイできます。 すべてのプログラミング言語のコードをコンテナーにデプロイし、コンテナーを使用してアプリケーションを実行および配信できます。 ACK クラスターでのアプリケーション開発には、以下の段階に沿って進めます。
ビジネスコードを記述します。
Dockerfile を使用してイメージをビルドします。
イメージリポジトリにイメージをアップロードします。 Container Registryを使用してイメージをホストできます。 Container Registryは、イメージのバージョン管理を提供し、イメージを配布およびプルできます。 Container Registryには、Personal EditionとEnterprise Editionの2つのエディションがあります。 Personal Editionは、個々の開発者向けに設計されています。 Enterprise Editionは、エンタープライズユーザー向けに設計されています。 詳細については、「Container Registry の概要」をご参照ください。
イメージを使用してACKクラスターにワークロードをデプロイします。 これにより、ワークロードでコンテナ化されたアプリケーションを実行できます。 ACKが提供する機能を使用して、コンテナ化されたアプリケーションを管理することもできます。 詳細については、「ワークロード」をご参照ください。
画像の取得に時間がかかる、または失敗する場合はどうすればよいですか?
この問題をトラブルシューティングするには、次の手順を実行します。
Container Registryのリポジトリから画像を取得する場合は、使用するユーザー名とパスワードが有効かどうかを確認します。 aliyun-acr-credential-helperコンポーネントを使用して、パスワードなしでContainer Registryからイメージをプルすることを推奨します。 詳細については、「aliyun-acr-credential-helperコンポーネントを使用して、シークレットを使用せずにイメージをプルする」をご参照ください。
クライアントがインターネットにアクセスできるかどうかを確認します。 クライアントがインターネットにアクセスできない場合は、クライアントのインターネットアクセスを設定する必要があります。
ACKでアプリケーションの問題をトラブルシューティングする方法?
ほとんどの場合、ACKのアプリケーションの問題は、ポッド、コントローラー (Deployments、StatefulSets、またはDaemonSets) 、およびサービスから発生します。 次の種類の問題が存在するかどうかを確認します。
ポッドの問題
ポッドの問題をトラブルシューティングする方法の詳細については、「ポッドのトラブルシューティング」をご参照ください。
コントローラの問題
Deployments、DaemonSets、StatefulSets、およびJobsなどのコントローラーを作成すると、ポッドの問題が発生する可能性があります。 詳細については、「ポッドのトラブルシューティング」をご参照ください。
デプロイメントなどのコントローラのイベントとログを確認して、コントローラのポッドの問題をトラブルシューティングできます。
次の手順は、展開のイベントとログを確認する方法を示しています。 同様の手順を実行して、DaemonSets、StatefulSets、またはJobsのイベントとログを確認できます。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 クラスターの詳細ページの左側のナビゲーションウィンドウで、 を選択します。[クラスター] ページで、管理するクラスターの名前をクリックします。 クラスターの詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[デプロイメント] ページで、表示するデプロイメントの名前をクリックします。 [イベント] タブと [ログ] タブをクリックして、デプロイのイベントとログを表示します。
StatefulSetの作成時に問題が発生した場合は、「強制ロールバック」をご参照ください。
サービスの問題
サービスは、ポッドのセット間で負荷分散を提供します。 次の手順は、サービスの問題を特定する方法を示しています。
サービスのエンドポイントを確認します。
サービスが属するクラスターのマスターノードにログインします。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
次のコマンドを実行して、サービスのエンドポイントを表示します。
[$Service_Name]
を実際のサービス名に置き換えます。kubectl get endpoints [$Service_Name]
エンドポイントの数がバックエンドポッドの数と同じかどうかを確認します。 たとえば、3つのポッドをプロビジョニングするDeploymentによってデプロイされたアプリケーションを公開するためにサービスを使用する場合、サービスには3つのエンドポイントがあります。
不足しているサービスエンドポイント
サービスのエンドポイントがない場合は、サービスのセレクターを照会し、セレクターを使用してバックエンドポッドがサービスに関連付けられているかどうかを確認します。 以下の手順を実行します。
次の図は、サンプルYAMLファイルを示しています。
次のコマンドを実行して、セレクターに一致するポッドを照会します。
kubectl get pods --selector=app=[$App] -n [$Namespace]
説明[$App]
をバックエンドポッドの名前に置き換えます。[$名前空間]
をサービスの名前空間に置き換えます。 サービスがデフォルトの名前空間に属している場合、このパラメーターは空のままにできます。
アプリケーションポッドが返された場合、サービスは間違ったポートを使用する可能性があります。 サービスがバックエンドポッドに対して公開されていないポートでリッスンする場合、ポッドはサービスのエンドポイントに追加されません。 次のコマンドを実行して、サービスポートを使用してポッドにアクセスできるかどうかを確認します。
curl [$IP]:[$Port]
説明[$IP]
を手順1のYAMLファイルで指定したクラスターIPアドレスに置き換えます。[$Port]
を手順1でYAMLファイルで指定したポートに置き換えます。テスト方法は、実際の環境によって異なります。
トラフィック転送エラー
クライアントがサービスにアクセスでき、サービスのエンドポイントのIPアドレスが有効である場合、クライアントはサービスに接続した直後にサービスから切断されます。 原因は、リクエストがバックエンドポッドに転送されなかったことです。 この問題をトラブルシューティングするには、次の手順を実行します。
バックエンドポッドが期待どおりに実行されるかどうかを確認します。
ポッドの問題を特定します。 詳細については、「ポッドのトラブルシューティング」をご参照ください。
バックエンドポッドのIPアドレスにアクセスできるかどうかを確認します。
次のコマンドを実行して、バックエンドポッドのIPアドレスを照会します。
kubectl get pods -o wide
ノードにログインし、pingコマンドを実行して、ポッドのIPアドレスにアクセスできるかどうかを確認します。
サービスがバックエンドアプリケーションに対して公開されているポートをリッスンするかどうかを確認します。
アプリケーションでポート80が公開されている場合は、サービスのリスニングポートとしてポート80を指定する必要があります。 ノードにログインし、
curl [$IP]:[$Port]
コマンドを実行して、サービスポートを使用してポッドにアクセスできるかどうかを確認します。
Helmを手動で更新するにはどうすればよいですか?
Kubernetesクラスターにログインします。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
次のコマンドを実行してTillerをインストールします。
Tillerイメージのアドレスには、クラスターがデプロイされている仮想プライベートクラウド (VPC) のエンドポイントを含めることができます。 たとえば、クラスターが中国 (杭州) リージョンにデプロイされている場合、次のイメージアドレスを指定できます。
registry-vpc.cn-hangzhou.aliyuncs.com/acs/tiller:v2.11.0
helm init --tiller-image registry.cn-hangzhou.aliyuncs.com/acs/tiller:v2.11.0 --upgrade
の後ティラーヘルスチェックは成功し、
helmバージョン
コマンドを実行して更新結果を表示します。説明上記のコマンドは、Helmのサーバー側コンポーネントであるTillerのみを更新します。 クライアント側コンポーネントを更新するには、必要なクライアントバイナリをダウンロードします。
Alibaba Cloudでサポートされている最新のクライアントバージョン (Helm client 2.11.0) をダウンロードします。
Helmのサーバー側コンポーネントとクライアント側コンポーネントが更新されたら、次のコマンドを実行してバージョンを確認します。
helm version
期待される出力:
Client: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b****", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.11.0", GitCommit:"2e55dbe1fdb5fdb96b75ff144a339489417b****", GitTreeState:"clean"}
プライベートイメージを取得するには?
次のコマンドを実行して、シークレットを作成します。
kubectl create secret docker-registry regsecret --docker-server=registry-internal.cn-hangzhou.aliyuncs.com --docker-username=abc****@aliyun.com --docker-password=**** --docker-email=abc****@aliyun.com
regsecret
: シークレットのキー。 カスタムキーを入力できます。-- docker-server
: Dockerレジストリのアドレス。-- docker-username
: Dockerレジストリのユーザー名。-- docker-password
: Dockerレジストリのパスワード。オプション:
-- docker-email
: メールアドレス。
次のいずれかの方法を使用して、プライベートイメージをプルできます。
プライベートイメージを手動でプルする
シークレット設定をYAMLファイルに追加します。
containers: - name: foo image: registry-internal.cn-hangzhou.aliyuncs.com/abc/test:1.0 imagePullSecrets: - name: regsecret
説明imagePullSecrets
パラメーターは、イメージをプルするために使用されるシークレットを指定します。作成したシークレットの名前を指定する必要があります。 この例では、シークレットの名前は
regsecret
です。image
パラメーターで指定されるDockerレジストリは、-- docker-server
で指定されるレジストリと同じである必要があります。
詳細については、「Use a private registry 」をご参照ください。
シークレットなしでプライベートイメージを自動的にプルする
説明プライベートイメージをプルするたびにシークレットを使用する必要をなくすために、使用する名前空間の既定のサービスアカウントにシークレットを追加できます。 詳細については、「サービスアカウントに ImagePullSecrets を追加する」をご参照ください。
次のコマンドを実行して、プライベートイメージのプルに使用されるシークレットを表示します。
kubectl get secret regsecret
期待される出力:
NAME TYPE DATA AGE regsecret kubernetes.io/dockerconfigjson 1 13m
この例では、使用する名前空間の既定のサービスアカウントにimage pulling Secretが追加されます。
sa.yamlという名前のファイルを作成し、デフォルトのサービスアカウントの設定をファイルに追加します。
kubectl get serviceaccounts default -o yaml > ./sa.yaml
次のコマンドを実行して、sa.yamlファイルの設定を照会します。
cat sa.yaml
期待される出力:
apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: 2015-08-07T22:02:39Z name: default namespace: default resourceVersion: "243024" # Take note of the self link: /api/v1/namespaces/default/serviceaccounts/default. uid: 052fb0f4-3d50-11e5-b066-42010af0**** secrets: - name: default-token-uudgeoken-uudge
vim sa.yaml
コマンドを実行し、sa.yamlファイルを開きます。 次に、resourceVersionパラメーターを削除し、imagePullSecretsパラメーターを追加して、イメージをプルするシークレットを指定します。次の内容に基づいてファイルを変更します。apiVersion: v1 kind: ServiceAccount metadata: creationTimestamp: 2015-08-07T22:02:39Z name: default namespace: default selfLink: /api/v1/namespaces/default/serviceaccounts/default uid: 052fb0f4-3d50-11e5-b066-42010af0**** secrets: - name: default-token-uudge imagePullSecrets: # Add this parameter. - name: regsecret
次のコマンドを実行して、デフォルトのサービスアカウントの設定をsa.yamlファイルの設定に置き換えます。
kubectl replace serviceaccount default -f ./sa.yaml
期待される出力:
serviceaccount "default" replaced
Tomcatアプリケーションを作成します。
tomcat.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。
apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deployment labels: app: tomcat spec: replicas: 1 selector: matchLabels: app: tomcat template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: registry-internal.cn-hangzhou.aliyuncs.com/abc/test:1.0 # Replace the value with the address of your private image. - containerPort: 8080
次のコマンドを実行して、Tomcatアプリケーションを作成します。
kubectl create -f tomcat.yaml
ポッドの起動後、次のコマンドを実行してポッドの設定を照会します。
kubectl get pod tomcat-**** -o yaml
期待される出力:
spec: imagePullSecrets: - nameregsecretey
中国本土内のリージョンにデプロイされているContainer Registry Enterprise Editionインスタンスから、中国本土外のリージョンにデプロイされているACKクラスターにイメージをプルするにはどうすればよいですか。
まず、中国本土のリージョンでStandardまたはAdvanced EditionのContainer Registry Enterprise Editionインスタンスを購入する必要があります。 次に、中国本土以外のリージョンでBasic EditionのContainer Registry Enterprise Editionインスタンスを購入します。
購入完了後、中国本土のContainer Registryインスタンスから中国本土外のContainer Registryインスタンスにイメージを同期できます。 詳細については、「同じアカウント内でイメージを複製する」をご参照ください。 次に、中国本土外のContainer Registryインスタンスからプルするイメージのアドレスを取得します。 これにより、イメージをACKクラスターにプルし、イメージを使用してアプリケーションをデプロイできます。
Container Registry Personal Editionを使用する場合、イメージの同期プロセスに時間がかかります。 自己管理イメージリポジトリを使用する場合は、Global Accelerator (GA) インスタンスを購入する必要があります。
自己管理リポジトリとGAインスタンスの総コストはContainer Registry Enterprise Editionよりも高いため、Container Registry Enterprise Editionの使用を推奨します。
Container Registry Enterprise Editionの課金の詳細については、「課金ルール」をご参照ください。
サービスを中断せずにアプリケーションのローリングアップデートを実行する方法?
古いアプリケーションバージョンが削除された後、新しいアプリケーションバージョンをデプロイすると、5XX
エラーが短期間持続します。 ローリング更新中にポッドの更新をClassic Load Balancer (CLB) インスタンスに同期するのに数秒かかるため、5XX
エラーが発生します。 この問題を解決するには、接続のドレインを設定します。 これにより、サービスを中断することなく、アプリケーションのローリングアップデートを実行できます。
画像を取得するには?
Container Registryを使用して、イメージをビルドおよびプルできます。 詳細については、「イメージの管理」をご参照ください。
コンテナを再起動するにはどうすればよいですか?
個々のコンテナを個別に再起動することはできません。 コンテナを再起動するには、次の手順を実行します。
次のコマンドを実行して、クラスター内のポッドのステータスを照会します。 出力からポッドを選択できます。
kubectl get pods
選択したポッドを削除します。 次に、DeploymentやDaemonSetなどの対応するコントローラが自動的に新しいポッドを作成します。 このようにして、ポッド内のコンテナが再起動されます。 次のコマンドを実行してポッドを削除します。
kubectl delete pod <pod-name>
ポッドを削除すると、対応するコントローラによって自動的に新しいポッドが作成されます。
説明本番環境のポッドでコンテナーを管理または更新する場合は、ReplicaSetsやDeploymentsなどのコントローラーを使用することをお勧めします。 一貫した正常なクラスタ状態を確保するために、ポッドに対して手動操作を実行しないことを推奨します。
次のコマンドを実行して、新しいポッドが [実行中] 状態であるかどうかを確認します。
kubectl get pods
Deploymentの名前空間を変更するにはどうすればよいですか。
ある名前空間から別の名前空間にDeploymentを移行する場合は、Deploymentが属する名前空間を変更する必要があります。 この場合、デプロイで使用される永続ボリューム (PV) 、ConfigMaps、Secrets、およびその他の依存関係の名前空間を手動で変更する必要もあります。
kubectl get
コマンドを実行して、デプロイのYAMLテンプレートを照会します。kubectl get deploy <deployment-name> -n <old-namespace> -o yaml > deployment.yaml
要件に基づいて
namespace
パラメーターの値を変更して、deployment.yamlファイルを変更します。 変更を保存して終了します。apiVersion: apps/v1 kind: Deployment metadata: annotations: generation: 1 labels: app: nginx name: nginx-deployment namespace: new-namespace # Specify the new namespace. ... ...
kubectl apply
コマンドを実行して、新しい名前空間に配置をデプロイします。kubectl apply -f deployment.yaml
kubectl get
コマンドを実行して、新しい名前空間のデプロイを照会します。kubectl get deploy -n new-namespace
ポッド情報を実行中のコンテナに公開するにはどうすればよいですか?
ACKはオープンソースKubernetesと完全互換性があり、オープンソースKubernetesの仕様に準拠しています。 次のいずれかの方法を使用して、ポッド情報を実行中のコンテナーに公開できます。