背景
在使用istio后开始考虑网关了,istio已经有自己的网关,为什么还要另外找一个别的网关,参考了好几个文章大致结论是,istio的网关功能不够强大,下图红色的部分是istio网关暂时缺失的,所以我的结论是在istio外面再加一层网关,虽然现在已经有组织在将api gateway和服务网格融合希望降低学习成本,但是我觉得分开也没什么不好的各司其职,毕竟来说先有的网关才有的服务网格,哪一天服务网格没了网关还在。所以我选择了traefik,现在traefik的原因是因为traefik是用go写的,envoy是c,我用go语言更方便一些,再加上github的星星较多,就它了。
Gateway api
Gateway api是ingress的升级版
- 厂商实现了Gateway API 并定义了自己 GatewayClass 类型,一系列的实现可供选择。就好比编程语言里的类的概念,厂商写好网关类。
- 集群管理员安装 Gateway API 的实现,部署跨命名空间的共享网关实例,或者命名空间独享的网关实例。如下图,集群管理员部署了跨 store 和 site 命名空间的网关 foo。类似于实例化类的概念,集群管理员根据需要new出来自己想要的网关。
- 开发人员创建 HTTPRoute 资源将流量路由到指定的后端服务。类似于调用类里的方法,集群管理员创建好网关后,开发人员去操作该网关。
安装gateway api
看一下这个文章就好了
https://traefik.io/blog/getting-started-with-traefik-and-the-new-kubernetes-gateway-api/
说几点其中注意的
安装 CRD
Kubectl apply -k "github.com/kubernetes-sigs/gateway-api/config/crd?ref=v0.4.0"
如果因为网络限制,可以先把github.com/kubernetes-sigs/gateway-api 这个项目clone下来,然后到/config文件夹执行
Kubectl apply -k ./crd
Helm安装traefik
修改value.yaml
- 支持gateway
- Expose 9000端口,为了dashboard
- service类型改为nodeport
安装
helm install -f values.yaml traefik . -n traefik
更新
helm upgrade -f values.yaml traefik . -n traefik
删除
helm uninstall traefik -n traefik
安装成功
如果没有看到gateway class或者gatway肯定是不成功的,最好describe看一下gateway的状态,正确应该是listener。
访问dashboard
主机ip:暴露的9000端口/dashboard/如上就是ip:32452/dashboard/就能看到,说明你已经成功了。
我曾经在这一步上折腾了好久,网上有些文章是说给dashboard配置一个ingress或者http route,但是我按照他们写的都没有成功,可能是我的问题,所以我就用了一个最简单的方法直接暴露9000端口,这个方式官方不推荐,但是我们先跑起来,日后再说。
部署一个httpRoute
whami.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoami
namespace: traefik
spec:
replicas: 2
selector:
matchLabels:
app: whoami
template:
metadata:
labels:
app: whoami
spec:
containers:
- name: whoami
image: traefik/whoami:v1.6.0
ports:
- containerPort: 80
name: http
---
apiVersion: v1
kind: Service
metadata:
name: whoami
namespace: traefik
spec:
selector:
app: whoami
ports:
- port: 80
targetPort: http
whami-httpRoute.yaml
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: http-app-1
namespace: traefik
spec:
parentRefs:
- name: traefik-gateway
hostnames:
- test.whoami.cn
rules:
- matches:
- path:
type: Exact
value: /
backendRefs:
- name: whoami
port: 80
weight: 1
配置一下hosts然后访问
http://test.whoami.cn:暴露的80端口号/ 我这里就是 http://test.whoami.cn:32560/
也可以去dashboard http里面看看是否配置成功
这样一个最简单的httpRoute就成功了
总结
我在安装时候遇到了很多的坑,所以如果你失败了一定要按照我如上的步骤,多看看,多想想。
参考
https://cloudnative.to/blog/do-i-need-an-api-gateway-if-i-have-a-service-mesh/
https://traefik.io/blog/getting-started-with-traefik-and-the-new-kubernetes-gateway-api/
https://medium.com/solo-io/getting-started-with-a-service-mesh-starts-with-a-gateway-96384deedca2
https://jimmysong.io/blog/why-gateway-api-is-the-future-of-ingress-and-mesh/
https://mp.weixin.qq.com/s/UZmcAx_Uj4Ozpa7QFVKLwQ
https://atbug.com/why-smi-collaborating-in-gateway-api-gamma/