FLOWERS_WAN

导航

istio ingress gataway

在kubernetes中,kubernetes ingress resource常用来指定应该暴露给集群外部服务,在一个istio中,最好的办法就是使用不同配置模型,也就是istio gateway,

一个gateway允许istio的功能,比如监控和路由规则去应用到进入集群的流量。

 

1.准备工作

[root@k8s-master01 httpbin]# kubectl apply -f httpbin.yaml -n istio
serviceaccount/httpbin created
service/httpbin created
deployment.apps/httpbin created
[root@k8s-master01 httpbin]#
2.  确定ingress的IP和端口

 

[root@k8s-master01 httpbin]# kubectl get svc   -n istio-system istio-ingressgateway
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                                                                      AGE
istio-ingressgateway   LoadBalancer   10.107.131.1   192.168.30.240   15021:31996/TCP,80:31612/TCP,443:31718/TCP,31400:32280/TCP,15443:31182/TCP   91d


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

[root@k8s-master01 httpbin]# export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
[root@k8s-master01 httpbin]# export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
[root@k8s-master01 httpbin]# export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
[root@k8s-master01 httpbin]#
[root@k8s-master01 httpbin]# echo $INGRESS_HOST
192.168.30.240
[root@k8s-master01 httpbin]# echo $INGRESS_PORT
80
[root@k8s-master01 httpbin]# echo $SECURE_INGRESS_PORT
443

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}')
    export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}')
确认IP,不同的平台环境IP不同,如本机局域网IP:10.11.0.100,则执行:

export INGRESS_HOST=10.11.0.100



三、用istio网关配置ingress

Ingress网关在服务网格的边缘为进入的http/tcp连接描述负载均衡操作,配置暴露的端口和协议等内容。与k8s ingress resources不同的是这里用istio的路由规则来代替ingress中的流量路由配置。下面我们来看看如何在80端口上配置http流量的网关。

[root@k8s-master01 httpbin]# vim httpbin-gateway1.yaml

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - "*"
  gateways:

 

现在你已经为httpbin服务创建了一个virtual service,里面包含两条路由规则,允许流量访问/status和/delay。该配置定义了外部请求只有通过httpbin-gateway能访问成功,其它外部请求都会返回404拒绝响应。  

3、采用curl 来访问httpbin服务

curl -I -HHost:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/status/200

注意上面使用-H标记来设置Host http头为“httpbin.example.com”,这是必须的,因为你的ingress 网关中配置要处理来自“httpbin.example.com”的流量,但你的测试环境中没有DNS绑定那个域名,仅仅直接把请求发送给ingress ip。

4、访问其它未暴露的URL将会返回404错误。

curl -I -HHost:httpbin.example.com http://$INGRESS_HOST:$INGRESS_PORT/headers

    四、通过浏览器访问ingress服务

       若在浏览器中直接输入httpbin服务的URL不能成功访问,因为你无法像curl一样让浏览器假扮访问httpbin.example.com域名。但若在真实环境中这不是一个问题,因为可以配置DNS解析来实现,现实中可以用域名来访问,比如 https://httpbin.example.com/status/200。

        为了绕过上面的问题进行演示测试,我们可以*替换gateway和virtualService中的配置。比如可以按如下方式修改ingress配置文件。

kubectl apply -f - <<EOF

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

  name: httpbin-gateway

spec:

  selector:

    istio: ingressgateway # use Istio default gateway implementation

  servers:

  - port:

      number: 80

      name: http

      protocol: HTTP

    hosts:

    - "*"

---

apiVersion: networking.istio.io/v1alpha3

kind: VirtualService

metadata:

  name: httpbin

spec:

  hosts:

  - "*"

  gateways:

  - httpbin-gateway

  http:

  - match:

    - uri:

        prefix: /headers

    route:

    - destination:

        port:

          number: 8000

        host: httpbin

EOF

 

 执行以上命令后你就可以用$INGRESS_HOST:$INGRESS_PORT (e.g., 10.30.28.185:31380

) 在浏览器中通过URL进行访问了。比如http://10.30.28.185:31380/headers将会显示请求头信息。


————————————————
版权声明:本文为CSDN博主「方胜新」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21713697/article/details/91360657

 

posted on 2023-05-26 21:48  FLOWERS_WAN  阅读(59)  评论(0编辑  收藏  举报