ACK クラスターでワークロードをデプロイおよび管理する際のよくあるご質問 (FAQ) を紹介します。
ACK クラスターにコンテナ化されたアプリケーションをデプロイするにはどうすればよいですか?
コンテナ化されたアプリケーションのデプロイは、次の 4 つのフェーズで構成されます。
-
任意の言語で アプリケーションコードを作成 します。
-
Dockerfile を使用して コンテナイメージをビルド します。Dockerfile は、コードとその依存関係一式をポータブルな配布アーティファクトとしてパッケージ化するテキストファイルです。コンテナイメージは、コンテナランタイムが必要とするすべてのファイルをアプリケーションと一緒にバンドルするため、JAR、WAR、RPM などの従来のパッケージよりも完全です。このイメージを使用してコンテナを起動します。コンテナは実行中のアプリケーションです。手順については、「Build, package, and run images using a Dockerfile」をご参照ください。
-
イメージをレジストリにプッシュ します。Container Registry (ACR) は、イメージの保存、管理、配布、提供をします。ACR には 2 つのエディションがあります。詳細については、「What is Container Registry ACR」をご参照ください。
-
Personal Edition:個人開発者向け
-
Enterprise Edition:企業顧客向け
-
-
コンテナ化されたアプリケーションを実行するために、ACK で ワークロードをデプロイ します。ACK は、コンテナ化されたワークロードのライフサイクル全体 (特定ノードへの Pod のスケジューリング、負荷変動に応じたスケーリングなど) を管理します。詳細については、「Workloads」をご参照ください。
イメージのプルに時間がかかる、または失敗するのはなぜですか?
プル元に応じて、次を確認してください。
パブリックネットワーク経由でプルする場合
-
クラスターがパブリックネットワークへアクセスできることを確認します。「Enable public network access for a cluster」をご参照ください。
-
イメージレジストリ側もパブリックアクセスを許可していることを確認します。ACR の例については、「Configure public network access control for ACR」をご参照ください。
-
パブリック IP の帯域幅が低すぎないか確認します。
ACR からプルする場合
-
イメージプル用の Secret が正しいことを確認します。「How do I use imagePullSecrets?」をご参照ください。
-
パスワードレスプルコンポーネントを使用している場合は、正しく設定されていることを確認します。「Pull images within the same account」および「Pull images across accounts」をご参照ください。
ACK でアプリケーションの問題をトラブルシューティングするにはどうすればよいですか?
アプリケーションの障害は、通常、Pod、コントローラー (Deployment、StatefulSet、DaemonSet)、または Service に起因します。まずどのレイヤーに問題があるかを特定し、次の手順に従ってください。
Pod の確認
Pod レベルの問題を診断するための完全なガイドについては、「Troubleshoot pod anomalies」をご参照ください。
Deployment の確認
Pod の異常は、Deployment、DaemonSet、StatefulSet、Job などのコントローラーが作成されたときに顕在化することがよくあります。Pod レベルの問題を確認した後、Deployment のイベントとログを確認します。
-
[Clusters] ページで対象のクラスターを見つけ、クラスター名をクリックします。左側メニューで、[Workloads] > [Deployments] を選択します。
-
[Deployments] ページで Deployment 名をクリックし、[Events] または [Logs] をクリックして問題を特定します。
DaemonSet、StatefulSet、Job の手順も同様です。
Service の確認
Service は、Pod グループ全体にトラフィックを負荷分散します。次の手順に従って、Service 関連の問題を特定します。
手順 1:エンドポイントが存在することの確認
Connect to the cluster with kubectl を実行した後、次のコマンドを実行します。
kubectl get endpoints <service_name>
ENDPOINTS 列のアドレス数は、想定されるレプリカ数と一致している必要があります。たとえば、レプリカ数が 3 の Deployment の場合、3 つのアドレスが表示されます。
Service のエンドポイントが存在しない場合
Service にエンドポイントアドレスがない場合、Service のセレクターがいずれの Pod とも一致していない可能性があります。次の内容を確認します。
-
Service YAML でセレクターを確認します。

