はじめに
先日OCI Native Ingress Controllerがリリースされました!
IngressはKubernetesにおけるL7ロードバランサーに相当するものです。
今までは、OCI NativeなIngress Controllerがなかったため、NIGNX Ingress ControllerなどのサードパーティのIngress Controllerに頼っていました。
そのため、例えばパスベースのルーティングやHTTPヘッダーによるルーティングを行うためにOKEのクラスタ内にリバースプロキシの役割を果たすPodをデプロイする必要がありました。
このOCI Native Ingress Controllerの登場により、OCI LoadBalancerの機能としてパスベースのルーティングやHTTPヘッダーによるルーティングを設定したり、TLS証明書をOCI証明書サービスと連携して管理したりということが可能になります。
つまり、OKEとOCI LoadBalancerおよびその関連リソースがよりシームレスに連携できるようになるということです。
この記事では、簡単にOCI Native Ingress Controllerの使い方を見ていきましょう。
事前準備
まずは事前準備を行なっていきます。
動的グループとポリシーの設定
まずは、OKEからLoad Balancerや証明書サービスのプロビジョニングや設定を行えるようにするためのインスタンスプリンシパルを設定します。
OCI Native Ingress Controllerではインスタンスプリンシパルもしくはユーザープリンシパル(鍵やパスワードなどのユーザ情報)のいずれかを利用して運用しますが、今回はインスタンスプリンシパルを利用します。
ユーザプリンシパルで設定を実施したい場合は、以下のドキュメントをご確認ください。
まずは以下の動的グループを作成します。
ここで作成する動的グループをNative-Ingress-Controller-Dyn-Group
とします。
今回は任意のコンパートメント配下にある全てのインスタンス(Worker Node)を対象とします。
よりセキュアに管理するには特定のWorker Nodeのみを対象とすることもできます。
ALL {instance.compartment.id = '<compartment-ocid>'}
次に作成した動的グループに対して以下のポリシーを設定します。
また、同様のポリシーが操作しているユーザグループにも必要です。
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to manage load-balancers in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to use virtual-network-family in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to manage cabundles in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to manage cabundle-associations in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to manage leaf-certificates in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to read leaf-certificate-bundles in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to manage certificate-associations in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to read certificate-authorities in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to manage certificate-authority-associations in compartment acme-oke-cluster-compartment
Allow dynamic-group Native-Ingress-Controller-Dyn-Group to read certificate-authority-bundles in compartment acme-oke-cluster-compartment
これで、動的グループとポリシーの設定は完了です。
ワークロードアイデンティティについて
OKEでの拡張クラスタではワークロードアイデンティティと呼ばれるPodレベルでのOCIリソースに対する認可がサポートされていますが、OCI Native Ingress Controllerでは2023/6時点でサポートされておりません。
OKEクラスタの構築
今回利用するOKEクラスタを構築します。
OCI Native Ingress Controllerを利用するには2023/6時点で以下の条件があります。
- 仮想ノード(Virtual Nodes)でないこと
- CNIにVCN Native Pod Networkingを使用していること
- Kubernetesバージョンがv1.25.4以上であること
OKEクラスタの作成は以下のチュートリアルを参考にしてください。
ここまでで事前準備は完了です。
OCI Native Ingress Controllerの動作確認
ここからOCI Native Ingress Controllerの動作確認を行なっていきます。
cert-managerのインストール
証明書サービスとの連携を行うためにcert-managerをインストールします。
PodのReadiness Gatesで利用するcert-managerをインストールします。
これはReadiness GatesをサポートするWebhookでのTLS通信に利用します。
kubectl apply -f https://github.com/jetstack/cert-manager/releases/latest/download/cert-manager.yaml
これでcert-managerのインストールは完了です。
OCI Native Ingress Controllerのインストール
まずはOCI Native Ingress Controllerをインストールします。
まずはGitHubからレポジトリをcloneします。
git clone https://github.com/oracle/oci-native-ingress-controller
helm/oci-native-ingress-controller/values.yaml
を編集します。
編集する箇所はcompartment_id
とsubnet_id
です。
subnet_id
にはOCI LoadBalancerで利用するサブネットのOCIDを定義します。
#
# OCI Native Ingress Controller
#
# Copyright (c) 2023 Oracle America, Inc. and its affiliates.
# Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
#
# Default values for oci-native-ingress-controller.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
controller_class: oci.oraclecloud.com/native-ingress-controller
lease_lock_name: oci-native-ingress-controller
compartment_id: "ocid1.compartment.oc1..aaaaaaaaw4afdnpdddddddddcnamvmrzgdq"
subnet_id: "ocid1.subnet.oc1.eu-frankfurt-1.aaaaaaaa4hwibdtrczy7mhddddddd6mx74j2kcnzaoleka"
====
編集が完了したら、helmを利用してインストールします。
helm install oci-native-ingress-controller helm/oci-native-ingress-controller
インストールされたことを確認します。
kubectl get pods -n native-ingress-controller-system --selector='app.kubernetes.io/name in (oci-native-ingress-controller)' -o wide
以下のように出力されれば問題ありません。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
oci-native-ingress-controller-58fc779658-8d658 1/1 Running 1 25h 10.0.10.97 10.0.10.105 <none> <none>
これでOCI Native Ingress Controllerのインストールは完了です。
IngressClassParametersとIngressClassのデプロイ
ここでは、IngressClassParametersとIngressClassという2つのリソースを確認します。
これを作成することにより、OCI LoadBalancerがプロビジョニングされます。
ただし、バックエンドセットは以降に作成するIngressを作成することにより、作成されます。
compartmentId
とsubnetId
は先ほどのvalues.yaml
と同じ値を設定します。
apiVersion: "ingress.oraclecloud.com/v1beta1"
kind: IngressClassParameters
metadata:
name: native-ic-params
spec:
compartmentId: "ocid1.compartment.oc1..aaaaaaaaw4afdnptbjyff7ojizzddddddrzgdq"
subnetId: "ocid1.subnet.oc1.eu-frankfurt-1.aaaaaaaa4hwibdtrczy7mhdhiwtxsddddkcnzaoleka"
loadBalancerName: "native-ic-lb"
isPrivate: false
maxBandwidthMbps: 10
minBandwidthMbps: 10
.spec.parameters
配下は環境に合わせてください。
今回はdefault
ネームスペースを利用します。
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: native-ic-ingress-class
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: oci.oraclecloud.com/native-ingress-controller
parameters:
scope: Namespace
namespace: default
apiGroup: ingress.oraclecloud.com
kind: ingressclassparameters
name: native-ic-params
kubectl apply -f IngressClassParameters.yaml
kubectl apply -f IngressClass.yaml
この2つのManifestをデプロイすると、OCI LoadBalancerがプロビジョニングされます。
これでIngressClassParametersとIngressClassのデプロイは完了です。
Ingressのデプロイ
Ingressをデプロイする前に以下のコマンドで適当なnginxサービスを作成しておきましょう。
kubectl run nginx1 --image nginx
kubectl run nginx2 --image nginx
kubectl expose pod nginx1 --target-port=80 --port=80
kubectl expose pod nginx2 --target-port=80 --port=81
最後にIngressをデプロイします。
これにより、先ほどプロビジョンビングされたOCI LoadBalancerにバックエンドセットやルーティングルールなどが設定されます。
今回は以下のようなルールを作成します。
-
/test:80
でアクセスするとnginx1
という名前のサービスに紐づけられた80番ポートで公開されているサービスにアクセス -
/sample:81
でアクセスするとnginx2
という名前のサービスに紐づけられた80番ポートで公開されているサービスにアクセス -
/test:80
または/sample:81
以外でアクセスされるとnginx1
という名前のサービスに紐づけられた80番ポートで公開されているサービスにアクセス
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
annotations:
oci-native-ingress.oraclecloud.com/healthcheck-port: "80"
spec:
ingressClassName: native-ic-ingress-class
rules:
- http:
paths:
- path: /test
pathType: Prefix
backend:
service:
name: nginx1
port:
number: 80
- path: /sample
pathType: Prefix
backend:
service:
name: nginx2
port:
number: 81
defaultBackend:
service:
name: nginx1
port:
number: 80
kubectl apply -f Ingress.yaml
これでIngressのデプロイは完了です。
動作確認
Ingressが作成されるとOCI LoadBalancerにバックエンドセットやルーティングルールが設定されます。
OCI LoadBalancerのステータスをOCIコンソールから見ると以下のようになります。
バックエンドセットに紐づいているIPアドレスはPodのIPアドレスです。
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx1 1/1 Running 0 76s 10.0.10.66 10.0.10.105 <none> <none>
nginx2 1/1 Running 1 26h 10.0.10.36 10.0.10.105 <none> <none>
そのため、OCI Native Ingress Controllerを利用するとkube-proxyなどを経由せずに直接LBからPodにアクセス可能なため、余分なホップを回避できます。
ちなみに、OCI Native Ingress Controllerを利用しない場合はWorker Node(Compute)のIPアドレスになっています。
まとめ
このようにOCI Native Ingress Controllerを利用すると今まで実現できなかったOCI LoadBalancerでのルーティングポリシーの設定やよりホップ数の少ないルーティングが可能になります。
後日OCI Native Ingress ControllerとOCI証明書サービスの連携を行う記事も公開しようと思います。
参考資料