Kubernetes Ingress

此任務說明如何設定 Istio,以使用 Kubernetes Ingress 資源,將服務公開於服務網格叢集之外。

開始之前

請依照開始之前判斷入口 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 綁定,只是將您的請求發送到 ingress 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 支援此功能,但參考的 Secret 必須存在於 istio-ingressgateway 部署的命名空間中(通常是 istio-system)。可以使用cert-manager來產生這些憑證。

指定路徑類型

預設情況下,Istio 會將路徑視為精確匹配,除非它們以 /*.* 結尾,在這種情況下它們將變成前綴匹配。不支援其他正規表達式。

在 Kubernetes 1.18 中,新增了一個新的欄位 pathType。這允許將路徑明確宣告為 ExactPrefix

指定 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@
此資訊對您有幫助嗎?
您有任何改進建議嗎?

感謝您的回饋!