Google Kubernetes Engine の外部IPを指定する

Google Kubernetes Engineを用いてWebサービスを公開している場合、DNS設定する外部IPを同一のアドレスに固定する必要があります。

kubernetesのデフォルト挙動では、外部に公開しているServiceを設定変更するためにkubectl deletekubectl createすると新たなIPを取得して立ち上がります。

IP固定のために必要な準備

まず、Google CloudのWebコンソールから「静的」なIPを取得しておくことが前提となります。kubernetesの設定ファイルにこの固定アドレスを指定することで、IPを継続利用できます。

具体的な流れの例は以下のとおりです。

  1. Webコンソールの「ネットワーキング」カテゴリにある「外部IPアドレス」の画面で新規のスタティックIPアドレスを取得。
    • 種別はServiceの種類により異なる。LoadBalancerは「地域」、Ingressは作成方法に合わせて「グローバル」「地域」から選択
    • 種別が分からない場合には、一度IP指定せずにIngressを作成し、自動取得した外部IPをWebコンソールの設定変更により確保する手もある
  2. kubernetesのService設定ファイルにIPを指定する(記載例は後述)。
  3. 一般的なService作成の手順に沿って、kubectl create -f コマンドを実行
    • 割り当てられたIPは、kubectl get servicesコマンド出力の”EXTERNAL-IP”欄でも確認可能。

なお、静的IPアドレスは、インスタンスやネットワーク転送ルールに割り当てられていない(使われていない)状態だと時間課金されます。

Ingressの場合

Ingressを採用する場合には、マニフェストのmetadata.annotationsにリソース名を指定します。以下は抜粋した例です。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: <external-ip-name>

には、Webコンソールなどで指定した外部IPの名前を記述します。

LoadBalancerの場合

LoadBalancerを利用する場合、Serviceのspec.loadBalancerIPで指定できます。

apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  ports:
  - name: http
    port: 80
    targetPort: web-http
  selector: 
    name: web
  type: LoadBalancer
  loadBalancerIP: 192.168.0.1

LoadBalancerは、IPのリソース名ではなくIPアドレスを指定します。 設定ファイルを修正したら、kubectl createで再起動します。

まずServiceが起動したのち、1〜数分程度で外部IPを取得する挙動になります。この間、サービスへのアクセスは遮断された状態になります。

⁋ 2015/12/24↻ 2024/11/07
中馬崇尋
Chuma Takahiro