网站首页 > 精选教程 正文
本文将使用helm在Kubernetes集群中部署微服务API网关kong,并将其用作Kubernetes的Ingress Controller。
Kong官方单独维护了一个项目叫Kong for Kubernetes,项目的地址是https://github.com/Kong/kubernetes-ingress-controller。 Kong for Kubernetes是一个Kubernetes的Ingress Controller,通过插件架构提供API管理能力。 Kong官方另外提供了一个Helm Chart,使用Helm安装这个Chart可以在Kubernetes集群上运行Kong所需的所有组件。
使用helm部署在Kubernetes集群中部署kong for kubernetes,需要先添加kong的chart repo:
helm repo add kong https://charts.konghq.com
helm repo update
接下来需要针对所部署的Kubernetes环境定制配置,可以参考kong helm chart的配置文档https://github.com/Kong/charts/blob/main/charts/kong/README.md, 也可以使用下面的命令打印chart的默认配置再参考默认配置结合部署环境做出定制:
helm show values kong/kong
这里先做最基本的安装,目标是基本实现与nginx ingress controller相同的功能,kong对API管理的高级功能后边再单独详细介绍。 根据最基本安装的目标对配置定制如下,创建kong-values.yaml文件:
ingressController:
ingressClass: kong
postgresql:
enabled: false
proxy:
http:
hostPort: 80
tls:
hostPort: 443
nodeSelector:
node-role.kubernetes.io/edge: ''
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/instance
operator: In
values:
- kong
- key: app.kubernetes.io/name
operator: In
values:
- kong
topologyKey: kubernetes.io/hostname
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
- key: node-role.kubernetes.io/master
operator: Exists
effect: PreferNoSchedule
上面的配置指定kong以dbless模式部署,并指定ingressClass为空,另外做了Pod调度相关配置。
使用下面的命令安装:
helm install ingress-kong kong/kong --create-namespace -n ingress-kong -f kong-values.yaml
安装完成后,查看可以看出默认以Deployment部署,同时创建了Type为LoadBalancer的service kong-kong-proxy并暴露了30444和30079两个NodePort分别对应http和https协议, 由云提供商外部负载均衡器将流量路由到自动创建的两个NodePort上。
kubectl get all -n ingress-kong
NAME READY STATUS RESTARTS AGE
pod/ingress-kong-kong-554f65c956-44xlq 2/2 Running 0 2m11s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/ingress-kong-kong-proxy LoadBalancer 10.98.63.185 <pending> 80:31374/TCP,443:32492/TCP 2m11s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/ingress-kong-kong 1/1 1 1 2m11s
NAME DESIRED CURRENT READY AGE
replicaset.apps/ingress-kong-kong-554f65c956 1 1 1 2m11s
因为这里使用的Kubernetes集群并没有cloud provider,所以上面ingress-kong-kong-proxy的EXTERNAL-IP一直处于pending状态,不过没有关系,helm在安装时的定制配置中开启了 http和https的两个hostPort,而且通过podAntiAffinity限制Pod在调度时相同的两个Pod不会调度到同一个Node上,所以我们可以使用http//edgeNodeIp和https//edgeNodeIp的形式来访问kong的proxy服务。 ingress-kong-kong-554f65c956-44xlq这个Pod中有两个容器,一个是Proxy即kong本身,另一个是kong ingress controller。
curl http://192.168.100.101
{"message":"no Route matched with those values"}
在node上使用netstat -nltp查看发现并没有监听80和443端口,而可以使用hostPort直接访问的原因是因为,是k8s帮我们创建了hostPort到containerPort的nat,可以下面的命令查看:
kubectl get pod -n ingress-kong -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ingress-kong-kong-554f65c956-44xlq 2/2 Running 0 14m 10.244.166.136 node1 <none> <none>
iptables -nvL -t nat | grep DNAT | grep 10.244.166.136
2 120 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:10.244.166.136:8000
2 128 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 to:10.244.166.136:8443
我们已经完成kong ingress controller的安装,注意这里使用的Kubernetes集群中并没有安装其他的ingress controller(如nginx ingress controller),如果需要在集群中安装多个不同的ingress controller 还需要做特别的配置和避免冲突,k8s的ingress文档https://kubernetes.io/docs/concepts/services-networking/ingress/中有这部分内容描述(例如IngressClass资源),这里不再展开,后边有机会再详细介绍。
到目前为止我们已经在Kubernetes集群中部署了Kong for Kubernetes这个Ingress Controller,下面我们来创建Ingress尝试使用它。 我们使用它来将k8s的dashbaord暴露到集群外部,创建k8s dashbaord的ingress如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: kong
konghq.com/protocols: "https"
name: kubernetes-dashboard
namespace: kube-system
spec:
rules:
- host: k8s.example.com
http:
paths:
- backend:
service:
name: kubernetes-dashboard
port:
number: 443
path: /
pathType: Prefix
tls:
- hosts:
- k8s.example.com
secretName: example-com-tls-secret
因为后端k8s dashboard使用的是https,所以还需要修改k8s dashbaord的service加入konghq.com/protocol: https这个annotation。 关于kong ingress的配置注解可以查看文档。完成以上配置后,访问https://k8s.example.com可以正常打开k8s dashboard。k8s dashboard的由kong暴露到k8s集群外部。
到这里,我们已经完成Kong for Kubernetes最简单的基本部署,实现了与nginx ingress controller相同的功能,kong对API管理的高级功能这是nginx ingress controller不具备的,后边单独展开。
参考
- https://artifacthub.io/packages/helm/kong/kong
- https://github.com/Kong/kubernetes-ingress-controller
- https://github.com/Kong/kong
- https://github.com/pantsel/konga
- https://kubernetes.io/zh/docs/concepts/services-networking/ingress/
猜你喜欢
- 2024-10-23 业务中台技术架构清单 技术中台和业务中台
- 2024-10-23 业务中台架构设计要点 业务中台架构设计要点有哪些
- 2024-10-23 SpringCloud升级之路2020.0.x版-41. SpringCloudGateway 详解(1)
- 2024-10-23 Kubernetes中API安全的最佳实践 kubernetes aggregate api
- 2024-10-23 微服务之“网关模式” 微服务网关有哪些功能
- 2024-10-23 体系课-慕课Go开发工程师2023全新版
- 2024-10-23 《微服务架构设计模式》读书笔记(八):外部API模式
- 2024-10-23 高性能多级网关与多级缓存架构落地实战(超清完结)
- 2024-10-23 Kong 配置讲解之十三——开发与其他相关属性详解
- 2024-10-23 Kong1.x和2.x共存开发 python2.x和3.x的区别
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)