一部のアプリケーションでは、Pod が一貫した IP アドレスを維持する必要があります。このトピックでは、Elastic Container Instance (ECI) Pod で固定 IP アドレスを使用するように設定する方法について説明します。
仕組み
デフォルトでは、ECI Pod を作成すると、システムは eci-profile で指定された vSwitch の CIDR ブロックからランダムな IP アドレスを Pod に割り当てます。障害によって Pod がリリースされると、システムはその IP アドレスを解放し、置き換え後の Pod に新しい IP アドレスを割り当てます。サービスが IP アドレスによって直接公開される場合など、特定のシナリオでは、業務継続性を確保するために Pod に固定 IP アドレスが必要になることがあります。
これらのシナリオに対応するため、ECI は固定 IP アドレス機能を提供します。この機能を有効にして ECI Pod を作成すると、システムは設定された vSwitch から 2 つの IP アドレス (クラスター内からは見えない動的 IP アドレスと、固定 IP アドレス) を割り当てます。Pod がリリースされた後、システムはその固定 IP アドレスを特定の期間 (デフォルトでは 48 時間) 保持します。この保持期間内に、リリースされた Pod と同じクラスター ID、名前空間、Pod 名を持ち、かつ固定 IP アドレス機能が有効になっている新しい Pod が作成された場合、システムは保持されていた IP アドレスを新しい Pod に割り当てます。これにより、Pod の IP アドレスの一貫性が確保されます。
このシナリオでは、StatefulSet を使用してアプリケーションをデプロイできます。StatefulSet 内の Pod がリリースされると、システムは同じ名前空間と Pod 名を持つ新しい Pod を自動的に作成します。
設定
Pod のメタデータにアノテーションを追加して、固定 IP アドレス機能を有効にし、固定 IP アドレスの保持期間を設定します。次の表に、アノテーションについて説明します。
|
アノテーション |
例 |
説明 |
|
k8s.aliyun.com/eci-fixed-ip |
"true" |
固定 IP アドレス機能を有効にするには、 |
|
k8s.aliyun.com/eci-fixed-ip-retain-hour |
"24" |
Pod がリリースされた後、固定 IP アドレスを保持する時間数。 省略した場合、デフォルトは 48 時間です。 |
操作手順
-
Service と StatefulSet を作成します。
kubectl apply -f fixedIp.yaml次の
fixedIp.yamlファイルは、Service と StatefulSet を定義します。StatefulSet には、固定 IP アドレス機能を有効にするアノテーションを持つ ECI Pod が含まれています。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 -
次のコマンドを実行して、Pod のステータスの変化を監視します。
kubectl get pod -o wide -w出力から、StatefulSet が
web-0という名前の Pod を作成し、その IP アドレスが172.16.0.129であることがわかります。d:~$ kubectl get pod -o wide -w NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 0/1 Pending 0 9s <none> <none> <none> <none> web-0 0/1 Pending 0 20s <none> <none> <none> <none> web-0 0/1 Pending 0 20s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Pending 0 20s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 ContainerCreating 0 69s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 1/1 Running 0 76s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> -
新しいターミナルを開いてクラスターに接続し、次のコマンドを実行して StatefulSet 内の Pod を削除します。
kubectl delete pod web-0 -
最初のターミナルに戻り、Pod のステータスの変化を引き続き監視します。
出力から、元の Pod が削除された後、StatefulSet が元の IP アドレスを再利用する新しい Pod を自動的に作成することがわかります。
説明前の Pod が完全に削除されるまで IP アドレスが占有されたままになるため、新しい Pod の作成が遅れる場合があります。
1:~$ kubectl get pod -o wide -w NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES web-0 0/1 Pending 0 9s <none> <none> <none> <none> web-0 0/1 Pending 0 20s <none> <none> <none> <none> web-0 0/1 Pending 0 20s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Pending 0 20s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 ContainerCreating 0 69s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 1/1 Running 0 76s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 1/1 Terminating 0 2m37s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Terminating 0 2m39s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Terminating 0 2m55s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Terminating 0 2m55s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Pending 0 0s <none> <none> <none> web-0 0/1 Pending 0 0s <none> <none> <none> web-0 0/1 Pending 0 1s <none> <none> <none> web-0 0/1 Pending 0 1s <none> <none> <none> web-0 0/1 Pending 0 17s <none> <none> <none> web-0 0/1 Pending 0 17s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 Pending 0 17s <none> virtual-kubelet-cn-beijing-h <none> <none> web-0 0/1 ContainerCreating 0 69s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none> web-0 1/1 Running 0 76s 172.16.0.129 virtual-kubelet-cn-beijing-h <none> <none>