CISを用いたオンプレミスKubernetesクラスタのService公開について - Part 3

はじめに

今回の記事ではCISとNGINX Ingress Controllerを組み合わせた場合の設定について解説していきます。
Part1の記事でCISのデプロイ手順を解説していますので、完了していない場合はまずそちらを実施の上で進めて下さい。

【前回の記事】
CISを用いたオンプレミスKubernetesクラスタのService公開について - Part 1

IngressLinkとは?



BIG-IPと
NGINX Ingress Controllerを組み合わせて、Serviceを外部へ公開するためのソリューションです。
BIG-IPのみ
でServiceを公開するオプションと比較して以下のメリットがあります。

  • L4/L7の作業分解点を明確化
    BIG-IPではファイアウォール、DDoS対策、IPSといったL4までの処理や
    SSL復号化等の負荷が大きい処理を行い、NGINX Ingress Controllerへトラフィックを送ります。
    NGINX Ingress ControllerではURLのパスベースルーティングや認証/WAF等の

    L7に関した処理を行う事で、開発者がアプリケーションの開発に集中出来る環境を実現します。
  • 他のCISの公開オプションと比較してBIG-IPの負荷を軽減
    大規模なKubernetesデプロイメントの場合、Serviceの設定変更が大量に発生することで
    APIコールを受けるBIG-IPの
    パフォーマンスに影響が起こる可能性があります。
    一方、Ingress LinkではNGINX Ingress ControllerをBIG-IPの宛先としてトラックするため
    設定変更がほぼ発生せず、BIG-IPのパフォーマンスへの影響は少なくなります。

IngressLinkの環境要件
・NGINX Ingress Controllerが動作していること
 インストール手順は以下のドキュメントをご参照下さい。

Installation with Manifests

https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-manifests/

Installation with Helm
https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/

・CISをCRD optionを有効にしてデプロイしておくこと
 Part1の記事でHelmチャートをインストールする際に使用したvalues.yamlファイルに
 "custom-resource-mode: true"オプションを追加して再インストールします。
 本オプションを有効にしてデプロイした場合、Ingress/Routes/ConfigMapsの設定には対応しない為ご注意下さい。

bigip_login_secret: bigip-login
rbac:
  create: true
serviceAccount:
  create: true
  name:
ingressClass:
  create: true
  ingressClassName: f5
  isDefaultIngressController: true
namespace: kube-system
args:
  bigip_url: 172.28.14.104
  bigip_partition: kubernetes
  insecure: true
  custom-resource-mode: true
image:
  user: f5networks
  repo: k8s-bigip-ctlr
  pullPolicy: Always
resources: {}
version: latest

・CRD schemaをインストールしておくこと
下記URLよりファイルを保存して、以下のコマンドで展開しておきます。
https://raw.githubusercontent.com/F5Networks/k8s-bigip-ctlr/master/docs/config_examples/customResourceDefinitions/customresourcedefinitions.yml

# kubectl apply -f customresourcedefinitions.yaml

・CISのレポジトリをクローンしておくこと
以下のコマンドでCISのレポジトリをクローンして該当ディレクトリへ移動して下さい。
gitがインストールされていない場合は、必要に応じてインストールして頂くようお願い致します。

# git clone https://github.com/F5Networks/k8s-bigip-ctlr.git
# cd k8s-bigip-ctlr/docs/config_examples/customResource/IngressLink/

・IngressLink用のCRD schemaをインストールしておくこと
CISのレポジトリへ移動後、下記のコマンドを実行して下さい。

# kubectl apply -f docs/config_examples/customResourceDefinitions/customresourcedefinitions.yml

・BIG-IPでiRuleを作成
BIG-IP GUIへログイン後、Local Traffic -> iRules  -> Createより
以下のiRuleを"Proxy_Protocol_iRule"という名前で作成して下さい。
 
クライアントのオリジナルIPアドレスをpodに通知するための設定となります。

# PROXY Protocol Receiver iRule
# iRule used for F5 IngressLink
# Layer 4 irule since BIG-IP is passthrough

when CLIENT_ACCEPTED {
    set proxyheader "PROXY "
    if {[IP::version] eq 4} {
        append proxyheader "TCP4 "
    } else {
        append proxyheader "TCP6 "
    }
    append proxyheader "[IP::remote_addr] [IP::local_addr] [TCP::remote_port] [TCP::local_port]\r\n"
}

when SERVER_CONNECTED {
    TCP::respond $proxyheader
}

IngressLinkの設定
CISのレポジトリへ移動後、以下のテストアプリケーションを展開します。
内容はIngressとしてNGINX Ingress Controllerを指定してサービスを公開するシンプルなアプリケーションです。

# kubectl apply -f docs/config_examples/customResource/IngressLink/ingress-example/cafe-secret.yaml
# kubectl apply -f docs/config_examples/customResource/IngressLink/ingress-example/cafe.yaml
# kubectl apply -f docs/config_examples/customResource/IngressLink/ingress-example/cafe-ingress.yaml

続いて以下のコマンドでIngressLinkを作成します。

# kubectl apply -f docs/config_examples/customResource/IngressLink/ingresslink.yaml

ingresslink.yamlファイルは以下の内容で設定して下さい。
VirtualServerAddress : BIG-IPのVirtual ServerのIPアドレスを入力して下さい。
matchLabels          : NGINX Ingress ControllerのLabelを設定して下さい。

apiVersion: "cis.f5.com/v1"
kind: IngressLink
metadata:
  name: nginx-ingress
spec:
  virtualServerAddress: "192.168.10.5"
  host: cafe.example.com
  iRules:
    - /Common/Proxy_Protocol_iRule
  selector:
    matchLabels:
      app.kubernetes.io/name: my-release-nginx-ingress

BIG-IPのkubernetes Partitionに設定した内容に伴い、設定が作成されている事を確認します。
今回の環境ではIngress ControllerはReplica数を1でデプロイしているので、Poolのヘルスチェックは1つのみ成功しています。




まとめ
以上の手順でIngressLinkの設定は終了となります。
Part1-3でご紹介した通り、CISでは様々な手法でKubernetes内のServiceを公開出来ますので是非試してみて下さい。

Published Sep 30, 2022
Version 1.0
No CommentsBe the first to comment