ACK クラスターでのワークロードのデプロイと管理に関するよくある質問と回答です。
ACK クラスターでコンテナ化されたアプリケーションをデプロイするにはどうすればよいですか?
コンテナ化されたアプリケーションのデプロイには、次の 4 つのフェーズがあります。
-
アプリケーションコードを記述する (任意のプログラミング言語で記述できます)。
-
コンテナイメージをビルドする (Dockerfile を使用します。Dockerfile は、コードとすべての依存関係をポータブルな配信アーティファクトにパッケージ化するテキストファイルです)。コンテナイメージは、JAR、WAR、RPM ファイルなどの従来のパッケージよりも完全です。コンテナランタイムが必要とするすべてのファイルとアプリケーションがバンドルされているためです。このイメージを使用してコンテナを起動すると、アプリケーションが実行されます。詳細な手順については、「Dockerfile を使用したイメージのビルド、パッケージ化、実行」をご参照ください。
-
イメージをレジストリにプッシュする。Container Registry (ACR) は、イメージを保存、管理、配信、および提供します。ACR には次の 2 つのエディションがあります。詳細については、「ACR とは」をご参照ください。
-
Personal Edition — 個人開発者向け
-
Enterprise Edition — エンタープライズ顧客向け
-
-
ACK でワークロードをデプロイする (コンテナ化されたアプリケーションを実行します)。ACK は、コンテナ化されたワークロードのライフサイクル全体を管理します (Pod の特定ノードへのスケジューリング、負荷変化に応じたスケーリングなど)。詳細については、「ワークロード」をご参照ください。
イメージのプルに時間がかかりすぎる、または失敗するのはなぜですか?
プル元に応じて、次の項目を確認してください。
パブリックネットワーク経由でプルする場合
-
クラスターにパブリックネットワークアクセスがあることを確認してください。「クラスターのパブリックネットワークアクセスを有効にする」をご参照ください。
-
イメージレジストリもパブリックアクセスを許可していることを確認してください。ACR の例については、「ACR のパブリックネットワークアクセス制御を設定する」をご参照ください。
-
パブリック IP の帯域幅が低く設定されていないかを確認してください。
ACR からプルする場合
-
イメージプルシークレットが正しいことを確認してください。「imagePullSecrets の使用方法」をご参照ください。
-
パスワードレスプルコンポーネントを使用している場合は、正しく設定されていることを確認してください。「同一アカウント内でのイメージのプル」および「アカウント間でのイメージのプル」をご参照ください。
ACK でアプリケーションの問題をトラブルシューティングするにはどうすればよいですか?
アプリケーションの障害は、通常、Pod、コントローラー (Deployment、StatefulSet、DaemonSet)、または Service に起因します。まず、どのレイヤーに問題があるかを特定してから、次の手順に従ってください。
Pod の確認
Pod レベルの問題を診断する完全なガイドについては、「Pod 異常のトラブルシューティング」をご参照ください。
Deployment の確認
Pod の異常は、Deployment、DaemonSet、StatefulSet、Job などのコントローラーが作成されたときに表面化することがよくあります。Pod レベルの問題を確認した後、Deployment のイベントとログを確認してください。
-
[クラスター] ページで、クラスター名を見つけてクリックします。左側メニューで、[ワークロード] > [Deployment] を選択します。
-
[Deployment] ページで、Deployment 名をクリックし、[イベント] または [ログ] をクリックして問題を特定します。
DaemonSet、StatefulSet、Job のプロセスも同じです。
Service の確認
Service は、Pod のグループ間でトラフィックを負荷分散します。Service 関連の問題を特定するには、次の手順に従ってください。
ステップ 1: エンドポイントが存在することを確認する
kubectl を使用してクラスターに接続してから、次のコマンドを実行します。
kubectl get endpoints <service_name>
ENDPOINTS 列のアドレス数は、予想されるレプリカ数と一致する必要があります。たとえば、3 つのレプリカを持つ Deployment は、3 つのアドレスを表示する必要があります。
Service エンドポイントが見つからない場合
Service にエンドポイントアドレスがない場合、Service セレクターが Pod と一致していない可能性があります。次のコマンドを実行して確認してください。
-
Service YAML でセレクターを見つけます。
spec: clusterIP: 1x.xx.xx.33 externalTrafficPolicy: Cluster ports: - name: http nodePort: 30040 port: 30080 protocol: TCP targetPort: 80 selector: app: nginx sessionAffinity: None -
そのセレクターを使用して Pod をクエリします。
<app>は、Pod のappラベルの値です。<namespace>は、Service がある Namespace です。Service がデフォルトの Namespace にある場合は、-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 は正常ですか? 「Pod 異常のトラブルシューティング」をご参照ください。
-
Pod IP に到達できますか?
kubectl get pods -o wideで Pod IP を取得し、任意のノードにログインしてping <pod-ip>を実行し、ネットワーク接続を確認してください。 -
アプリケーションは正しいポートでリッスンしていますか? 任意のノードで
curl <pod-ip>:<port>を実行し、Pod 内のコンテナポートが期待どおりに機能していることを確認してください。
Helm を手動で更新するにはどうすればよいですか?
Helm v2 の Tiller サーバー側コンポーネントには、攻撃者がクラスターに不正なアプリケーションをインストールできる既知のセキュリティ脆弱性があります。Helm v3 にアップグレードしてください。「Helm v2 から Helm v3 へのアップグレード」をご参照ください。
中国本土の Container Registry Enterprise Edition インスタンスから中国本土以外の ACK クラスターにイメージをプルするにはどうすればよいですか?
次の Container Registry Enterprise Edition インスタンスを購入してください。
-
中国本土のリージョンに Standard または Premium インスタンス
-
中国本土以外のリージョンに Basic インスタンス
次に、同期インスタンスを使用して、中国本土のリージョンから中国本土以外のリージョンにイメージをレプリケートします。「同一アカウントの同期インスタンス」をご参照ください。同期後、中国本土以外のリージョンの Enterprise Edition インスタンスからレジストリアドレスを取得し、ACK でアプリケーションを作成するときに使用します。
ACR Personal Edition は同期速度が遅くなります。自己管理リポジトリの場合、イメージのプルを高速化するために Global Acceleration (GA) を購入する必要があり、コストが増加します。Container Registry Enterprise Edition の使用を推奨します。「課金情報」をご参照ください。
サービスを中断せずにローリングアップデートを実行するにはどうすればよいですか?
ローリングアップデート中に Pod を置き換えると、Pod の変更が Classic Load Balancer (CLB) インスタンスに同期されるまで数秒の遅延が発生します。これにより、一時的に 5XX エラーが発生する可能性があります。グレースフルシャットダウンを設定して、ダウンタイムゼロのローリングアップデートを実現してください。「ダウンタイムゼロのローリングデプロイメントの実装」をご参照ください。
ワークロードのコンテナイメージを取得するにはどうすればよいですか?
前提条件とコンテナイメージのプルに関するガイダンスについては、「イメージのプル」をご参照ください。
コンテナを再起動するにはどうすればよいですか?
Kubernetes は、個々のコンテナを直接再起動することをサポートしていません。代わりに、Pod を削除してください。コントローラー (Deployment、DaemonSet など) が自動的に代替を作成します。
-
Pod を一覧表示して、再起動する Pod を見つけます。
kubectl get pods -
Pod を削除します。
kubectl delete pod <pod-name> -
新しい Pod が実行されていることを確認します。
kubectl get podsPod のステータスが
Runningであることを確認してください。
本番環境では、Pod を直接操作するのではなく、ReplicaSet や Deployment などの上位レベルのオブジェクトを通じてコンテナを管理してください。これにより、クラスター状態の一貫性が保たれます。
Deployment の Namespace を変更するにはどうすればよいですか?
Deployment を別の Namespace に移動する場合、依存するリソース (PersistentVolumeClaim (PVC)、ConfigMap、Secret) も新しい Namespace に手動で更新する必要があります。
-
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 # 新しい Namespace を指定します。 ... ... -
更新した設定を適用します。
kubectl apply -f deployment.yaml -
Deployment が新しい Namespace で実行されていることを確認します。
kubectl get deploy -n new-namespace
Pod 情報を実行中のコンテナに公開するにはどうすればよいですか?
ACK は、Kubernetes コミュニティのネイティブ仕様に従っています。次の 2 つの方法がサポートされています。
-
環境変数 — 環境変数を介して Pod 情報をコンテナに渡します。「環境変数を通じて Pod 情報をコンテナに公開する」をご参照ください。
-
ファイル — Downward API ボリュームを使用して、Pod 情報をコンテナ内のファイルとしてマウントします。「ファイルを通じて Pod 情報をコンテナに公開する」をご参照ください。
imagePullSecrets の使用方法
-
パスワードレスプルコンポーネントは、手動で指定した
imagePullSecretsフィールドをサポートしていません。 -
Secret は、ワークロードと同じ Namespace に作成する必要があります。
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 # Namespace のデフォルト 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 インスタンスと一致していません。
-
プルに使用されるイメージアドレスが、コンポーネントで設定されたドメイン名と一致していません。
「同一アカウント内でのイメージのプル」に従って設定を確認してください。
設定が正しいにもかかわらずプルが失敗する場合、ワークロード 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 コンポーネントのインストールと認証情報の設定が必要となるために発生します。「コンテナイメージプル認証情報の設定」をご参照ください。
コンポーネントをインストールしても問題が解決しない場合は、まずコンテナイメージアクセラレーションを無効にしてサービスを復旧させてから、再設定してください。