Google Kubernetes Engineを用いてWebサービスを公開している場合、DNS設定する外部IPを同一のアドレスに固定する必要があります。
kubernetesのデフォルト挙動では、外部に公開しているServiceを設定変更するためにkubectl delete
→kubectl create
すると新たなIPを取得して立ち上がります。
IP固定のために必要な準備
まず、Google CloudのWebコンソールから「静的」なIPを取得しておくことが前提となります。kubernetesの設定ファイルにこの固定アドレスを指定することで、IPを継続利用できます。
具体的な流れの例は以下のとおりです。
- Webコンソールの「ネットワーキング」カテゴリにある「外部IPアドレス」の画面で新規のスタティックIPアドレスを取得。
- 種別はServiceの種類により異なる。
LoadBalancer
は「地域」、Ingress
は作成方法に合わせて「グローバル」「地域」から選択 - 種別が分からない場合には、一度IP指定せずにIngressを作成し、自動取得した外部IPをWebコンソールの設定変更により確保する手もある
- 種別はServiceの種類により異なる。
- kubernetesのService設定ファイルにIPを指定する(記載例は後述)。
- 一般的なService作成の手順に沿って、
kubectl create -f
コマンドを実行- 割り当てられたIPは、
kubectl get services
コマンド出力の”EXTERNAL-IP”欄でも確認可能。
- 割り当てられた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>
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/12/18
中馬崇尋
Chuma Takahiro
Chuma Takahiro