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を" 作成して下さい。
クライアントのオリジナル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を公開出来ますので是非試してみて下さい。