
- ライター:田中 勝也
- 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を使用できます。
図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を活用できる情報をブログで紹介したいと思います。
※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。