第十六部分 Istion控制 Ingress 流量

简介

在 Kubernetes 环境中,Kubernetes Ingress 资源 用于指定应在集群外部公开的服务。在 Istio 服务Mesh中,更好的方法(也适用于 Kubernetes 和其他环境)是使用不同的配置模型,即Istio Gateway 。Gateway允许Istio功能(例如,监控和路由规则)应用于进入集群的流量。

本文描述如何配置 Istio Ingress Gateway来访问 Istio 服务Mesh以外的公开服务 。

前提条件

  • 正确安装Istio。
  • 确保在Istio当前版本文件夹中。
  • 启动httpbin实例应用,手动方式注入 Sidecar,当然也可以选择自动:
kubectl apply -f <(istioctl kube-inject -f samples/httpbin/httpbin.yaml)

YAML具体内容如下:

apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 80

确定Ingress IP和端口

执行以下命令以确定您的 Kubernetes 集群是否在支持外部负载均衡器的环境中运行。

kubectl get svc istio-ingressgateway -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                      
istio-ingressgateway   LoadBalancer   172.21.109.129   130.211.10.121  80:31380/TCP,443:31390/TCP,31400:31400/TCP

如果 EXTERNAL-IP 有值(IP 地址或主机名),则说明您的环境具有可用于 Ingress 网关的外部负载均衡器。如果 EXTERNAL-IP 值是 (或一直是 ),则说明可能您的环境并没有为 Ingress 网关提供外部负载均衡器的功能。在这种情况下,您可以使用 Ingress Service 的 node port 方式访问网关。

  • 方式一:使用外部负载均衡器时确定 IP 和端口
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')

请注意,在某些环境中,外部负载均衡器可能需要使用主机名而不是 IP 地址。 在这种情况下,上一节命令输出中的 EXTERNAL-IP 的值就不是 IP 地址, 而是一个主机名,上面的命令将无法设置 INGRESS_HOST 环境变量。在这种情况下,使用以下命令来更正 INGRESS_HOST 值:

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
  • 方式二:确定使用 Node Port 时的 ingress IP 和端口

注,如果环境没有外部负载均衡器,请按照此说明操作。

确认端口:

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

确认IP,不同的平台环境IP不同,如本机局域网IP:10.11.0.100,则执行:

export INGRESS_HOST=10.11.0.100

使用 Istio 网关配置 Ingress

Ingress Gateway描述了在Mesh边缘操作的负载均衡器,用于接收传入的 HTTP/TCP 连接。它配置暴露的端口、协议等,但与 Kubernetes Ingress Resources 不同,它不包括任何流量路由配置。流入流量的流量路由使用 Istio 路由规则进行配置,与内部服务请求完全相同。

为Gateway在HTTP 80端口上配置流量。

创建一个Istio Gateway:

kubectl apply -f - <

为通过 Gateway 进入的流量配置路由:

kubectl apply -f - <

在这里,我们为服务创建了一个虚拟服务配置 httpbin ,其中包含两条路由规则,允许路径 /status 和 路径的流量 /delay。该网关列表指定,只有通过我们的要求 httpbin-gateway 是允许的。所有其他外部请求将被拒绝,并返回 404 响应。请注意,在此配置中,来自Istio Mesh中其他服务的内部请求不受这些规则约束,而是简单地默认为循环路由。要将这些(或其他规则)应用于内部调用,我们可以将特殊值 mesh 添加到 gateways 的列表中。

使用 curl 访问 httpbin 服务:

curl -I -HHost:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/status/200
HTTP/1.1 200 OK
server: envoy
date: Mon, 29 Jan 2018 04:45:49 GMT
content-type: text/html; charset=utf-8
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 0
x-envoy-upstream-service-time: 48

请注意,这里使用该 -H 标志将 Host HTTP Header 设置为 “httpbin.example.com”。这一操作是必需的,因为上面的 Ingress Gateway 被配置为处理 “httpbin.example.com”,但在测试环境中没有该主机的 DNS 绑定,只是将请求发送到 Ingress IP。访问任何未明确公开的其他 URL,应该会看到一个 HTTP 404 错误:

curl -I -HHost:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headers
HTTP/1.1 404 Not Found
date: Mon, 29 Jan 2018 04:45:49 GMT
server: envoy
content-length: 0

使用浏览器访问 Ingress 服务

在浏览器中输入 httpbin 服务的地址是不会生效的,因为没有相应的DNS配置,即没有正常配置的主机和 DNS 记录,现实环境中若存在该记录,则可以访问https://httpbin.example.com/status/200,要解决此问题以进行简单的测试和演示,我们可以在 Gateway 和 VirtualService 配置中为主机使用通配符值 *。例如,如果我们将 Ingress 配置更改为以下内容:

kubectl apply -f - <

接下来就可以在浏览器的 URL 中使用 $INGRESS_HOST:$INGRESS_PORT(也就是 192.168.99.100:31380)进行访问,输入 http://192.168.99.100:31380/headers 网址之后,应该会显示浏览器发送的请求 Header。

理解原理

Gateway配置资源允许外部流量进入 Istio 服务网,并使 Istio 的流量管理和策略功能可用于边缘服务。根据前面所述,在 Istio 服务Mesh中创建了一个服务Gateway,并展示了如何将服务的 HTTP 端点暴露给外部流量。

你可能感兴趣的:(istio)