Container Service for Kubernetes (ACK) クラスターでは、Elastic Container Instance ベースのポッドとサービスを同期するコンポーネントが並行して起動および実行されます。クラスターに多数のサービスとサービスエンドポイントが含まれている場合、クラスター IP アドレスがサービス間で同期される前に、ポッドへのアクセスがタイムアウトする可能性があります。このトピックでは、ACK クラスターでクラスター IP アドレスがサービス間で同期された後にポッドが作成されるように構成する方法について説明します。これにより、ポッド内のコンテナーがタイムアウトエラーなしでサービスにアクセスできるようになります。
機能の説明
Container Service for Kubernetes (ACK) クラスターで Elastic Container Instance を使用する場合、ポッドとサービスを同期するコンポーネントは並行して起動および実行されます。ACK クラスターに多数のサービスとサービスエンドポイントが含まれている場合、サービスの同期には長い時間がかかります。ポッド内のコンテナーがクラスター IP アドレスが同期されていないサービスにアクセスすると、アクセスはタイムアウトします。
たとえば、Apache Spark などのビッグデータシナリオでは、ポッドの作成直後に、ポッドはドライバーまたは他のサービスにアクセスする必要があります。CoreDNS のクラスター IP アドレスがサービス間で同期されていない場合、サービスへのアクセスはタイムアウトし、タスクは終了します。
この問題を解決するために、Elastic Container Instance では、システムがクラスター IP アドレスがサービス間で同期されるまで待機してからポッドを作成することができます。これにより、ポッド内のコンテナーがサービスにアクセスできるようになります。
この機能を有効にすると、クラスターに多数のサービスとサービスエンドポイントが含まれている場合、ポッドの起動時間が長くなります。
構成の説明
ポッドの構成ファイルのメタデータにアノテーションを追加して、クラスター IP アドレスがサービス間で同期された後にポッドが作成されるように構成できます。アノテーションは k8s.aliyun.com/eci-wait-clusterip-ready
です。値を *
に設定すると、クラスター IP アドレスがサービス間で同期された後にポッドが作成されます。
アノテーションは、ポッドの構成ファイルのメタデータに追加する必要があります。たとえば、Deployment を作成するときは、spec.template.metadata セクションにアノテーションを追加する必要があります。
Elastic Container Instance の機能を使用するには、Elastic Container Instance ベースのポッドを作成するときにのみアノテーションを追加できます。ポッドを更新するときにアノテーションを追加または変更しても、これらのアノテーションは有効になりません。
サンプル構成
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
labels:
app: test
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
name: nginx-test
labels:
app: nginx
annotations:
k8s.aliyun.com/eci-wait-clusterip-ready: "*" # クラスター IP アドレスがサービス間で同期されるまで、システムはポッドを起動しません。
spec:
containers:
- name: nginx
image: registry.cn-shanghai.aliyuncs.com/eci_open/nginx:1.14.2
ports:
- containerPort: 80