-
そのセレクターを使用して Pod を照会します。
<app>は Pod のappラベルの値です。<namespace>は Service が存在する名前空間です。 Service が default 名前空間にある場合は、-n <namespace>を省略してください。kubectl get pods -l app=<app> -n <namespace> -
一致する Pod が存在するにもかかわらずエンドポイントがない場合は、Service ポートがコンテナポートと一致していない可能性があります。接続性をテストします。
<ip>と<port>は、手順 1 の Service YAML にあるclusterIPとportの値です。 具体的なテスト方法は環境によって異なります。curl <ip>:<port>Service で指定されているコンテナポートが、アプリケーションが実際にリッスンしているポートと同じであることを確認してください。
ネットワーク転送の問題
クライアントが Service に到達でき、エンドポイントも正しいにもかかわらず、接続が即座に切断される場合、トラフィックが Pod に到達していない可能性があります。次を確認します。
-
Pod は正常ですか? 「Troubleshoot pod anomalies」をご参照ください。
-
Pod IP に到達できますか?
kubectl get pods -o wideで Pod IP を取得し、任意のノードにログインしてping <pod-ip>を実行し、ネットワーク接続性を確認します。 -
アプリケーションは正しいポートでリッスンしていますか? 任意のノードで
curl <pod-ip>:<port>を実行し、Pod 内のコンテナポートが想定どおりに動作していることを確認します。
Helm を手動で更新するにはどうすればよいですか?
Helm v2 のサーバーサイドコンポーネントである Tiller には、攻撃者がクラスターに不正なアプリケーションをインストールできる既知のセキュリティ脆弱性があります。 Helm v3 にアップグレードしてください。「Upgrading from Helm v2 to Helm v3」をご参照ください。
中国本土の Container Registry Enterprise Edition インスタンスから、中国本土以外の ACK クラスターにイメージをプルするにはどうすればよいですか?
次の Container Registry Enterprise Edition インスタンスを購入します。
-
中国本土内のリージョンにある Standard または Premium インスタンス
-
中国本土外のリージョンにある Basic インスタンス
その後、同期インスタンスを使用して、中国本土内リージョンから中国本土外リージョンへイメージをレプリケートします。「Same-account sync instance」をご参照ください。同期後、中国本土外リージョンの Enterprise Edition インスタンスからレジストリアドレスを取得し、ACK でアプリケーションを作成する際に使用します。
ACR Personal Edition は同期速度が遅くなります。自己管理リポジトリの場合、イメージのプルを高速化するには Global Acceleration (GA) を購入する必要があり、コストが増加します。推奨される選択肢は Container Registry Enterprise Edition です。「Billing information」をご参照ください。
サービスを停止せずにローリングアップデートを実行するにはどうすればよいですか?
ローリングアップデート中に Pod を置き換える際、Pod の変更が Classic Load Balancer (CLB) インスタンスに同期されるまでに数秒の遅延が発生します。これにより、一時的に 5XX エラーが発生する場合があります。グレースフルシャットダウンを設定して、ダウンタイムなしのローリングアップデートを実現してください。「Implement zero-downtime rolling deployments」をご参照ください。
ワークロードのコンテナイメージを取得するにはどうすればよいですか?
前提条件およびコンテナイメージのプルに関するガイダンスについては、「Pull image」をご参照ください。
コンテナを再起動するにはどうすればよいですか?
Kubernetes は、個別のコンテナを直接再起動することをサポートしていません。代わりに Pod を削除します。コントローラー (Deployment、DaemonSet など) が自動的に代替 Pod を作成します。
-
再起動する Pod を特定するため、Pod を一覧表示します。
kubectl get pods -
Pod を削除します。
kubectl delete pod <pod-name> -
新しい Pod が実行中であることを確認します。
kubectl get podsPod のステータスが
Runningであることを確認します。
本番環境では、Pod を直接操作するのではなく、ReplicaSet や Deployment などの上位オブジェクトを通じてコンテナを管理してください。これにより、クラスター状態の整合性を維持できます。
Deployment の名前空間を変更するにはどうすればよいですか?
Deployment を別の名前空間に移動する場合、依存リソースである PersistentVolumeClaim (PVC)、ConfigMap、Secret も新しい名前空間に手動で更新する必要があります。
-
Deployment の設定をエクスポートします。
kubectl get deploy <deployment-name> -n <old-namespace> -o yaml > deployment.yaml -
deployment.yamlを編集し、namespaceの値を置き換えます。apiVersion: apps/v1 kind: Deployment metadata: annotations: generation: 1 labels: app: nginx name: nginx-deployment namespace: new-namespace # 新しい名前空間を指定します。 ... ... -
更新した設定を適用します。
kubectl apply -f deployment.yaml -
新しい名前空間で Deployment が実行されていることを確認します。
kubectl get deploy -n new-namespace
実行中のコンテナに Pod 情報を公開するにはどうすればよいですか?
ACK は Kubernetes コミュニティのネイティブ仕様に準拠しています。次の 2 つの方法をサポートしています。
-
環境変数:環境変数を介して Pod 情報をコンテナに渡します。「Expose pod information to containers through environment variables」をご参照ください。
-
ファイル:Downward API ボリュームを使用して、Pod 情報をコンテナ内にファイルとしてマウントします。「Expose pod information to containers through files」をご参照ください。
imagePullSecrets を使用するにはどうすればよいですか?
-
パスワードレスプルコンポーネントは、手動で指定した
imagePullSecretsフィールドをサポートしていません。 -
Secret は、ワークロードと同じ名前空間に存在する必要があります。
2024 年 9 月 9 日以降に作成された ACR Personal Edition インスタンスは、aliyun-acr-credential-helper をサポートしていません。認証情報を Kubernetes の Secret に保存し、imagePullSecrets 経由で参照してください。
手順 1:Secret の作成
kubectl create secret docker-registry image-secret \
--docker-server=<ACR-registry> \
--docker-username=<username> \
--docker-password=<password> \
--docker-email=<email@example.com>
| パラメーター | 説明 |
|---|---|
--docker-server |
ACR インスタンスのレジストリアドレスです。ネットワークの種類 (内部またはパブリック) に応じたエンドポイントを指定します。 |
--docker-username |
ACR アクセス認証情報のユーザー名。 |
--docker-password |
ACR アクセス認証情報のパスワード。 |
--docker-email |
任意。 |
手順 2:Secret の参照
次のいずれかの方法を選択します。
ServiceAccount の使用
オプション 1:ServiceAccount に追加
この ServiceAccount を使用するすべてのワークロードは、Secret を個別に指定しなくてもイメージをプルできます。
apiVersion: v1
kind: ServiceAccount
metadata:
name: default
namespace: default
imagePullSecrets:
- name: image-secret # ACR の Secret を入力します。
この ServiceAccount を使用する任意の Deployment は、次のようにイメージをプルできます。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
namespace: default
labels:
app: nginx
spec:
serviceAccountName: default # 名前空間のデフォルト ServiceAccount を使用する場合は、指定する必要はありません。
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: <acrID>.cr.aliyuncs.com/<repo>/nginx:latest # ACR リポジトリのレジストリアドレスに置き換えます。
ワークロードで直接使用
オプション 2:ワークロードで直接指定
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-test
namespace: default
labels:
app: nginx
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
imagePullSecrets:
- name: image-secret # 前の手順で作成した Secret を使用します。
containers:
- name: nginx
image: <acrID>.cr.aliyuncs.com/<repo>/nginx:latest # ACR リポジトリのレジストリアドレスに置き換えます。
確認
設定を適用した後、Pod が実行中であることを確認します。
kubectl get pods
パスワードレスコンポーネントを設定してもプルに失敗するのはなぜですか?
パスワードレスプルコンポーネントが誤って設定されている可能性があります。次の 2 つの一般的な原因を確認してください。
-
コンポーネント内のインスタンス情報が ACR インスタンスと一致していません。
-
プルに使用するイメージアドレスが、コンポーネントで設定したドメイン名と一致していません。
「Pull images within the same account」に従って設定を検証してください。
設定が正しいにもかかわらずプルに失敗する場合、ワークロード YAML に手動で指定された imagePullSecrets フィールドが、パスワードレスコンポーネントと競合している可能性があります。 imagePullSecrets フィールドを削除し、その後 Pod を削除して再作成してください。
ノードプールのイメージアクセラレーションを有効にすると、新しいノードでコンテナの起動に失敗するのはなぜですか?
ノードプールに対して コンテナイメージアクセラレーション を有効にすると、次のエラーが表示される場合があります。
failed to create containerd container: failed to attach and mount for snapshot 46: failed to enable target for /sys/kernel/config/target/core/user_99999/dev_46, failed:failed to open remote file as tar file xxxx
このエラーは、コンテナイメージアクセラレーションを使用するために aliyun-acr-acceleration-suite コンポーネントのインストールと、プライベートイメージ用のプル認証情報の設定が必要なためです。「Configure container image pull credentials」をご参照ください。
コンポーネントをインストールしても問題が解消しない場合は、まず「disable container image acceleration」を実行してサービスを復旧し、その後、再設定してください。