Kubernetes Ingress
此任務說明如何設定 Istio,以使用 Kubernetes Ingress 資源,將服務公開於服務網格叢集之外。
開始之前
請依照開始之前和判斷入口 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 綁定,只是將您的請求發送到 ingress 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@