引言
APISIX 是目前比较强大的网关组件,个人认为它有很多优势,首先是国人开发的,相比于Kong,会更友好一点,其次功能上也比较全面。
虽然APISIX隔三差五在云原生生态圈中做演讲,宣传,但是它整个社区的文档,我觉得对于新手是不友好的,如果想做国民云原生网关,其实可以少一点架构宣传,多一点落地参考,这也是我在各大社区下面看到的很多评论,大家其实是更希望社区出点接地气的部署使用文档,本人也是断断续续看了几天文档,结合一下网上收集的资料,总结一下如何在k8s环境中落地APISIX,以及最佳落地实践。
知识储备
考虑到,不是所有人都对k8s接触很多,这里我啰嗦几句,再串一下概念
- APISXI APISXI 是一款类似NGINX的网关组件,它可以独立部署
- APISIX Ingress Controller 如果在k8s环境中部署,则需要APISIX,APISIX Ingress Controller 2个组件,APISIX Ingress Controller负责和k8s交互,如果是传统虚机模式,部署APISXI即可(Kong是一个Pod启动2个容器,proxy和ingress,对应APISIX,APISIX Ingress Controller 2个Pod)。有些文档写的不清不楚的,一点要缕清这2个组件
准备工作
由于部署APISIX,需要Etcd环境(不知道为什么不用集群自带的,这块暂时没有研究),这里我们采用官方的默认部署模式,在部署的时候,需要提供StrageClass存储,所以我们要提前先安装好StrageClass。然后根据你选择的部署的方式,建议使用helm。
StrageClass部署,这里使用nfs,先安装服务,配置,然后helm安装 nfs provisioner。
参考官方文档,https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=124.xxx.xxx.xxx \
--set nfs.path=/home/k8s
安装好之后,我们还要做一个事情,就是把 nfs provisioner 设置成默认的 StrageClass,执行这个命令:
kubectl patch storageclass <your-class-name> -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
如果用false则取消默认,只能有一个sc被标记为默认。如果它们中有两个或多个被标记为默认,Kubernetes 将忽略这个注解, 也就是它将表现为没有默认 StorageClass。我们get sc的时候,可以看到 gold (default) 这种输出则是配置了默认sc。
helm 部署
helm repo add apisix https://charts.apiseven.com
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
kubectl create ns ingress-apisix
部署 apisix,同时部署 ingress-controller,从下面命令也可以看出来
helm install apisix apisix/apisix \
--set gateway.type=NodePort \
--set ingress-controller.enabled=true \
--set etcd.persistence.storageClass="nfs-client" \
--set etcd.persistence.size="4Gi" \
--namespace ingress-apisix \
--set ingress-controller.config.apisix.serviceNamespace=ingress-apisix
再部署一下官方提供的管理后台:
helm install apisix-dashboard apisix/apisix-dashboard --namespace ingress-apisix
部署到这里就完了,但是由于各种原因,比如版本问题,环境问题,大家会不一致,所以会遇到各种问题。
部署检查
部署完成后,首先确保每个容器都启动成功,etcd如果启动失败,那大概率是存储的问题,排查处理。
之后我们还要检查启动日志,2个Pod都要查看,如果有那种error报错,就按照报错的内容去处理。
一般都是内部服务网络配置问题,参考以下配置做一些调整:
# apisix 配置,如果使用ssl,需要开启,默认是不开启的
ssl:
enable: true
enable_http2: true
allow_admin:
- 127.0.0.1/24
- 0.0.0.0/0
# controller 配置,看你的ns
apisix:
default_cluster_base_url: http://apisix-admin.ingress-apisix.svc.cluster.local:9180/apisix/admin
验证
创建一个 ApisixRoute 对象,验证是否能通过外部域名访问
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: dashboard-route
namespace: ingress-apisix
spec:
http:
- name: route-2
match:
hosts:
- apisix.liuzhidream.com
paths:
- /*
backends:
- serviceName: apisix-dashboard
servicePort: 80
下一步我们要调整端口,这里其实看大家是怎么部署的,默认apisix是使用LoadBalancer,这样我们自己的k8s需要安装L4的负载均衡器,这块比较灵活,也就是以下几种:
- LoadBalancer 需要外部LB
- NodePort 这种暴露方式也是可以的,虽然一般不作为生产使用,不过如果是小规模集群,其实也是可以的
- 主机网络模式 这是一种小规模k8s容易忽视的模式,其实这种模式很好用,因为我们会规划几台服务器作为网关,那么直接使用主机模式,把Pod网络接入到主机,可以映射到标准的80,443端口
这里我们采用NodePort模式,调整端口范围限制,然后找到 apisix-gateway 这个 svc,把apisix的端口通过svc暴露,并且由于修改了默认端口范围,我们可以直接映射到80,443标准端口上
k8s 集群 nodePort 分配的端口范围为:30000-32767,这是默认值,
如果配置不在这个范围内的端口会报错
/etc/kubernetes/manifests/kube-apiserver.yaml
调整静态pod的配置文件可以修改端口范围
加上这个参数
--service-node-port-range=1-65535
修改svc
ports:
- name: apisix-gateway
protocol: TCP
port: 80
targetPort: 9080
nodePort: 80
- name: apisix-gateway-tsl
protocol: TCP
port: 443
targetPort: 9443
nodePort: 443
然后我们通过域名访问我们的服务,如果你没有一个可以解析的域名,那么就配置hosts即可。整个服务正常的话,应该是可以在后台看到我们创建的资源对象的。
总结
整个部署过程其实不复杂,对于经常接触k8s生态的同学来说,建议直接看官方文档即可,参考
https://apisix.apache.org/zh/docs/ingress-controller/deployments/ack/
这部分,一定要理解 APISIX,APISIX Ingress Controller 2个组件的作用。整篇文章其实就是想告诉大家,部署很简单,官方文档说的很明白了,只是需要你花时间去消化。
其它就没有什么特别需要注意和调整的,一般都是ns的问题,或者你参考网上的文章,它的版本不一样和你一样,然后部署了需要验证,根据自己的环境情况,调整svc模式,自己集群生产小规模使用,建议直接主机网络模式,NodePort模式如果想映射标准端口,会占用每个节点的80,443。另外没必要非得部署SLB,除非你的SLB是硬件负载,否则再套一个MetalLB或者Nginx转发一次网络没必要,当然一切看你的网络环境。
评论区