Kubernetes Ingress
このタスクでは、Kubernetes Ingressリソースを使用して、サービスメッシュクラスタの外部にサービスを公開するようにIstioを設定する方法について説明します。
始める前に
「始める前に」と「イングレスIPとポートの決定」セクション(イングレスゲートウェイタスク)に記載されている手順に従ってください。
Ingressリソースを使用したイングレスの設定
Kubernetes Ingressリソースは、クラスター外部からクラスター内のサービスへのHTTPおよびHTTPSルートを公開します。
HTTPトラフィック用にポート80でIngress
を設定する方法を見てみましょう。
Ingress
リソースを作成します。$ kubectl apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: istio name: ingress spec: rules: - host: httpbin.example.com http: paths: - path: /status pathType: Prefix backend: service: name: httpbin port: number: 8000 EOF
kubernetes.io/ingress.class
アノテーションは、IstioゲートウェイコントローラーがこのIngress
を処理する必要があることを伝えるために必要です。指定しない場合は無視されます。curlを使用してhttpbinサービスにアクセスします。
$ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/status/200" ... HTTP/1.1 200 OK ... server: istio-envoy ...
-H
フラグを使用してHost HTTPヘッダーを「httpbin.example.com」に設定していることに注意してください。これは、Ingress
が「httpbin.example.com」を処理するように設定されていますが、テスト環境ではそのホストのDNSバインディングがなく、単にリクエストをイングレスIPに送信しているため、必要です。明示的に公開されていない他のURLにアクセスします。HTTP 404エラーが表示されるはずです。
$ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/headers" HTTP/1.1 404 Not Found ...
次のステップ
TLS
Ingress
は、TLS設定の指定をサポートしています。これはIstioでサポートされていますが、参照されるSecret
はistio-ingressgateway
デプロイメントのネームスペース(通常はistio-system
)に存在する必要があります。cert-managerを使用して、これらの証明書を生成できます。
パスタイ プの指定
デフォルトでは、Istioはパスを完全一致として扱います。ただし、パスが/*
または.*
で終わる場合は、プレフィックス一致になります。その他の正規表現はサポートされていません。
Kubernetes 1.18では、新しいフィールドpathType
が追加されました。これにより、パスをExact
またはPrefix
として明示的に宣言できます。
IngressClass
の指定
Kubernetes 1.18では、新しいリソースIngressClass
が追加され、Ingress
リソースのkubernetes.io/ingress.class
アノテーションが置き換えられました。このリソースを使用する場合は、controller
フィールドをistio.io/ingress-controller
に設定する必要があります。例えば
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: istio
spec:
controller: istio.io/ingress-controller
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress
spec:
ingressClassName: istio
rules:
- host: httpbin.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: httpbin
port:
number: 8000
クリーンアップ
Ingress
設定を削除し、httpbinサービスをシャットダウンします。
$ kubectl delete ingress ingress
$ kubectl delete --ignore-not-found=true -f @samples/httpbin/httpbin.yaml@