Kubernetes Ingress

このタスクでは、Kubernetes Ingressリソースを使用して、サービスメッシュクラスタの外部にサービスを公開するようにIstioを設定する方法について説明します。

始める前に

始める前に」と「イングレスIPとポートの決定」セクション(イングレスゲートウェイタスク)に記載されている手順に従ってください。

Ingressリソースを使用したイングレスの設定

Kubernetes Ingressリソースは、クラスター外部からクラスター内のサービスへのHTTPおよびHTTPSルートを公開します。

HTTPトラフィック用にポート80でIngressを設定する方法を見てみましょう。

  1. 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を処理する必要があることを伝えるために必要です。指定しない場合は無視されます。

  2. 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に送信しているため、必要です。

  3. 明示的に公開されていない他の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でサポートされていますが、参照されるSecretistio-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サービスをシャットダウンします。

Zip(圧縮)
$ kubectl delete ingress ingress
$ kubectl delete --ignore-not-found=true -f @samples/httpbin/httpbin.yaml@
この情報は役に立ちましたか?
改善のための提案はありますか?

フィードバックありがとうございます!