VPC環境で利用できます。
Gateway API を使用すると Kubernetesの GatewayClass、Gateway、HTTPRouteリソースで Application Load Balancer(ALB)インスタンスを作成し、HTTP/HTTPSトラフィックをルーティングできます。
Gateway APIを利用した ALB連携は、Kubernetes 1.36以上のクラスタから Add-onで提供されます。NKSコンソールの Add-onで Gateway API Add-onを有効にすると使用できます。
- Gateway APIで作成された Load Balancerは Kubernetesリソースで管理されます。
- Load Balancerをコンソールまたは APIで直接変更すると、Kubernetesリソースと Load Balancerステータスが異なることがあります。設定変更が必要な場合、Kubernetesリソースを変更します。
- コンソールまたは APIを用いた直接変更によって発生した問題には、テクニカルサポートを提供しません。
- Gateway APIで使用するデフォルト GatewayClass名は、
ncloud-albです。 - Gateway APIに接続する backend Serviceは、
NodePortタイプである必要があります。
事前準備と有効化
Gateway API Add-onを有効にする時、クラスタに Gateway API CRDがないと Add-onが自動的にインストールされ、既にインストールされている場合は既存の CRDをそのままにしてインストールをスキップします。CRDを直接インストールする必要はありません。
lb-controllerは gateway.networking.k8s.io/v1 APIを使用し、他の namespaceの Serviceを backendに接続する時に使用する ReferenceGrantも v1として参照します。ReferenceGrantは Gateway API v1.6.0より v1で提供されるため、Add-onは Gateway API v1.6.0(Standard channel) CRDをインストールします。
NKSコンソールの Add-onで Gateway API Add-onを有効にします。Add-onを有効にすると gateway-adapterコントローラと一緒に次のリソースが自動的に作成されます。
- GatewayClass
ncloud-alb
有効化が完了したら次のコマンドで ncloud-alb GatewayClassが準備されているか確認できます。
kubectl get gatewayclass ncloud-alb
- Add-onは既にインストールされた Gateway API CRDを上書き・アップグレードしません。既存にインストールされた CRDバージョンが v1.6.0未満の場合は、
ReferenceGrantがv1で提供されないために他の namespaceの Serviceを backendに使用する機能が動作しません。そのため、必要に応じて CRDを v1.6.0以上に直接アップグレードしてください。
サポート範囲
| 項目 | サポートの有無 | 説明 |
|---|---|---|
| GatewayClass | サポート | デフォルト GatewayClass名は ncloud-alb |
| Gateway | サポート | HTTP、HTTPS Listenerを使用可能 |
| HTTPRoute | 部分的なサポート | Host、Path、Header exact match、weighted backendRefsをサポート |
| ReferenceGrant | サポート | 他の namespaceの Serviceを backendに使用する時に必要 |
| Backend Service | NodePortのみサポート | ClusterIP、LoadBalancer、ExternalName タイプの Serviceは backendに使用不可 |
| HTTPS | サポート | NCP Certificate Managerの証明書番号を使用 |
| LoadBalancerTemplate | サポート | Gateway API標準フィールドで表現しにくい ALBプロパティを設定する時に使用 |
次の項目はサポートしない、または制限的にサポートします。詳細は、Gateway API 未サポートフィールドをご参照ください。
- TCPRoute, UDPRoute, TLSRoute, GRPCRoute
- Secretベースの TLS証明書を参照
- TLS passthrough
- RequestRedirect、URLRewriteなどの HTTPRoute filter
- Query parameter match, method match
- 正規表現ベースの Pathまたは Header match
- Gateway API session persistence
Gateway作成
Gateway APIで ALBを作成するには、Service、Gateway、HTTPRouteを作成します。
Service作成
Gateway APIで backendに使用する Serviceは、NodePort タイプである必要があります。
apiVersion: v1
kind: Service
metadata:
name: web
spec:
type: NodePort
selector:
app: web
ports:
- port: 80
targetPort: 80
nodePort: 30080
Gatewayと HTTPRouteの作成
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: web
spec:
gatewayClassName: ncloud-alb
listeners:
- name: http
port: 80
protocol: HTTP
---
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: web
spec:
parentRefs:
- name: web
hostnames:
- example.com
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: web
port: 80
LoadBalancerTemplate設定
LoadBalancerTemplateは Gateway API標準フィールドで表現しにくい NCP ALBプロパティを設定するリソースです。プライベート ALB、Subnet、Load Balancerサイズ、HTTPS証明書番号、Target Groupヘルスチェック、Sticky Sessionなどを設定できます。
LoadBalancerTemplateはオプション事項です。GatewayClass ncloud-albには、parametersRefが設定されていないため、LoadBalancerTemplateを参照せずに Gatewayを作成すると、 ALBはパブリック(PUBLIC)タイプとしてクラスタの基本 Load Balancer Subnetに作成されて、他のプロパティにはフィールドデフォルト値表のデフォルト値が適用されます。
LoadBalancerTemplateは次の位置でご参照ください。
| 参照位置 | 用途 | 備考 |
|---|---|---|
GatewayClass.spec.parametersRef |
クラスタのデフォルト ALB設定 | クラスタ共通のデフォルト値が必要な場合に運用者が構成 |
Gateway.spec.infrastructure.parametersRef |
Gateway別 ALB設定 | Gatewayと同じ namespaceの LoadBalancerTemplateを参照 |
Gatewayで個別設定を適用するには、Gatewayと同じ namespaceに LoadBalancerTemplateを作成した後、Gateway.spec.infrastructure.parametersRefとして参照します。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: web-template
spec:
networkType: PUBLIC
size: SMALL
idleTimeoutSeconds: 60
accessLogEnabled: false
defaults:
targetGroup:
protocol: HTTP
algorithmType: RR
healthCheck:
protocol: HTTP
method: GET
path: /
port: 0
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: web
spec:
gatewayClassName: ncloud-alb
infrastructure:
parametersRef:
group: loadbalancer.vnks.ncloud.com
kind: LoadBalancerTemplate
name: web-template
listeners:
- name: http
port: 80
protocol: HTTP
LoadBalancerTemplateの全仕様
LoadBalancerTemplateの spec フィールドはすべて選択項目です。次は、使用できる全フィールドをまとめた全体構造であり、指定していないフィールドにはフィールドデフォルト値表にまとめたデフォルト値が適用されます。
コメントアウトの 기본값は当該フィールドを省略した時に適用される値であり、자동は固定値ではなく省略時のクラスタ設定(ncloud-config)・NCPサーバデフォルト値・コントローラ派生値のうち、1つが決定されることを意味します。フィールド別の具体的な意味は、フィールドデフォルト値表をご参照ください。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: full-template
spec:
# ---Load Balancerインフラプロパティ---
name: my-alb # provider LB名・デフォルト値: 自動(<Gateway namespace>-<Gateway名>)
networkType: PUBLIC # PUBLIC | PRIVATE・デフォルト値: PUBLIC
size: SMALL # SMALL | MEDIUM | LARGE | XLARGE・デフォルト値: 自動
description: 「example template」 # LBの説明・デフォルト値: "Managed by Gateway <namespace>/<name>"
idleTimeoutSeconds: 60 #未使用接続維持時間(秒)、1~3600・デフォルト値: 60
accessLogEnabled: false # ALBアクセスログの使用有無・デフォルト値: false
skipAcgUpdate: true # LB作成時の ACGアップデートの省略有無・デフォルト値: false
lbSubnetIds: # LBを配置する Subnet IDリスト・デフォルト値: 自動(クラスタのデフォルト LB Subnet)
- 12345
publicIpInstanceNo: 123456 # PUBLIC LBに接続するパブリック IPアドレスのインスタンス番号・デフォルト値: 自動(自動割り当て)
retainPublicIpOnTermination: false # LB削除時のパブリック IPアドレスの保存有無・デフォルト値: false
# ---全 Listenerに共通して適用されるデフォルト値---
defaults:
http2Enabled: false # HTTP/2使用有無・デフォルト値: false
sslRedirectPort: 0 # 0より大きい場合、HTTP→HTTPSリダイレクトルールを自動作成・デフォルト値: 0(無効化)
aclId: 0 # 接続する ACL ID、0の場合は未使用・デフォルト値: 0
targetGroup:
protocol: HTTP # HTTP | HTTPS・デフォルト値: HTTP
algorithmType: RR # RR | LC | SIPHS・デフォルト値: RR
stickySession: false # Sticky Session使用有無・デフォルト値: false
proxyProtocol: false # ALB Gatewayでは true使用不可・デフォルト値: false
healthCheck:
protocol: HTTP # HTTP | HTTPS・デフォルト値: HTTP
method: GET # GET | HEAD・デフォルト値: GET
path: / # ヘルスチェックパス・デフォルト値: /
port: 0 # 0の場合は traffic-port使用・デフォルト値: 0
intervalSeconds: 30 # ヘルスチェック間隔(秒)・デフォルト値: 30
healthyThresholdCount: 2 # 正常判定の連続成功数・デフォルト値: 2
unhealthyThresholdCount: 2 # 異常判定の連続失敗数・デフォルト値: 2
# ---特定ポート Listenerにのみ適用される個別設定(defaultsオーバーライド)---
listeners:
- port: 443 # (必須)設定を適用する Gateway Listenerポート、1~65535
protocol: HTTPS # (必須)HTTP | HTTPS
http2Enabled: true # デフォルト値: defaults.http2Enabled値
sslRedirectPort: 0 # デフォルト値: defaults.sslRedirectPort値
aclId: 12345 # デフォルト値: defaults.aclId値
tls: # protocol: HTTPSの時に使用
certificateNos: # (HTTPS時に必須) NCP Certificate Manager証明書番号
- 123456
minVersion: TLSV12 # TLSV10 | TLSV11 | TLSV12 | TLSV13 デフォルト値: TLSV10
cipherSuiteList: # 許可する暗号化スイートリスト デフォルト値: 自動
- TLS_RSA_WITH_AES_128_GCM_SHA256
targetGroup: # この Listenerの TG設定・デフォルト値: defaults.targetGroup値
protocol: HTTP
algorithmType: RR
stickySession: false
healthCheck:
protocol: HTTP
method: GET
path: /
rules: # この Listenerのルーティングルール(条件・アクション)・指定時に HTTPRoute作成ルールを代替
- priority: 1 # (必須)評価優先順位、1~10000(低いほど先に評価)
conditions: # マッチング条件・複数のタイプを組み合わせる場合、AND・タイプ別1つ(同じタイプの重複不可)
- type: HostHeader # HostHeader | PathPattern | HttpHeader・必要なタイプのみ指定
hostHeader:
values: ["api.example.com"] # 複数値の場合は OR
- type: PathPattern
pathPattern:
values: ["/old", "/old/*"]
- type: HttpHeader
httpHeader:
headerName: X-Env
values: ["canary"]
action: # (必須)
type: Redirect # ForwardTargetGroup | Redirect
redirect: # type: Redirectの時に使用
protocol: HTTPS # HTTP | HTTPS
port: "443" # Redirect時にポート指定が必要
statusCode: "301" # 301 | 302
# host/path/query未指定時に従来のリクエスト値を維持
# forwardTargetGroup: # type: ForwardTargetGroupの時に使用
# targets:
# - {targetGroupName: <컨트롤러 자동 생성 TG 이름>, weight: 1}
# enableStickySession: false
spec.defaultsと spec.listeners[]は共通フィールド(http2Enabled、sslRedirectPort、aclId、targetGroup)を同様に使用し、tlsと rulesは spec.listeners[]でのみ指定できます。特定のポートにのみ異なる値を適用したい場合に spec.listeners[]を作成します。
フィールドデフォルト値
指定していないフィールドには、次の表のデフォルト値が適用されます。자동は固定値ではなく省略時のクラスタ設定(ncloud-config)・NCPサーバデフォルト値・コントローラ派生値の中から1つが決定されることを意味します。また、フィールド別の出典は各行のデフォルト値・説明に表記しました。
| フィールド | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
name |
string | 自動 |
|
networkType |
string | PUBLIC |
|
size |
string | 自動(NCPサーバデフォルト値) |
|
description |
string | Managed by Gateway <namespace>/<name> |
Load Balancer説明 |
idleTimeoutSeconds |
int | 60 |
|
accessLogEnabled |
bool | false |
ALBアクセスログの使用有無 |
skipAcgUpdate |
bool | false |
|
lbSubnetIds |
[]int | 自動 |
|
publicIpInstanceNo |
int | 自動 |
|
retainPublicIpOnTermination |
bool | false |
Load Balancerの削除時にパブリック IPアドレスの保存有無 |
defaults.http2Enabled |
bool | false |
|
defaults.sslRedirectPort |
int | 0 |
0より大きい場合、HTTP→HTTPSリダイレクトルールを自動作成 |
defaults.aclId |
int | 0 |
|
defaults.targetGroup.protocol |
string | HTTP |
|
defaults.targetGroup.algorithmType |
string | RR |
|
defaults.targetGroup.stickySession |
bool | false |
Sticky Sessionの使用有無 |
defaults.targetGroup.proxyProtocol |
bool | false |
|
defaults.targetGroup.healthCheck.protocol |
string | HTTP |
|
defaults.targetGroup.healthCheck.method |
string | GET |
|
defaults.targetGroup.healthCheck.path |
string | / |
HTTP/HTTPSのヘルスチェックパス |
defaults.targetGroup.healthCheck.port |
int | 0 |
|
defaults.targetGroup.healthCheck.intervalSeconds |
int | 30 |
ヘルスチェック間隔(秒) |
defaults.targetGroup.healthCheck.healthyThresholdCount |
int | 2 |
正常判定の連続成功数 |
defaults.targetGroup.healthCheck.unhealthyThresholdCount |
int | 2 |
異常判定の連続失敗数 |
listeners[].port |
int | (必須) |
|
listeners[].protocol |
string | (必須) |
|
listeners[].tls.certificateNos |
[]int | (HTTPS時に必須) | NCP Certificate Managerの証明書番号 |
listeners[].tls.minVersion |
string | TLSV10 |
|
listeners[].tls.cipherSuiteList |
[]string | 自動 |
|
listeners[].http2Enabled |
bool | defaults値 |
|
listeners[].sslRedirectPort |
int | defaults値 |
当該 Listenerの HTTP→HTTPSリダイレクトポート |
listeners[].aclId |
int | defaults値 |
当該 Listenerに関連付ける ACL ID |
listeners[].targetGroup |
object | defaults.targetGroup値 |
|
listeners[].rules |
[]object | - |
|
listeners[].rules[].priority |
int | (必須) |
|
listeners[].rules[].conditions |
[]object | - |
|
listeners[].rules[].action |
object | (必須) |
|
listeners[]のフィールドを指定しないとdefaultsに設定した値が、defaultsにもない場合は上記の表のデフォルト値が適用されます。listeners[]はportが Gatewayに定義された Listenerと一致する場合のみ適用されます。
LoadBalancerTemplate主要設定のユースケース
LoadBalancerTemplateに設定目的に応じて必要なフィールドを作成します。
Load Balancer基本プロパティ設定
Load Balancerのネットワークタイプ、サイズ、未使用接続の維持時間、アクセスログの使用有無を設定できます。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: alb-basic
spec:
networkType: PUBLIC
size: SMALL
idleTimeoutSeconds: 60
accessLogEnabled: false
networkType: Load Balancerのネットワークタイプです。PUBLICまたはPRIVATEを入力します。size: Load Balancerの負荷処理性能です。SMALL、MEDIUM、LARGE、XLARGEのうち、1つを入力します。idleTimeoutSeconds: 未使用接続の維持時間です。1~3600の範囲で設定します。accessLogEnabled: ALBアクセスログの使用有無です。trueまたはfalseを入力します。
Load Balancer Subnet設定
基本 Load Balancer Subnetではなく、他の Subnetに ALBを作成する必要がある場合は lbSubnetIdsを設定します。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: alb-subnet
spec:
networkType: PRIVATE
lbSubnetIds:
- 12345
lbSubnetIds: Load Balancerが作成される Subnet IDです。networkTypeと一致する Load Balancer Subnetを入力する必要があります。lbSubnetIdsを設定しないと、クラスタに設定されたデフォルトの Load Balancer Subnetを使用します。
パブリック IPアドレスの設定
パブリック ALBに特定のパブリック IPアドレスを接続、または ALBの削除時にパブリック IPアドレスを保存するには、次のフィールドを使用します。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: alb-public-ip
spec:
networkType: PUBLIC
publicIpInstanceNo: 123456
retainPublicIpOnTermination: true
publicIpInstanceNo: ALBに接続するパブリック IPアドレスのインスタンス番号です。networkType: PUBLICで使用します。retainPublicIpOnTermination: ALBの削除時にパブリック IPアドレスを保存するかどうかの有無です。
Target Groupデフォルト値の設定
Gatewayに接続された Serviceへトラフィックを転送する時に使用する Target Groupのデフォルト値を設定できます。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: alb-target-group
spec:
defaults:
targetGroup:
protocol: HTTP
algorithmType: RR
stickySession: false
healthCheck:
protocol: HTTP
method: GET
path: /
port: 0
intervalSeconds: 30
healthyThresholdCount: 2
unhealthyThresholdCount: 2
protocol: backend Serviceに転送するプロトコルです。HTTPまたはHTTPSを入力します。algorithmType: ロードバランシングのアルゴリズムです。RR、LC、SIPHSのうち、1つを入力します。stickySession: Sticky Sessionの使用有無です。Gateway APIの session persistenceフィールドの代わりにこの値を使用します。healthCheck.protocol: ヘルスチェックのプロトコルです。HTTPまたはHTTPSを入力します。healthCheck.method: HTTP/HTTPSのヘルスチェックメソッドです。GETまたはHEADを入力します。healthCheck.path: HTTP/HTTPSのヘルスチェックパスです。healthCheck.port: ヘルスチェックポートです。0の場合は traffic-portを使用します。
Listener別 HTTPS証明書の設定
HTTPS Listenerを使用する場合は NCP Certificate Managerの証明書番号を Listener別に設定します。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: alb-https
spec:
listeners:
- port: 443
protocol: HTTPS
tls:
certificateNos:
- 123456
minVersion: TLSV12
listeners[].port: 設定を適用する Gateway Listenerポートです。listeners[].protocol: Listenerプロトコルです。HTTPS ListenerにはHTTPSを入力します。listeners[].tls.certificateNos: NCP Certificate Managerの証明書番号です。Kubernetes Secretベースの証明書参照は使用しません。listeners[].tls.minVersion: TLSの最小バージョンです。TLSV10、TLSV11、TLSV12、TLSV13のうち、1つを入力します。
Listener別 ACLと HTTP/2の設定
特定の Listenerに ACLを関連付けたり、HTTP/2を有効にできます。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: alb-listener-option
spec:
listeners:
- port: 443
protocol: HTTPS
aclId: 12345
http2Enabled: true
listeners[].aclId: Listenerに関連付ける ACL IDです。0の場合は使用しません。listeners[].http2Enabled: 当該 Listenerの HTTP/2の使用有無です。HTTP/2は TLSの上でネゴシエーションされるために HTTPS Listenerでのみ適用され、HTTP Listenerに設定すると無視されます。
spec.defaultsとspec.listeners[]のロールは、次のように区分されます。
spec.defaults: Gatewayが定義した Listenerのうち、spec.listeners[]にポート別設定がない Listenerに適用されるデフォルト値です。つまり、個別設定を別途指定していない Listenerはこのデフォルト値を使用します。spec.listeners[]: 特定のポートの Listenerにのみ適用する個別設定です。portで Gateway Listenerとマッチングされ、当該 Listenerに対してはspec.defaultsの代わりにこの設定が優先適用されます。
Listenerルーティングルールを直接指定(conditions/actions)
基本的に ALB Listenerのルーティングルール(条件・アクション)は、HTTPRouteで自動作成されます。HTTPRouteで表現できない条件・アクション(代表的に Redirect)が必要な場合、LoadBalancerTemplateの listeners[].rules[]にルールを直接作成できます。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: alb-redirect
spec:
listeners:
- port: 80
protocol: HTTP
rules:
- priority: 1 # 低いほど先に評価(1~10000)
conditions: # 各条件タイプは、ルールごとに1つのみ指定可能
- type: PathPattern
pathPattern:
values: ["/old", "/old/*"]
action:
type: Redirect # ForwardTargetGroup | Redirect
redirect:
protocol: HTTPS # HTTP | HTTPS
port: "443" # Redirect時にポート指定が必要
statusCode: "301" # 301 | 302
# host/path/query未指定時に従来のリクエスト値を維持
条件(conditions)のタイプ
| タイプ | フィールド | 説明 |
|---|---|---|
HostHeader |
hostHeader.values |
Hostヘッダマッチング値のリスト |
PathPattern |
pathPattern.values |
URLパスのパターン値リスト |
HttpHeader |
httpHeader.headerName, httpHeader.values |
任意の HTTPヘッダ名と値のリスト |
アクション(action)のタイプ
| タイプ | 説明 |
|---|---|
ForwardTargetGroup |
|
Redirect |
|
Redirect アクションの詳細フィールドは次の通りです。
| フィールド | タイプ | 説明 |
|---|---|---|
redirect.protocol |
string |
|
redirect.port |
string |
|
redirect.statusCode |
string |
|
redirect.host |
string |
|
redirect.path |
string |
|
redirect.query |
string |
|
listeners[].rules[]を指定する場合は当該 Listenerで HTTPRouteから作成されるルール全体を代替します(部分マージではない)。従って、HTTPRouteルーティングと直接作成したルールを同じ Listenerで混用できません。- 1つのルールで
HostHeader・PathPattern・HttpHeaderを各々1つずつ一緒に指定でき、ANDで評価されます。ただし、同じタイプを2つ以上配置できません。 ForwardTargetGroupアクションのtargetGroupNameはコントローラが自動作成する Target Group名を参照する必要があります。この方式は主に Target Groupを必要としないRedirectアクションに使用します。
プライベート ALB作成
プライベート ALBが必要な場合は LoadBalancerTemplateに networkType: PRIVATEを設定した後、Gatewayで参照します。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: private-alb
spec:
networkType: PRIVATE
lbSubnetIds:
- 12345
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: private-web
spec:
gatewayClassName: ncloud-alb
infrastructure:
parametersRef:
group: loadbalancer.vnks.ncloud.com
kind: LoadBalancerTemplate
name: private-alb
listeners:
- name: http
port: 80
protocol: HTTP
Load Balancer管理を一時停止
lb.ncloud.naver.com/pause: "true"は Kubernetes 1.36以上の KVMクラスタで使用できる一時停止オプションです。この値が設定されると、コントローラの spec/provider reconcileが一時停止されます。
| 適用対象 | 動作 |
|---|---|
| Gateway |
|
pauseは既に作成された NCloud LB/TGを保存するためのオプションです。pauseステータスでは欠落した Load Balancerリソースを新しく作成しません。変更反映を再開するには、入力リソースで pauseアノテーションを削除します。
HTTPS Listenerを使用する
Gateway APIで HTTPS Listenerを使用する場合は NCP Certificate Managerの証明書番号を LoadBalancerTemplateに入力します。
apiVersion: loadbalancer.vnks.ncloud.com/v1alpha1
kind: LoadBalancerTemplate
metadata:
name: https-alb
spec:
listeners:
- port: 443
protocol: HTTPS
tls:
certificateNos:
- 123456
minVersion: TLSV12
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: web-https
spec:
gatewayClassName: ncloud-alb
infrastructure:
parametersRef:
group: loadbalancer.vnks.ncloud.com
kind: LoadBalancerTemplate
name: https-alb
listeners:
- name: https
port: 443
protocol: HTTPS
Gateway APIの Secretベース TLS証明書の参照は使用しません。NCP Certificate Manager証明書番号を使用します。
他の namespaceの Service接続
HTTPRouteが他の namespaceの Serviceを backendとして参照するには、Serviceがある namespaceに ReferenceGrantを作成する必要があります。
apiVersion: gateway.networking.k8s.io/v1
kind: ReferenceGrant
metadata:
name: allow-route
namespace: backend-ns
spec:
from:
- group: gateway.networking.k8s.io
kind: HTTPRoute
namespace: route-ns
to:
- group: ""
kind: Service
ReferenceGrantがない場合は他の namespaceの Serviceは backendとして使用できません。
Gateway API未サポートフィールド
Gateway API標準には様々なフィールドと Route種類が含まれるが、NKS Gateway API ALB連携では、次の範囲のみサポートします。
GatewayClassと Gateway
| フィールド | サポートの有無 | 説明 | 対案 |
|---|---|---|---|
GatewayClass.spec.parametersRef |
サポート | LoadBalancerTemplate 参照サポート |
クラスタ共通のデフォルト値が必要な場合に運用者が LoadBalancerTemplateを参照するように構成 |
Gateway.spec.infrastructure.parametersRef |
サポート | Gatewayと同じ namespaceの LoadBalancerTemplate 参照をサポート |
Gateway別 ALB設定時にこのフィールドを使用 |
Gateway.spec.addresses |
未サポート | Gatewayで直接 IPアドレスをリクエストしたり予約しない | 固定パブリック IPアドレスは LoadBalancerTemplate.spec.publicIpInstanceNoを使用 |
Gateway.spec.listeners[].hostname |
サポート |
|
- |
Gateway.spec.listeners[].protocol: HTTP |
サポート | HTTP Listener作成 | - |
Gateway.spec.listeners[].protocol: HTTPS |
部分的なサポート | HTTPS Listenerは作成するが、Secretベース証明書は使用しない | 証明書番号は LoadBalancerTemplate.spec.listeners[].tls.certificateNosに指定 |
Gateway.spec.listeners[].protocol: TLS |
未サポート | TLS passthrough Listenerを作成しない | HTTPS Listenerを使用する |
Gateway.spec.listeners[].protocol: TCP |
未サポート | TCP Listenerを作成しない | Service type: LoadBalancerを使用 |
Gateway.spec.listeners[].protocol: UDP |
未サポート | UDP Listenerを作成しない | Service type: LoadBalancerを使用 |
Gateway.spec.listeners[].tls.certificateRefs |
未サポート | Kubernetes Secretを証明書として使用しない | NCP Certificate Managerの証明書番号を使用 |
Gateway.spec.listeners[].tls.mode: Passthrough |
未サポート | ALBは L7終端方式で動作 | HTTPS Listenerを使用する |
Gateway.spec.listeners[].allowedRoutes.namespaces.from |
サポート | Same、All、Selectorを使用可能 |
- |
Gateway.spec.listeners[].allowedRoutes.kinds |
部分的なサポート | HTTPRouteのみサポート | HTTPRouteを使用 |
HTTPRoute
| フィールド | サポートの有無 | 説明 | 対案 |
|---|---|---|---|
HTTPRoute.spec.parentRefs |
サポート | Gatewayと Listenerの関連付けに使用 | - |
HTTPRoute.spec.hostnames |
サポート | ALB Host header条件として使用 | - |
HTTPRoute.spec.rules[].matches[].path.type: PathPrefix |
サポート | Path条件として使用 | - |
HTTPRoute.spec.rules[].matches[].path.type: Exact |
サポート | Path条件として使用 | - |
HTTPRoute.spec.rules[].matches[].path.type: RegularExpression |
未サポート | 正規表現 Path条件の未サポート | PathPrefixまたは Exactを使用 |
HTTPRoute.spec.rules[].matches[].headers exact match |
サポート | Header exact match条件として使用 | - |
HTTPRoute.spec.rules[].matches[].headers regex match |
未サポート | 正規表現 Header条件の未サポート | exact matchを使用 |
HTTPRoute.spec.rules[].matches[].headers 多重 header(1つの matchに2つ以上) |
未サポート | 1つの ruleは Header条件を1つのみ持つことができ、複数の headerを ANDにマッチング不可 | 単一 header条件使用またはアプリケーションで処理 |
HTTPRoute.spec.rules[].matches[].queryParams |
未サポート | Query parameter条件の未サポート | アプリケーションで処理 |
HTTPRoute.spec.rules[].matches[].method |
未サポート | HTTP method条件の未サポート | アプリケーションで処理 |
HTTPRoute.spec.rules[].filters[].type: RequestRedirect |
未サポート | HTTPRouteの Redirect filter未サポート | LoadBalancerTemplateの listeners[].rules[]に Redirect アクションを直接指定(Listenerルーティングルールを直接指定) |
HTTPRoute.spec.rules[].filters[].type: URLRewrite |
未サポート | URL rewrite filter未サポート | アプリケーションで処理 |
HTTPRoute.spec.rules[].filters[].type: RequestHeaderModifier |
未サポート | Request header modifier未サポート | アプリケーションで処理 |
HTTPRoute.spec.rules[].filters[].type: ResponseHeaderModifier |
未サポート | Response header modifier未サポート | アプリケーションで処理 |
HTTPRoute.spec.rules[].filters[].type: RequestMirror |
未サポート | Request mirror未サポート | 別途ミラーリング構成を使用 |
HTTPRoute.spec.rules[].backendRefs[].kind: Service |
サポート | Serviceを backendとして使用可能 | Service type: NodePortを使用 |
| Service以外の backendRef kind | 未サポート | Service以外のbackendRefは未サポート | Service backendを使用 |
| 他の namespaceの backendRef | 部分的なサポート | ReferenceGrantがある場合のみ使用可能 |
backend namespaceに ReferenceGrantを作成 |
HTTPRoute.spec.rules[].backendRefs[].weight |
サポート | Backendの重み付けに使用 | - |
backend Service type: ClusterIP |
未サポート | NodePortがないため、Target Group backendに使用不可 | Service type: NodePortを使用 |
backend Service type: LoadBalancer |
未サポート | Gateway backendに使用しない | Service type: NodePortを使用 |
backend Service type: ExternalName |
未サポート | Gateway backendに使用しない | Service type: NodePortを使用 |
Gateway API sessionPersistence |
未サポート | Gateway API session persistenceフィールドの未使用 | LoadBalancerTemplateの Target Group stickySessionを使用 |
| Ruleまたは backend単位の timeout | 未サポート | Gateway API timeoutフィールドの未使用 | Load Balancer idle timeoutは LoadBalancerTemplate.spec.idleTimeoutSecondsを使用 |
ステータス確認
Gatewayと HTTPRouteステータスは、以下のコマンドで確認できます。
kubectl get gateway
kubectl get httproute
詳細ステータスを確認するには、以下のコマンドを実行します。
kubectl describe gateway <gateway-name>
kubectl describe httproute <httproute-name>
作成された Load Balancerと Target Groupリソースは、以下のコマンドで確認できます。
kubectl get loadbalancer
kubectl get targetgroup
Gatewayが正常に設定されたら接続された ALBアドレスが Gatewayステータスに表示されます。
削除
Gateway APIで作成した ALBを削除するには、HTTPRouteと Gatewayを削除します。
kubectl delete httproute <httproute-name>
kubectl delete gateway <gateway-name>
LoadBalancerTemplateを別途作成した場合、これ以上使用しない時に削除できます。
kubectl delete loadbalancertemplate <template-name>