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) 编辑 收藏 举报