ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

F5 BIG-IPとF5 NGINX Ingress Controller連携でKubernetes環境の通信制御

ライター:田中 勝也
WAN最適化や帯域制御分野などの技術担当を経て、ADC(Application delivery controller)分野の製品及びSSL/TLS、Webアプリケーション、DNS セキュリティなどのテクノロジーの評価・検証・技術支援を担当

目次

はじめに

Kubernetesクラスタ内で稼働しているPodを外部に公開する場合は、Kubernetesクラスタ内でServiceリソースやIngressリソースなどを設定し、さらに外部ロードバランサでKubernetesクラスタまでリクエストを転送する必要があります。

Kubernetesクラスタ内でServiceリソースやIngressリソースを設定する部分は、こちらの記事でF5 NGINX Ingress Controllerを使用した方法を紹介しました。今回は外部ロードバランサでKubernetesクラスタまでリクエストを転送する部分について、F5 BIG-IPとF5 Container Ingress Servicesを使用した方法を紹介します。

Kubernetesと連携する外部ロードバランサの課題

Kubernetesクラスタ内のServiceリソースやIngressリソースは、設定するたびに公開するポート番号が変わるため、外部ロードバランサは転送先のポート番号を合わせる必要があります。Kubernetes利用者はKubernetesクラスタ内で設定変更する際に、ロードバランサ担当へ設定変更を依頼して、Kubernetes利用者とロードバランサ担当が連携して作業が必要です。ロードバランサ担当は、Kubernetesクラスタ内の設定や状況を把握して設定変更が必要です。Kubernetes利用者とロードバランサ担当で担当間の調整に時間がかかります。

F5 BIG-IPとF5 Container Ingress Services

この課題を解決するために、外部ロードバランサとしてF5 BIG-IPを利用し、F5 BIG-IPとKubernetesクラスタ内のF5 NGINX Ingress Controllerを連携するためにF5 Container Ingress Servicesを使用できます。

f5bigip_nginx_cis01.png図1 構成

F5 Container Ingress ServicesはKubernetesクラスタ内で動作します。Kubernetesクラスタ内の状況を監視して、マニフェストでF5 BIG-IPの設定を行うことができます。
下記のマニフェストを適用した場合の例を紹介します。

apiVersion: "cis.f5.com/v1"
kind: TLSProfile
metadata:
  name: tlsprofile1
  labels:
    f5cr: "true"
spec:
  tls:
    termination: edge
    clientSSL: /Common/clientssl
    reference: bigip
---
apiVersion: cis.f5.com/v1
kind: Policy
metadata:
  name: policy1
  labels:
    f5cr: "true"
spec:
  profiles:
    logProfiles:
      - "/Common/Log all requests"
---
apiVersion: "cis.f5.com/v1"
kind: VirtualServer
metadata:
  name: color-vs-https
  labels:
    f5cr: "true"
spec:
  host:
  virtualServerAddress: "10.44.73.100"
  tlsProfileName: tlsprofile1
  waf: /Common/waf1
  policyName: policy1
  iRules:
    - /Common/Proxy_Protocol_iRule
  pools:
  - path:
    service: nginx-ingress-ingresslink
    servicePort: 80
    monitor:
      name: /Common/tcp
      reference: bigip
  serviceAddress:
  - icmpEcho: "enable"
    arpEnabled: true
    routeAdvertisement: "all"

このマニフェストを適用すると、F5 Container Ingress ServicesがF5 BIG-IPに下記の設定を行います。

図2 Virtual Server設定

図3 Pool Member設定

図4 Security Policy設定

F5 BIG-IPにVirtual ServerやPoolの設定が追加されました。Virtual Serverでアクセスを受け付けるとSSL Offload機能で暗号化されたHTTPS通信を平文のHTTP通信に復号してWAF機能でチェックします。その後に、Kubernetesクラスタ内のF5 NGINX Ingress Controllerで待ち受けているポート宛てに負荷分散を行う設定になりました。F5 BIG-IPは外部公開したいPodやService宛てに直接転送ではなく、F5 NGINX Ingress ControllerのService宛てに転送する設定になるため、Kubernetesクラスタ内の通信制御はF5 NGINX Ingress Controllerに任せることができます。

クライアントからF5 BIG-IPのVirtual Server宛てにアクセスをすると、Podのレスポンスが返ってきます。

[root@vm1 color]# curl https://www.color.local/red/ --resolve www.color.local:443:10.44.73.100 -k
Server address: 192.168.2.24:80
Server name: red-6d888d6b84-9twcf
Date: 23/Mar/2023:03:06:40 +0000
URI: /red/
Request ID: 23367edd7612d543113bdf649170cd9b
[root@vm1 color]# curl https://www.color.local/red/ --resolve www.color.local:443:10.44.73.100 -k
Server address: 192.168.2.18:80
Server name: red-6d888d6b84-4hqzw
Date: 23/Mar/2023:03:06:43 +0000
URI: /red/
Request ID: 924e81bc3e6a5bc9c5bd34978b038608
[root@vm1 color]#

クライアントからF5 BIG-IPのVirtual Server宛てに不正なコードが含まれるアクセスをすると、F5 BIG-IPのWAF機能でブロックできます。

[root@vm1 color]# curl https://www.color.local/red/【不正なコードの記載は省略】 --resolve www.color.local:443:10.44.73.100 -k
<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. Please consult with your administrator.<br><br>Your support ID is: 861519561395011792<br><br><a href='javascript:history.back();'>[Go Back]</a></body></html>[root@vm1 color]#
[root@vm1 color]#

F5 Container Ingress ServicesがF5 BIG-IPの分散先などを自動的に設定してくれるため、BIG-IP担当はKubernetesクラスタ内の把握や分散先を手動で設定する必要がなくなり、WAFやSSL/TLSなどのセキュリティ対応に注力できます。Kubernetes利用者は、マニフェストでWAFポリシーなどを定義するだけで設定変更の作業が可能になり、変更作業ごとのBIG-IP担当との調整が不要になります。Kubernetes利用者とBIG-IP担当の役割を明確に分離でき、運用を効率化することができます。

おわりに

今回はF5 Container Ingress Servicesを使って、F5 BIG-IPとF5 NGINX Ingress Controller連携の方法を紹介しました。今後も機会があれば、F5 BIG-IPやF5 NGINX Ingress Controllerを活用できる情報をブログで紹介したいと思います。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND