Kubernetes クラスターでは、NGINX Ingress は、サービスへの外部アクセスを管理するためのレイヤー 7 のロードバランシングを提供する API オブジェクトです。NGINX Ingress は、外部から到達可能な URL、再書き込みルール、HTTPS サービス、およびカナリアリリース機能で構成できます。このトピックでは、セキュアなルーティングサービス、HTTPS 相互認証、正規表現とワイルドカードをサポートするドメイン名、および無料の HTTPS 証明書を取得する方法について説明します。
前提条件
構成の詳細
ACK で NGINX Ingress controller を構成するために使用されるメソッドは、コンポーネントのオープンソースバージョンと完全に互換性があります。すべての構成オプションの詳細については、「NGINX Configuration」をご参照ください。
次の 3 つの構成メソッドがサポートされています。
アノテーション: NGINX Ingress の YAML ファイルのアノテーションを変更できます。これらのアノテーションは、その特定の NGINX Ingress にのみ影響します。詳細については、「Annotations」をご参照ください。
ConfigMap: `kube-system/nginx-configuration` ConfigMap を変更できます。これは、すべての NGINX Ingress に影響を与えるグローバル構成です。詳細については、「ConfigMaps」をご参照ください。
カスタム NGINX テンプレート: アノテーションや ConfigMap では満たせない、NGINX Ingress controller の内部 NGINX テンプレートに対する特別な構成要件がある場合、このメソッドを使用できます。詳細については、「カスタム NGINX テンプレート」をご参照ください。
URL リダイレクト用のルーティングサービスを構成する
NGINX Ingress controller を使用すると、NGINX は完全なパスをバックエンドに転送します。たとえば、Ingress パス /service1/api へのリクエストは、バックエンド Pod の /service1/api/ に転送されます。バックエンドサービスパスが /api の場合、パスの不一致が発生し、404 エラーが返されます。この場合、nginx.ingress.kubernetes.io/rewrite-target アノテーションを使用して、パスを正しいディレクトリに再書き込みできます。
クラスターのバージョンに基づいて NGINX Ingress を作成します。
Kubernetes 1.19 以降を実行するクラスター
cat <<-EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foo.bar.com
namespace: default
annotations:
# URL リダイレクト。
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: foo.bar.com
http:
paths:
# Ingress controller バージョン 0.22.0 以降では、正規表現を使用してパスを定義し、rewrite-target アノテーションでキャプチャグループと共に使用する必要があります。
- path: /svc(/|$)(.*)
backend:
service:
name: web1-service
port:
number: 80
pathType: ImplementationSpecific
EOFKubernetes 1.19 より前のバージョンを実行するクラスター
cat <<-EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: foo.bar.com
namespace: default
annotations:
# URL リダイレクト。
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- host: foo.bar.com
http:
paths:
# Ingress controller バージョン 0.22.0 以降では、正規表現を使用してパスを定義し、rewrite-target アノテーションでキャプチャグループと共に使用する必要があります。
- path: /svc(/|$)(.*)
backend:
serviceName: web1-service
servicePort: 80
EOFNGINX サービスにアクセスします。
次のコマンドを実行して、
ADDRESSの値を取得します。kubectl get ingress予想される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE foo.bar.com nginx foo.bar.com 172.16.XX.XX 80 46m次のコマンドを実行します。
ADDRESSを Ingress の IP アドレスに置き換えます。curl -k -H "Host: foo.bar.com" http://<ADDRESS>/svc/foo予想される出力:
web1: /foo
再書き込み構成
基本的な再書き込み構成には、nginx.ingress.kubernetes.io/rewrite-target アノテーションを使用できます。詳細については、「URL リダイレクト用のルーティングサービスを構成する」をご参照ください。
複雑で高度な再書き込み要件には、次のアノテーションを使用できます。
nginx.ingress.kubernetes.io/server-snippet: 構成を `server` ブロックに拡張します。nginx.ingress.kubernetes.io/configuration-snippet: 構成を `location` ブロックに拡張します。
これら 2 つのアノテーションは、Ingress コンポーネントの NGINX 構成にカスタムコードスニペットを追加します。これにより、さまざまなシナリオに合わせて NGINX 構成を柔軟に拡張およびカスタマイズできます。
構成例:
annotations:
nginx.ingress.kubernetes.io/server-snippet: |
rewrite ^/v4/(.*)/card/query http://foo.bar.com/v5/#!/card/query permanent;
nginx.ingress.kubernetes.io/configuration-snippet: |
rewrite ^/v6/(.*)/card/query http://foo.bar.com/v7/#!/card/query permanent;次のコマンドを実行して、NGINX Ingress controller コンポーネントの NGINX 構成ファイルを表示します。
kubectl exec nginx-ingress-controller-xxxxx --namespace kube-system -- cat /etc/nginx/nginx.conf # Pod 名を環境に合わせて変更します。この構成例では、次の nginx.conf ファイルが生成されます。
# サーバー foo.bar.com の開始
server {
server_name foo.bar.com ;
listen 80;
listen [::]:80;
set $proxy_upstream_name "-";
# server-snippet 構成。
rewrite ^/v4/(.*)/card/query http://foo.bar.com/v5/#!/card/query permanent;
...
# configuration-snippet 構成。
rewrite ^/v6/(.*)/card/query http://foo.bar.com/v7/#!/card/query permanent;
...
}
# サーバー foo.bar.com の終了snippet は、いくつかのグローバル構成もサポートしています。詳細については、「server-snippet」をご参照ください。
rewrite ディレクティブの使用方法の詳細については、「ディレクティブに関する NGINX 公式ドキュメント」をご参照ください。
ルーティングルールに HTTPS 証明書を構成する
Ingress のネイティブセマンティクスを使用して、Web サイトの HTTPS 証明書を構成できます。
サービス証明書を準備します。
説明ドメイン名は、構成するホストと一致する必要があります。そうでない場合、NGINX Ingress controller は証明書を正しくロードできません。
次のコマンドを実行して、tls.crt という名前の証明書ファイルと tls.key という名前の秘密鍵ファイルを生成します。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=foo.bar.com/O=foo.bar.com"次のコマンドを実行して、Secret を作成します。
証明書と秘密鍵を使用して、`tls-test-ingress` という名前の Kubernetes Secret を作成します。Ingress を作成するときに、この Secret を参照する必要があります。
kubectl create secret tls tls-test-ingress --key tls.key --cert tls.crt
次のテンプレートを使用して Ingress リソースを作成します。`tls` フィールドは、前のステップで作成した Secret を参照するために使用されます。
Kubernetes 1.19 以降を実行するクラスター
cat <<-EOF | kubectl create -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: test-test-ingress spec: # TLS 証明書を参照します。 tls: - hosts: - foo.bar.com # 証明書に対応するドメイン名。 secretName: tls-test-ingress rules: - host: tls-test-ingress.com http: paths: - path: /foo backend: service: name: web1-svc port: number: 80 pathType: ImplementationSpecific EOFKubernetes 1.19 より前のバージョンを実行するクラスター
cat <<-EOF | kubectl create -f - apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: test-test-ingress spec: # TLS 証明書を参照します。 tls: - hosts: - foo.bar.com # 証明書に対応するドメイン名。 secretName: tls-test-ingress rules: - host: tls-test-ingress.com http: paths: - path: /foo backend: serviceName: web1-svc servicePort: 80 EOFhostsファイルを構成するか、実際のドメイン名を設定して TLS サービスにアクセスします。https://tls-test-ingress.com/fooでweb1-svcサービスにアクセスできます。
HTTPS 相互認証を構成する
場合によっては、接続のセキュリティを確保するために、サーバーとクライアント間で相互 HTTPS 認証を構成する必要があります。NGINX Ingress controller は、アノテーションを通じてこの機能をサポートします。
次のコマンドを実行して、自己署名認証局 (CA) 証明書を作成します。
openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=Fern Cert Authority'予想される出力:
Generating a 4096 bit RSA private key .............................................................................................................++ .....................................................................................++ writing new private key to 'ca.key'次のコマンドを実行して、サーバー証明書を作成します。
次のコマンドを実行して、サーバー証明書のリクエストファイルを生成します。
openssl req -new -newkey rsa:4096 -keyout server.key -out server.csr -nodes -subj '/CN=foo.bar.com'予想される出力:
Generating a 4096 bit RSA private key ................................................................................................................................++ .................................................................++ writing new private key to 'server.key'次のコマンドを実行して、ルート証明書を使用してサーバーリクエストファイルに署名し、サーバー証明書を生成します。
openssl x509 -req -sha256 -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt予想される出力:
Signature ok subject=/CN=foo.bar.com Getting CA Private Key
次のコマンドを実行して、クライアント証明書を作成します。
次のコマンドを実行して、クライアント証明書のリクエストファイルを生成します。
openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr -nodes -subj '/CN=Fern'予想される出力:
Generating a 4096 bit RSA private key .......................................................................................................................................................................................++ ..............................................++ writing new private key to 'client.key' -----次のコマンドを実行して、ルート証明書を使用してクライアントリクエストファイルに署名し、クライアント証明書を生成します。
openssl x509 -req -sha256 -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 02 -out client.crt予想される出力:
Signature ok subject=/CN=Fern Getting CA Private Key
次のコマンドを実行して、作成した証明書を検証します。
ls予想される出力:
ca.crt ca.key client.crt client.csr client.key server.crt server.csr server.key次のコマンドを実行して、CA 証明書の Secret を作成します。
kubectl create secret generic ca-secret --from-file=ca.crt=ca.crt予想される出力:
secret/ca-secret created次のコマンドを実行して、サーバー証明書の Secret を作成します。
kubectl create secret generic tls-secret --from-file=tls.crt=server.crt --from-file=tls.key=server.key予想される出力:
secret/tls-secret created次のテンプレートを使用して、テスト NGINX Ingress を作成します。
Kubernetes 1.19 以降を実行するクラスター
cat <<-EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret" nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1" nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true" name: nginx-test namespace: default spec: rules: - host: foo.bar.com http: paths: - backend: service: name: http-svc port: number: 80 path: / pathType: ImplementationSpecific tls: - hosts: - foo.bar.com secretName: tls-secret EOFKubernetes 1.19 より前のバージョンを実行するクラスター
cat <<-EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/auth-tls-verify-client: "on" nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret" nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1" nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true" name: nginx-test namespace: default spec: rules: - host: foo.bar.com http: paths: - backend: serviceName: http-svc servicePort: 80 path: / tls: - hosts: - foo.bar.com secretName: tls-secret EOF予想される出力:
ingress.networking.k8s.io/nginx-test configured次のコマンドを実行して、Ingress の IP アドレスを取得します。
kubectl get ingADDRESS 列の値は Ingress の IP アドレスです。
NAME HOSTS ADDRESS PORTS AGE nginx-test foo.bar.com 39.102.XX.XX 80, 443 4h42m次のコマンドを実行して hosts ファイルを更新します。サンプル IP アドレスを実際の Ingress の IP アドレスに置き換えます。
echo "39.102.XX.XX foo.bar.com" | sudo tee -a /etc/hosts[検証]:
クライアント証明書なしでのアクセス
curl --cacert ./ca.crt https://foo.bar.com予想される出力:
<html> <head><title>400 No required SSL certificate was sent</title></head> <body> <center><h1>400 Bad Request</h1></center> <center>No required SSL certificate was sent</center> <hr><center>nginx/1.19.0</center> </body> </html>クライアント証明書を使用したアクセス
curl --cacert ./ca.crt --cert ./client.crt --key ./client.key https://foo.bar.com予想される出力:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p>Thank you for using nginx.
HTTPS サービスを構成して、HTTPS 経由でバックエンドコンテナーにリクエストを転送する
デフォルトでは、NGINX Ingress controller は HTTP 経via でバックエンドアプリケーションコンテナーにリクエストを転送します。アプリケーションコンテナーが HTTPS を使用する場合、nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" アノテーションを使用して、NGINX Ingress controller が HTTPS 経由でバックエンドアプリケーションコンテナーにリクエストを転送するように構成できます。
以下は NGINX Ingress 構成の例です。
Kubernetes 1.19 以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: backend-https
annotations:
# 注: バックエンドサービスが HTTPS サービスであることを指定する必要があります。
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- <your-host-name>
secretName: <your-secret-cert-name>
rules:
- host: <your-host-name>
http:
paths:
- path: /
backend:
service:
name: <your-service-name>
port:
number: <your-service-port>
pathType: ImplementationSpecificKubernetes 1.19 より前のバージョンを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: backend-https
annotations:
# 注: バックエンドサービスが HTTPS サービスであることを指定する必要があります。
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
spec:
tls:
- hosts:
- <your-host-name>
secretName: <your-secret-cert-name>
rules:
- host: <your-host-name>
http:
paths:
- path: /
backend:
serviceName: <your-service-name>
servicePort: <your-service-port>正規表現をサポートするようにドメイン名を構成する
Kubernetes クラスターでは、Ingress リソースはドメイン名の正規表現をサポートしていません。ただし、nginx.ingress.kubernetes.io/server-alias アノテーションを使用してこの機能を有効にできます。
次のテンプレートをデプロイします。この例では、正規表現
~^www\.\d+\.example\.comを使用します。Kubernetes 1.19 以降を実行するクラスター
cat <<-EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-regex namespace: default annotations: nginx.ingress.kubernetes.io/server-alias: '~^www\.\d+\.example\.com$, abc.example.com' spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: service: name: http-svc1 port: number: 80 pathType: ImplementationSpecific EOFKubernetes 1.19 より前のバージョンを実行するクラスター
cat <<-EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-regex namespace: default annotations: nginx.ingress.kubernetes.io/server-alias: '~^www\.\d+\.example\.com$, abc.example.com' spec: rules: - host: foo.bar.com http: paths: - path: /foo backend: serviceName: http-svc1 servicePort: 80 EOF対応する NGINX Ingress controller の構成を表示します。
次のコマンドを実行して、NGINX Ingress controller サービスの Pod を一覧表示します。
kubectl get pods -n kube-system | grep nginx-ingress-controller予想される出力:
nginx-ingress-controller-77cd987c4c-c**** 1/1 Running 0 1h nginx-ingress-controller-77cd987c4c-x**** 1/1 Running 0 1h次のコマンドを実行して、NGINX Ingress controller の構成を取得します。`Server_Name` フィールドで有効な構成を確認できます。
kubectl exec -n kube-system nginx-ingress-controller-77cd987c4c-c**** cat /etc/nginx/nginx.conf | grep -C3 "foo.bar.com"予想される出力:
# サーバー foo.bar.com の開始 server { -- server { server_name foo.bar.com abc.example.com ~^www\.\d+\.example\.com$ ; listen 80 ; listen 443 ssl http2 ; -- -- } } # サーバー foo.bar.com の終了
次のコマンドを実行して、Ingress の IP アドレスを取得します。
kubectl get ing予想される出力:
NAME HOSTS ADDRESS PORTS AGE ingress-regex foo.bar.com 101.37.XX.XX 80 11s次のコマンドを実行して、さまざまなルールでサービスアクセスをテストします。
[IP_ADDRESS] を前のステップで取得した IP アドレスに設定します。
次のコマンドを実行して、
Host: foo.bar.comを使用してサービスにアクセスします。curl -H "Host: foo.bar.com" <IP_ADDRESS>/foo予想される出力:
/foo次のコマンドを実行して、
Host: www.123.example.comを使用してサービスにアクセスします。curl -H "Host: www.123.example.com" <IP_ADDRESS>/foo予想される出力:
/foo次のコマンドを実行して、
Host: www.321.example.comを使用してサービスにアクセスします。curl -H "Host: www.321.example.com" <IP_ADDRESS>/foo予想される出力:
/foo
ワイルドカードをサポートするようにドメイン名を構成する
Kubernetes クラスターでは、NGINX Ingress リソースはワイルドカードドメイン名をサポートしています。たとえば、ワイルドカードドメイン名 *.ingress-regex.com を構成できます。
次のテンプレートをデプロイして NGINX Ingress を作成します。
Kubernetes 1.19 以降を実行するクラスター
cat <<-EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-regex namespace: default spec: rules: - host: *.ingress-regex.com http: paths: - path: /foo backend: service: name: http-svc1 port: number: 80 pathType: ImplementationSpecific EOFKubernetes 1.19 より前のバージョンを実行するクラスター
$ cat <<-EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: ingress-regex namespace: default spec: rules: - host: *.ingress-regex.com http: paths: - path: /foo backend: serviceName: http-svc1 servicePort: 80 EOF次のコマンドを実行して、NGINX Ingress controller の構成を取得します。`Server_Name` フィールドで有効な構成を確認できます。
kubectl exec -n kube-system <nginx-ingress-pod-name> cat /etc/nginx/nginx.conf | grep -C3 "*.ingress-regex.com"説明nginx-ingress-pod-name を、お使いの環境の実際の NGINX Ingress Pod 名に置き換えてください。
予想される出力:
# サーバー *.ingress-regex.com の開始 server { server_name *.ingress-regex.com ; listen 80; listen [::]:80; ... } # サーバー *.ingress-regex.com の終了NGINX Ingress controller の新しいバージョンでの予想される出力:
## サーバー *.ingress-regex.com の開始 server { server_name ~^(?<subdomain>[\w-]+)\.ingress-regex\.com$ ; listen 80; listen [::]:80; ... } ## サーバー *.ingress-regex.com の終了次のコマンドを実行して、Ingress の IP アドレスを取得します。
kubectl get ing予想される出力:
NAME HOSTS ADDRESS PORTS AGE ingress-regex *.ingress-regex.com 101.37.XX.XX 80 11s次のコマンドを実行して、さまざまなルールでサービスアクセスをテストします。
[IP_ADDRESS] を前のステップで取得した IP アドレスに設定します。
次のコマンドを実行して、
Host: abc.ingress-regex.comを使用してサービスにアクセスします。curl -H "Host: abc.ingress-regex.com" <IP_ADDRESS>/foo予想される出力:
/foo次のコマンドを実行して、
Host: 123.ingress-regex.comを使用してサービスにアクセスします。curl -H "Host: 123.ingress-regex.com" <IP_ADDRESS>/foo予想される出力:
/foo次のコマンドを実行して、
Host: a1b1.ingress-regex.comを使用してサービスにアクセスします。curl -H "Host: a1b1.ingress-regex.com" <IP_ADDRESS>/foo予想される出力:
/foo
アノテーションを使用したカナリアリリースの実装
アノテーションを設定することで、カナリアリリースを実装できます。カナリアリリース機能を有効にするには、nginx.ingress.kubernetes.io/canary: "true" アノテーションを設定する必要があります。さまざまなアノテーションを使用して、さまざまな種類のカナリアリリースを構成できます。
nginx.ingress.kubernetes.io/canary-weight: 指定されたサービスにルーティングされるトラフィックの割合 (0 から 100 までの整数) を設定します。nginx.ingress.kubernetes.io/canary-by-header: リクエストヘッダーに基づいてトラフィックを分割します。構成されたheaderの値がalwaysの場合、トラフィックはカナリアサービスのエンドポイントにルーティングされます。headerの値がneverの場合、トラフィックはカナリアサービスにルーティングされません。他のheaderの値は無視され、トラフィックは他のカナリアリリースのルールの優先度に基づいてルーティングされます。nginx.ingress.kubernetes.io/canary-by-header-valueとnginx.ingress.kubernetes.io/canary-by-header: リクエストのheaderとheader-valueが指定された値と一致する場合、トラフィックはカナリアサービスのエンドポイントにルーティングされます。他のheaderの値は無視され、トラフィックは他のカナリアリリースのルールの優先度に基づいてルーティングされます。nginx.ingress.kubernetes.io/canary-by-cookie: Cookie に基づいてトラフィックを分割します。構成されたcookieの値がalwaysの場合、トラフィックはカナリアサービスのエンドポイントにルーティングされます。構成されたcookieの値がneverの場合、トラフィックはカナリアサービスのエンドポイントにルーティングされません。
以下は、アノテーション構成の例です。詳細については、「NGINX Ingress を使用してカナリアリリースとブルーグリーンデプロイメントを実装する」をご参照ください。
重みベースのカナリアリリース: カナリアサービスの重みを 20% に設定します。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20"ヘッダーベースのカナリアリリース: リクエストヘッダーが
ack:alwaysの場合、リクエストはカナリアサービスにルーティングされます。リクエストヘッダーがack:neverの場合、リクエストはカナリアサービスにルーティングされません。他のヘッダーの場合、トラフィックはカナリアの重みに基づいてカナリアサービスにルーティングされます。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "50" nginx.ingress.kubernetes.io/canary-by-header: "ack"ヘッダーベースのカナリアリリース (カスタムヘッダー値): リクエストヘッダーが
ack:alibabaの場合、リクエストはカナリアサービスにルーティングされます。他のヘッダーの場合、トラフィックはカナリアの重みに基づいてカナリアサービスにルーティングされます。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20" nginx.ingress.kubernetes.io/canary-by-header: "ack" nginx.ingress.kubernetes.io/canary-by-header-value: "alibaba"Cookie ベースのカナリアリリース: ヘッダーが一致せず、リクエスト Cookie が
hangzhou_region=alwaysの場合、リクエストはカナリアサービスにルーティングされます。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20" nginx.ingress.kubernetes.io/canary-by-header: "ack" nginx.ingress.kubernetes.io/canary-by-header-value: "alibaba" nginx.ingress.kubernetes.io/canary-by-cookie: "hangzhou_region"
Cookie ベースのカナリアリリースはカスタム値をサポートせず、
alwaysとneverのみをサポートします。カナリアリリースのルール優先度 (高いものから順に): ヘッダーベース > Cookie ベース > 重みベース。
cert-manager を使用して無料の HTTPS 証明書を申請する
cert-manager は、クラスター内で HTTPS 証明書を提供し、自動更新するオープンソースの証明書管理ツールです。次の例では、cert-manager を使用して無料の証明書を取得し、自動更新を有効にする方法について説明します。
cert-manager はオープンソースコンポーネントです。ACK はこのコンポーネントのメンテナンスを提供しません。本番環境では注意して使用してください。
次のコマンドを実行して cert-manager をデプロイします。
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml次のコマンドを実行して Pod のステータスを確認します。
kubectl get pods -n cert-manager予想される出力:
NAME READY STATUS RESTARTS AGE cert-manager-1 1/1 Running 0 2m11s cert-manager-cainjector 1/1 Running 0 2m11s cert-manager-webhook 1/1 Running 0 2m10s次のコマンドを実行して ClusterIssuer を作成します。
cat <<-EOF | kubectl apply -f - apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod-http01 spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: <your_email_name@gmail.com> # これをメールアドレスに置き換えます。 privateKeySecretRef: name: letsencrypt-http01 solvers: - http01: ingress: class: nginx EOF次のコマンドを実行して ClusterIssuer のステータスを確認します。
kubectl get clusterissuer予想される出力:
NAME READY AGE letsencrypt-prod-http01 True 17s次のコマンドを実行して NGINX Ingress リソースを作成します。
Kubernetes 1.19 以降を実行するクラスター
cat <<-EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-tls annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod-http01" spec: tls: - hosts: - <your_domain_name> # これをドメイン名に置き換えます。 secretName: ingress-tls rules: - host: <your_domain_name> # これをドメイン名に置き換えます。 http: paths: - path: / backend: service: name: <your_service_name> # これをバックエンドサービス名に置き換えます。 port: number: <your_service_port> # これをサービスポートに置き換えます。 pathType: ImplementationSpecific EOFKubernetes 1.19 より前のバージョンを実行するクラスター
cat <<-EOF | kubectl apply -f - apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress-tls annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod-http01" spec: tls: - hosts: - <your_domain_name> # これをドメイン名に置き換えます。 secretName: ingress-tls rules: - host: <your_domain_name> # これをドメイン名に置き換えます。 http: paths: - path: / backend: serviceName: <your_service_name> # これをバックエンドサービス名に置き換えます。 servicePort: <your_service_port> # これをサービスポートに置き換えます。 EOF説明your_domain_name を置き換えるために使用するドメイン名は、次の条件を満たす必要があります。
ドメイン名は 64 文字を超えることはできません。
ワイルドカードドメイン名はサポートされていません。
ドメイン名は、HTTP 経由でインターネットからアクセスできる必要があります。
次のコマンドを実行して証明書のステータスを確認します。
kubectl get cert予想される出力:
NAME READY SECRET AGE ingress-tls True ingress-tls 52m説明[READY] ステータスが [True] でない場合は、
kubectl describe cert ingress-tlsを実行して証明書処理プロシージャを確認できます。次のコマンドを実行して Secret を確認します。
kubectl get secret ingress-tls予想される出力:
NAME TYPE DATA AGE ingress-tls kubernetes.io/tls 2 2mWeb ブラウザーに
https://[website_domain_name]と入力して、構成済みのドメイン名にアクセスします。
HTTP から HTTPS へのリダイレクト
nginx.ingress.kubernetes.io/ssl-redirect アノテーションは、NGINX Ingress の HTTP トラフィックを HTTPS にリダイレクトします。次の例に構成を示します。
Kubernetes 1.19 以降を実行するクラスター
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" # HTTP トラフィックを強制的に HTTPS にリダイレクトします。Kubernetes 1.19 より前のバージョンを実行するクラスター
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true" # HTTP トラフィックを強制的に HTTPS にリダイレクトします。