一部のビジネスシナリオでは、ビジネスポッドは固定 IP アドレスを使用する必要があります。このトピックでは、固定 IP アドレスを使用するように Elastic Container Instance ポッドを設定する方法について説明します。
機能の説明
デフォルトでは、Elastic Container Instance ポッドを作成すると、システムは eci-profile で指定された vSwitch CIDR ブロックからポッドにランダムに IP アドレスを割り当てます。ポッドに障害が発生して解放された場合、IP アドレスも解放され、新しいインスタンスには新しい IP アドレスが割り当てられます。サービスの IP アドレスが公開されるシナリオなど、一部のビジネスシナリオでは、ポッドは固定 IP アドレスを使用する必要があります。ポッドに固定 IP アドレスが割り当てられていない場合、ビジネスに影響が出ます。
前述のシナリオでは、Elastic Container Instance は固定 IP アドレスをサポートしています。Elastic Container Instance ポッドの作成時にこの機能を有効にすると、システムは指定された vSwitch CIDR ブロックから 2 つの IP アドレスを割り当てます。1 つの IP アドレスは動的 IP アドレスで、クラスター内では認識できません。もう 1 つの IP アドレスは固定 IP アドレスです。ポッドが解放された後、システムはポッドの固定 IP アドレスを保持します。有効期間内(デフォルトでは 48 時間)、作成するポッドのクラスター ID、名前空間、ポッド名と、解放されたポッドのクラスター ID、名前空間、ポッド名が同じで、解放されたポッドと新しいポッドの両方で固定 IP アドレスを使用する機能が有効になっている場合、システムは保持されている IP アドレスを新しいポッドに割り当てます。このようにして、同じビジネス要件を満たすポッドは同じ IP アドレスを使用します。
このシナリオでは、StatefulSet を使用してサービスをデプロイできます。StatefulSet に含まれるポッドが解放された後、システムは解放されたポッドと同じ名前を持ち、同じ名前空間にデプロイされた新しいポッドを自動的に作成します。
構成の説明
ポッドのメタデータにアノテーションを追加して、ポッドが固定 IP アドレスを使用するように設定し、固定 IP アドレスがアイドル状態になった後の固定 IP アドレスの保持期間を設定できます。次の表に、アノテーションを示します。
アノテーション | 例 | 説明 |
k8s.aliyun.com/eci-fixed-ip | "true" | ポッドが固定 IP アドレスを使用するように設定するかどうかを指定します。 |
k8s.aliyun.com/eci-fixed-ip-retain-hour | "24" | 元のポッドが解放され、固定 IP アドレスがアイドル状態になった後の固定 IP アドレスの保持期間を指定します。単位:時間。 アノテーションを設定しない場合、固定 IP アドレスはデフォルトで 48 時間保持されます。 |
構成例
Service と StatefulSet を作成します。
kubectl apply -f fixedIp.yaml
次の例は、Service と StatefulSet を作成する fixedIp.yaml の内容を示しています。StatefulSet には、固定 IP アドレスを有効にするポッドが含まれています。
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" minReadySeconds: 10 template: metadata: annotations: k8s.aliyun.com/eci-fixed-ip: "true" # 固定 IP アドレスを有効にします。 labels: app: nginx alibabacloud.com/eci: "true" spec: containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 ports: - containerPort: 80 name: web
次のコマンドを実行して、ポッドのステータスを監視します。
kubectl get pod -o wide -w
次のサンプルレスポンスは、StatefulSet に web-0 という名前のポッドが含まれていることを示しています。ポッドの IP アドレスは 172.16.0.129 です。
新しい CLI ターミナルを開いて、クラスターに接続します。次のコマンドを実行して、StatefulSet からポッドを削除します。
kubectl delete pod web-0
前の CLI ターミナルに戻り、ポッドのステータスの変更を引き続き監視します。
次の例は、新しいレスポンスを示しています。ポッドが削除されると、StatefulSet は自動的に新しいポッドを作成します。新しいポッドの IP アドレスは、削除されたポッドの IP アドレスと同じです。
説明元のポッドは、完全に削除されるまで IP アドレスを占有します。これは、新しいポッドの作成速度に影響します。