该任务描述了如何使用Ingress资源配置Istio,来实暴露一个服务到服务网格集群的外部。

[warning] 使用Istio Gateway,而不是使用Ingress,主要是因为可以使用Istio提供的所有功能。比如丰富的流量管理和安全的功能。

1. 准备工作

  1. 部署服务
  1. $ kubectl apply -f samples/httpbin/httpbin.yaml
  1. 确定Ingress的IP和端口号
  1. $ kubectl get svc istio-ingressgateway -n istio-system
  2. $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
  3. $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
  4. $ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
  5. $ export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')

2. 使用Ingress 资源配置ingress

Kubernetes Ingress资源暴露HTTP和HTTPS的资源给集群的外部,来让外部访问。

  1. 创建Istio Gateway
  1. $ kubectl apply -f - <<EOF
  2. apiVersion: networking.k8s.io/v1beta1
  3. kind: Ingress
  4. metadata:
  5. annotations:
  6. kubernetes.io/ingress.class: istio
  7. name: ingress
  8. spec:
  9. rules:
  10. - host: httpbin.example.com
  11. http:
  12. paths:
  13. - path: /status/*
  14. backend:
  15. serviceName: httpbin
  16. servicePort: 8000
  17. EOF

这个kubernetes.io/ingress.class注释是必须的,它用来告诉Istio gateway控制器,它应该处理这个Ingress,否则它将会被忽略。

  1. 使用curl来访问httpbin服务。
  1. $ curl -I -HHost:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/status/200
  1. 访问其它没有暴露的URL,你应该能看到404错误。
  1. $ curl -I -HHost:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headers

2. 下一步

2.1 TLS

Ingress支持指定的TLS设置。这是通过Istio支持的。但是引用的secret必须存在于istio-ingressgateway的部署名称空间中。 cert-manager可以用来产生这些证书。

2.2 指定path type

默认的,Istio对待路径是精确匹配,除非他们以/*.*, 在这种情况下,他们将会以前辍匹配。其它的正则表达式是不支持的。

在Kubernetes 1.18中,添加一个新的字段pathType。 这允许明确的宣告一个路径是作为Exact或者Prefix

2.3 指定IngressClass

在kubernetes 1.18中,一个新的资源IngressClass被添加,取代了在Ingress资源上的kubernetes.io/ingress.class的注释。

假如你使用这个资源的话,那么需要设置controller字段为istio.io/ingress-controller ,如下案例所示

  1. apiVersion: networking.k8s.io/v1beta1
  2. kind: IngressClass
  3. metadata:
  4. name: istio
  5. spec:
  6. controller: istio.io/ingress-controller
  7. ---
  8. apiVersion: networking.k8s.io/v1beta1
  9. kind: Ingress
  10. metadata:
  11. name: ingress
  12. spec:
  13. ingressClassName: istio
  14. ...

3. 清除本小节实验

删除Ingress配置且关闭httpbin服务

  1. $ kubectl delete ingress ingress
  2. $ kubectl delete --ignore-not-found=true -f samples/httpbin/httpbin.yaml