NGINX Ingress は、nginx-configuration ConfigMap を介してグローバルに設定するか、アノテーションを介して Ingress ごとに設定します。
詳細については、「NGINX Ingress ConfigMap ドキュメント」および「NGINX Ingress アノテーションドキュメント」をご参照ください。
ConfigMap
nginx-configuration ConfigMap は、NGINX Ingress コントローラーによって管理されるすべての Ingress のグローバルデフォルト値を設定します。
ConfigMap の編集
kubectl edit cm -n kube-system nginx-configuration
デフォルト設定
以下の ConfigMap は、Container Service for Kubernetes (ACK) のデフォルト値を示しています。記載されていないフィールドは、アップストリームの ingress-nginx のデフォルト値を継承します。
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-configuration
namespace: <namespace> # デフォルト: kube-system
labels:
app: ingress-nginx
data:
log-format-upstream: '$remote_addr - [$remote_addr] - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status $req_id $host [$proxy_alternative_upstream_name]'
proxy-body-size: 20m
proxy-connect-timeout: "10"
max-worker-connections: "65536"
enable-underscores-in-headers: "true"
reuse-port: "true"
worker-cpu-affinity: "auto"
server-tokens: "false"
ssl-redirect: "false"
allow-backend-server-header: "true"
ignore-invalid-headers: "true"
generate-request-id: "true"
upstream-keepalive-timeout: "900"
フィールドの説明
| フィールド | デフォルト値 | 説明 |
|---|---|---|
log-format-upstream |
(上記参照) | アップストリームリクエストのログフォーマット。このフィールドを変更する場合は、kube-system/k8s-nginx-ingress AliyunLogConfig と Simple Log Service (SLS) のログ収集フォーマットも更新してください。詳細については、「Simple Log Service で NGINX Ingress コントローラーのアクセスログを診断する」をご参照ください。 |
proxy-body-size |
20m |
クライアントリクエストボディの最大サイズ。NGINX の client_max_body_size にマッピングされます。 |
proxy-connect-timeout |
10 |
プロキシサーバーとの接続を確立するためのタイムアウト (秒)。最大値は 75 です。gRPC の場合は、grpc_connect_timeout も設定してください。詳細については、proxy_connect_timeout をご参照ください。 |
max-worker-connections |
65536 |
ワーカープロセスあたりの最大同時接続数。0 に設定すると、代わりに max-worker-open-files の値が使用されます。 |
enable-underscores-in-headers |
true |
リクエストヘッダー名にアンダースコア (_) を許可するかどうか。 |
reuse-port |
true |
SO_REUSEPORT を使用してワーカーごとに個別のリスニングソケットを作成し、受信接続をワーカー間で分散させます。 |
worker-cpu-affinity |
auto |
各ワーカープロセスを利用可能な CPU コアにバインドします。ハイパフォーマンスなワークロードに役立ちます。 |
server-tokens |
false |
true の場合、Server レスポンスヘッダーとエラーページに NGINX のバージョンが含まれます。バージョン情報の公開を抑制するには false に設定します。 |
ssl-redirect |
false |
true の場合、TLS 証明書を持つすべてのサーバーに対して、HTTP から HTTPS へのグローバルなリダイレクト (301) を行います。 |
allow-backend-server-header |
true |
true の場合、汎用的な NGINX 文字列の代わりに、バックエンドから Server ヘッダーを渡します。 |
ignore-invalid-headers |
true |
リクエスト内の無効なヘッダーフィールドを無視するかどうか。 |
generate-request-id |
true |
truetrue の場合、X-Request-ID ヘッダーをまだ含まないリクエストに対して、ランダムな 値を生成します。 |
upstream-keepalive-timeout |
900 (ACK) / 60 (オープンソース) |
アップストリームサーバーへのキープアライブ接続のアイドルタイムアウト (秒)。NGINX の keepalive_timeout ディレクティブにマッピングされます。 |
アノテーション
個々の Ingress リソースにアノテーションを追加して、グローバルな ConfigMap 設定をオーバーライドまたは拡張します。
詳細については、「NGINX Ingress アノテーションドキュメント」をご参照ください。
ロードバランシング
| アノテーション | タイプ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/load-balance |
round_robin | ewma |
バックエンドサービスのロードバランシングアルゴリズム。round_robin (デフォルト) はほとんどのワークロードに適しています。ewma (指数加重移動平均) は、遅延の影響を受けやすいアプリケーションに適しています。 |
nginx.ingress.kubernetes.io/upstream-hash-by |
string | 一貫性ハッシュを有効にします。値はハッシュキーの変数です。例:$request_uri、$request_uri$host、${request_uri}-text-value。ノードを追加または削除しても、ルートのサブセットのみが移行されます。 |
例:リクエスト URI による一貫性ハッシュ
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-test
namespace: default
annotations:
nginx.ingress.kubernetes.io/upstream-hash-by: "$request_uri"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: <your-service-name>
port:
number: <your-service-port>
Kubernetes クラスター 1.22 より前のバージョンでは、apiVersion: networking.k8s.io/v1beta1と、backendの下にあるserviceName/servicePortフィールドを使用してください。
Cookie アフィニティ
| アノテーション | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
nginx.ingress.kubernetes.io/affinity |
cookie |
— | アフィニティタイプ。cookie のみがサポートされています。 |
nginx.ingress.kubernetes.io/affinity-mode |
balanced | persistent |
balanced |
balanced はリクエストをインスタンス間で分散します。persistent は常にクライアントを同じバックエンドインスタンスにルーティングし、セッションの一貫性を確保します。 |
nginx.ingress.kubernetes.io/session-cookie-name |
string | — | セッションルーティングのハッシュキーとして使用される Cookie 名。 |
nginx.ingress.kubernetes.io/session-cookie-path |
string | / |
セッションクッキーに設定される Path 属性。nginx.ingress.kubernetes.io/use-regex が true の場合、正規表現はサポートされません。 |
nginx.ingress.kubernetes.io/session-cookie-max-age |
integer (秒) | — | Max-Age 属性 (秒)。 |
nginx.ingress.kubernetes.io/session-cookie-expires |
integer (秒) | — | Cookie の有効期間 (秒)。Expires 属性を設定します。 |
例:Cookie ベースのセッションアフィニティ
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-test
annotations:
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
spec:
ingressClassName: nginx
rules:
- host: stickyingress.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: http-svc
port:
number: 80
リダイレクト
| アノテーション | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
nginx.ingress.kubernetes.io/ssl-redirect |
"true" | "false" |
— | この Ingress が TLS 証明書を持っている場合に、HTTP から HTTPS にリダイレクトします。詳細については、「HTTP から HTTPS へのリダイレクト」をご参照ください。 |
nginx.ingress.kubernetes.io/force-ssl-redirect |
"true" | "false" |
"false" |
TLS 証明書がなくても、HTTP から HTTPS へのリダイレクトを強制します。 |
nginx.ingress.kubernetes.io/permanent-redirect |
URL | — | 恒久的なリダイレクトの宛先 URL。スキーム (http:// または https://) を含める必要があります。 |
nginx.ingress.kubernetes.io/permanent-redirect-code |
integer | 301 |
恒久的なリダイレクトの HTTP ステータスコード。 |
nginx.ingress.kubernetes.io/temporal-redirect |
URL | — | 一時的なリダイレクトの宛先 URL。スキーム (http:// または https://) を含める必要があります。 |
nginx.ingress.kubernetes.io/app-root |
path | — | / へのリクエストを指定されたアプリケーションのルートパスにリダイレクトします。 |
例:`foo.com` から `bar.com` への恒久的なリダイレクト
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/permanent-redirect: "https://bar.com"
spec:
ingressClassName: nginx
rules:
- host: foo.com
http:
paths:
- path: "/"
pathType: ImplementationSpecific
backend:
service:
name: httpbin
port:
number: 8000
書き換え
| アノテーション | タイプ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/rewrite-target |
string | 書き換えの宛先パス。キャプチャグループをサポートしています。詳細については、「URL リダイレクトの設定」をご参照ください。 |
nginx.ingress.kubernetes.io/upstream-vhost |
string | アップストリームサービスに送信される Host ヘッダーを書き換えます。 |
例:`example.com/test` へのリクエストに対して `Host` ヘッダーを `test.com` に書き換える
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
annotations:
nginx.ingress.kubernetes.io/upstream-vhost: "test.com"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /test
pathType: ImplementationSpecific
backend:
service:
name: demo-service
port:
number: 80
スロットリング
クライアント IP ごとのリクエストレートと同時接続数を制限して、バックエンドサービスをトラフィックスパイクから保護します。
| アノテーション | タイプ | デフォルト値 | 説明 |
|---|---|---|---|
nginx.ingress.kubernetes.io/limit-connections |
integer | — | IP あたりの最大同時接続数。超過したリクエストは 503 を受け取ります。 |
nginx.ingress.kubernetes.io/limit-rate |
integer (KB) | — | 接続ごとの秒間最大データ転送量 (KB)。無効にするには 0 に設定します。プロキシバッファリングが有効になっている必要があります。 |
nginx.ingress.kubernetes.io/limit-rps |
integer | — | IP アドレスごとの秒間最大リクエスト数。バースト制限 (レート × limit-burst-multiplier) を超えるリクエストは、limit-req-status-code エラー (デフォルトでは 503) を返します。 |
nginx.ingress.kubernetes.io/limit-rpm |
integer | — | IP アドレスごとの分間最大リクエスト数。limit-rps と同じバースト動作です。 |
nginx.ingress.kubernetes.io/limit-burst-multiplier |
integer | 5 |
バーストレート制限の乗数。 |
nginx.ingress.kubernetes.io/limit-whitelist |
CIDR list | — | スロットリングから除外される CIDR ブロックのカンマ区切りリスト。 |
例:IP ホワイトリストを使用したレート制限
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/limit-rate: "100K"
nginx.ingress.kubernetes.io/limit-rps: "1"
nginx.ingress.kubernetes.io/limit-rpm: "30"
nginx.ingress.kubernetes.io/limit-whitelist: "10.1.10.100"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-svc
port:
number: 80
フォールバック
プライマリバックエンドが利用できない場合に、トラフィックをバックアップサービスにルーティングします。
| アノテーション | タイプ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/default-backend |
string | 利用可能なバックエンドノードがない場合のフォールバックサービス。ACK コンソールの [アドオン] ページでグローバルに設定します。 |
nginx.ingress.kubernetes.io/custom-http-errors |
HTTP status codes | default-backend と連携して動作します。バックエンドがリストされたステータスコードを返した場合、NGINX はリクエストをフォールバックサービスに転送します。パスは / に書き換えられます。グローバルな custom-http-errors ConfigMap 設定をオーバーライドします。 |
カナリアリリース
カナリアリリースとブルーグリーンデプロイメントを実装します。詳細については、「NGINX Ingress コントローラーを使用してカナリアリリースとブルーグリーンデプロイメントを実装する」をご参照ください。
| アノテーション | タイプ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/canary |
"true" | "false" |
カナリアリリースを有効にするかどうかを指定します。 |
nginx.ingress.kubernetes.io/canary-by-header |
string | トラフィック分割のためのヘッダーキー。 |
nginx.ingress.kubernetes.io/canary-by-header-value |
string | ヘッダーキーの完全一致値。一致するリクエストをカナリアにルーティングします。 |
nginx.ingress.kubernetes.io/canary-by-header-pattern |
regex | ヘッダー値の正規表現マッチ。 |
nginx.ingress.kubernetes.io/canary-by-cookie |
string | トラフィック分割に使用される Cookie キー。 |
nginx.ingress.kubernetes.io/canary-weight |
integer | カナリアにルーティングされるトラフィックの割合 (0–canary-weight-total)。 |
nginx.ingress.kubernetes.io/canary-weight-total |
integer | canary-weight の重みの分母。 |
タイムアウト
グローバルタイムアウト設定
nginx-configuration ConfigMap を編集して、タイムアウトをグローバルに設定します。
kubectl edit cm -n kube-system nginx-configuration
| フィールド | デフォルト値 | 説明 |
|---|---|---|
proxy-connect-timeout |
5s |
プロキシ接続タイムアウト。最大:75 秒。 |
proxy-read-timeout |
60s |
連続するプロキシ読み取り間のタイムアウト (合計応答時間ではない)。 |
proxy-send-timeout |
60s |
連続するプロキシ書き込み間のタイムアウト (合計送信時間ではない)。 |
proxy-stream-next-upstream-timeout |
600s |
接続を次のアップストリームサーバーに渡すための最大時間。制限なしにするには 0 に設定します。 |
proxy-stream-timeout |
600s |
クライアントまたはプロキシ接続のアイドルタイムアウト。データが転送されない場合に閉じられます。 |
upstream-keepalive-timeout |
900s (ACK) / 60s (オープンソース) |
アップストリームサーバーへのキープアライブ接続のアイドルタイムアウト。 |
worker-shutdown-timeout |
240s |
グレースフルシャットダウンのタイムアウト。 |
proxy-protocol-header-timeout |
5s |
PROXY プロトコルヘッダーを受信するためのタイムアウト。TLS パススルーハンドラが壊れた接続でブロックされるのを防ぎます。 |
ssl-session-timeout |
10m |
SSL セッションキャッシュの有効期間。各エントリは約 0.25 MB を使用します。 |
client-body-timeout |
60s |
クライアントリクエストボディを読み取るためのタイムアウト。 |
client-header-timeout |
60s |
クライアントリクエストヘッダーを読み取るためのタイムアウト。 |
Ingress ごとのタイムアウト設定
これらのアノテーションを使用して、特定の Ingress のグローバルタイムアウトをオーバーライドします。
| アノテーション | 説明 |
|---|---|
nginx.ingress.kubernetes.io/proxy-connect-timeout |
プロキシ接続タイムアウト。 |
nginx.ingress.kubernetes.io/proxy-send-timeout |
プロキシ送信タイムアウト。 |
nginx.ingress.kubernetes.io/proxy-read-timeout |
プロキシ読み取りタイムアウト。 |
nginx.ingress.kubernetes.io/proxy-request-buffering |
リクエストバッファリングモード。on:転送前に完全なリクエストをバッファリングします (HTTP/1.1 のチャンク化されたリクエストは常にバッファリングされます)。off:リクエストデータを直接ストリーミングします。送信エラー時のリトライはありません。 |
CORS
ブラウザリクエストに対してオリジン間リソース共有 (CORS) を有効にします。詳細については、「NGINX Ingress で CORS を設定する」をご参照ください。
| アノテーション | 説明 |
|---|---|
nginx.ingress.kubernetes.io/enable-cors |
この Ingress で CORS を有効にします。 |
nginx.ingress.kubernetes.io/cors-allow-origin |
CORS リクエストで許可されるオリジン。 |
nginx.ingress.kubernetes.io/cors-allow-methods |
許可されるリクエストメソッド (GET、POST、PUT など)。 |
nginx.ingress.kubernetes.io/cors-allow-headers |
許可されるリクエストヘッダー。 |
nginx.ingress.kubernetes.io/cors-expose-headers |
ブラウザに公開されるレスポンスヘッダー。 |
nginx.ingress.kubernetes.io/cors-allow-credentials |
CORS リクエストで認証情報 (Cookie、認証ヘッダー) を許可するかどうか。 |
nginx.ingress.kubernetes.io/cors-max-age |
CORS プリフライトキャッシュの持続時間 (秒)。 |
リトライポリシー
| アノテーション | デフォルト値 | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/proxy-next-upstream-tries |
3 |
条件が満たされた場合のリトライ回数。 |
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout |
— | リトライシーケンス全体に対するタイムアウト (秒)。デフォルトなし (無制限)。 |
nginx.ingress.kubernetes.io/proxy-next-upstream |
— | リトライ条件。複数の値はスペースで区切ります。有効な値:error (接続失敗)、timeout (タイムアウト)、invalid_response (無効なステータスコード)、http_500、http_502、http_503、http_504、http_403、http_404、http_429、off (リトライ無効)。 |
IP アドレスベースのアクセス制御
| アノテーション | タイプ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/whitelist-source-range |
CIDR list | IP 許可リスト。リストされた IP アドレスまたは CIDR ブロックのみが許可されます。カンマ区切り。 |
nginx.ingress.kubernetes.io/denylist-source-range |
CIDR list | IP 拒否リスト。リストされた IP アドレスまたは CIDR ブロックは拒否されます。カンマ区切り。 |
例:特定の IP アドレスのみを許可する
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-nginx
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/whitelist-source-range: "10.1.10.2"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-svc
port:
number: 80
グローバルに適用するには、nginx-configuration ConfigMap で whitelist-source-range を設定します。
トラフィックミラーリング
本番トラフィックに影響を与えることなく、テストのために本番リクエストをシャドウ環境に複製します。詳細については、「Ingress コントローラーを使用してネットワークトラフィックをミラーリングする」をご参照ください。
| アノテーション | タイプ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/mirror-target |
URL | ミラーリング先。サービスの IP アドレスまたは外部 URL を受け入れます。元のリクエスト URI を追加するには $request_uri を使用します。例:https://test.env.com/$request_uri。 |
nginx.ingress.kubernetes.io/mirror-request-body |
"true" | "false" |
リクエストボディをミラーリングするかどうか。 |
nginx.ingress.kubernetes.io/mirror-host |
string | Host ヘッダー。 |
セキュリティ保護
クライアントと NGINX Ingress コントローラー間、およびコントローラーとバックエンドサービス間の TLS 暗号化を設定します。詳細については、「NGINX Ingress コントローラーの暗号化」をご参照ください。
クライアントからゲートウェイへの暗号化
| アノテーション | スコープ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/ssl-cipher |
ドメイン | TLS 暗号スイート (カンマ区切り)。TLS 1.0–1.2 のハンドシェイクでのみ有効です。デフォルトの暗号スイート:ECDHE-ECDSA-AES128-GCM-SHA256、ECDHE-RSA-AES128-GCM-SHA256、ECDHE-ECDSA-AES128-SHA、ECDHE-RSA-AES128-SHA、AES128-GCM-SHA256、AES128-SHA、ECDHE-ECDSA-AES256-GCM-SHA384、ECDHE-RSA-AES256-GCM-SHA384、ECDHE-ECDSA-AES256-SHA、ECDHE-RSA-AES256-SHA、AES256-GCM-SHA384、AES256-SHA。 |
nginx.ingress.kubernetes.io/auth-tls-secret |
ドメイン | mTLS でクライアント証明書を検証するための CA 証明書 Secret。完全な CA チェーンを含む ca.crt ファイルを含める必要があります。 |
ゲートウェイからバックエンドへの暗号化
| アノテーション | スコープ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/proxy-ssl-secret |
サービス | バックエンドに提示されるクライアント証明書 Secret。tls.crt (クライアント証明書)、tls.key (秘密鍵)、および ca.crt (信頼された CA 証明書) を含む PEM 形式である必要があります。"namespace/secretName" として指定します。 |
nginx.ingress.kubernetes.io/proxy-ssl-name |
サービス | バックエンドとの TLS ハンドシェイクのための Server Name Indication (SNI) 値。 |
nginx.ingress.kubernetes.io/proxy-ssl-server-name |
サービス | バックエンドとの TLS ハンドシェイクで SNI を有効または無効にします。 |
セキュリティ認証
Basic 認証でアクセスを制限します。認証されたリクエストのみがバックエンドサービスに到達します。
| アノテーション | スコープ | 説明 |
|---|---|---|
nginx.ingress.kubernetes.io/auth-type |
Ingress | 認証タイプ。basic に設定します。 |
nginx.ingress.kubernetes.io/auth-secret |
Ingress | 認証情報 Secret の名前。フォーマット:namespace/secretName。 |
nginx.ingress.kubernetes.io/auth-secret-type |
Ingress | Secret データのフォーマット。auth-file:auth キーに username:password エントリが改行区切りで含まれます。auth-map:キーがユーザー名、値がパスワードです。 |
nginx.ingress.kubernetes.io/auth-realm |
Ingress | 認証情報を要求する際にクライアントに表示される認証レルム。 |
Basic 認証の設定
-
htpasswdを使用してパスワードファイルを生成します。htpasswd -c auth jokerファイルを検証します。
cat auth # 期待される出力: joker:$apr1$R.G4krs/$hh0mX8xe4A3lYKMjvlVs1/ -
パスワードファイルから Secret を作成します。
kubectl create secret generic basic-auth --from-file=auth -
Ingress にアノテーションを追加します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-nginx annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth spec: ingressClassName: nginx rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: backend-svc port: number: 80