KubeSphere 是在 Kubernetes 中构建的深度云原生应用的系统,完全开源,支持多云与多集群管理自动化,提供全栈的 IT 运维能力,简化企业的 DevOps 工作流。它的架构可以非常方便地使应用应用与云原生生态组件进行即插即用(即插即用)的集成。
是全栈的多管道容器平台,KubeSphere 提供了运维友好的形状操作界面,帮助企业构建了一个强大的专门功能的容器。KubeSphere 为用户提供构建企业级Kubernetes 环境需求的报告功能,多云与多集群管理、Kubernetes 管理、DevOps、生命周期管理、微服务管理(服务网格)、与收集、服务与网络、多洞察管理、监控资源日志、事件与审计、存储查询管理、访问权限控制、GPU 支持、网络策略、监督管理以及安全管理等。
Apache APISIX 是伪开源的、动态的云原生网关,由深圳支流科技有限公司于 2019 年捐赠给 Apache 基金会,成为 Apache 基金会的当下流行项目,也是 GitHub 上最新的门户项目。 Apache APISIX 目前已经覆盖了 API 网关,LB,Kubernetes Ingress,Service Mesh 等多种场景。
将现有 Kubernetes 集群已更新 KubeSphere 管理。
我们可以参考 KubeSphere 的文档启用 KubeSphere 的 AppStore(https://kubesphere.io/docs/pluggable-components/app-store/),或者使用使用 Apache APISIX 的 Helm 仓库来进行开发。这里,我们直接使用 Apache APISIX的 Helm 仓库进行部署。
执行以下命令添加添加Apache APISIX的Helm repo,并完成部署。
➜ ~ helm repo add apisix https://charts.apiseven.com
"apisix" has been added to your repositories
➜ ~ helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
➜ ~ helm repo update
➜ ~ kubectl create ns apisix
namespace/apisix created
➜ ~ helm install apisix apisix/apisix --set gateway.type=NodePort --set ingress-controller.enabled=true --namespace apisix
W0827 18:19:58.504653 294386 warnings.go:70] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
NAME: apisix
LAST DEPLOYED: Fri Aug 27 18:20:00 2021
NAMESPACE: apisix
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace apisix -o jsonpath="{.spec.ports[0].nodePort}" services apisix-gateway)
export NODE_IP=$(kubectl get nodes --namespace apisix -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
验证是否已经成功实施且运行:
➜ ~ kubectl -n apisix get pods
NAME READY STATUS RESTARTS AGE
apisix-77d7545d4d-cvdhs 1/1 Running 0 4m7s
apisix-etcd-0 1/1 Running 0 4m7s
apisix-etcd-1 1/1 Running 0 4m7s
apisix-etcd-2 1/1 Running 0 4m7s
apisix-ingress-controller-74c6b5fbdd-94ngk 1/1 Running 0 4m7s
可以看到相关的Pod均已正常运行。
我们kennethreitz/httpbin
用作示例项目进行演示。这里也直接在 KubeSphere 中完成部署。
选择服务——无状态服务,创建简单。
在 KubeSphere 的服务和负载界面可视化展开成功,也可以直接在终端下查看是否已经展开成功。
➜ ~ kubectl get pods,svc -l app=httpbin
NAME READY STATUS RESTARTS AGE
pod/httpbin-v1-7d6dc7d5f-5lcmg 1/1 Running 0 48s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/httpbin ClusterIP 10.96.0.5 80/TCP 48s
我们先演示如何使用 Apache APIIX 作为网关代理 Kubernetes 中的服务。
root@apisix:~$ kubectl -n apisix exec -it `kubectl -n apisix get pods -l app.kubernetes.io/name=apisix -o name` -- bash
bash-5.1# curl httpbin.default/get
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.default",
"User-Agent": "curl/7.77.0"
},
"origin": "10.244.2.9",
"url": "http://httpbin.default/get"
}
可以在 Apache APISIX 的 Pod 内看到正常访问的示例项目。下边使用 Apache APISIX 的示例项目进行代理。
这里我们使用 curl
调用 Apache APISIX 的 admin 接口,创建一条路由。将所有 host 头为 httpbin.org
的请求转发给 httpbin.default:80
这个实际的应用服务上。
bash-5.1# curl "http://127.0.0.1:9180/apisix/admin/routes/1" -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d '
{
"uri": "/get",
"host": "httpbin.org",
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.default:80": 1
}
}
}'
{"node":{"key":"\/apisix\/routes\/1","value":{"host":"httpbin.org","update_time":1630060883,"uri":"\/*","create_time":1630060883,"priority":0,"upstream":{"type":"roundrobin","pass_host":"pass","nodes":{"httpbin.default:80":1},"hash_on":"vars","scheme":"http"},"id":"1","status":1}},"action":"set"}
你会得到类似上面的输出,接下来验证是否代理成功:
bash-5.1# curl http://127.0.0.1:9080/get -H "HOST: httpbin.org"
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.77.0",
"X-Forwarded-Host": "httpbin.org"
},
"origin": "127.0.0.1",
"url": "http://httpbin.org/get"
}
得到上面的输出,说明已经通过 Apache APISIX 代理了示例项目的流量。接下来我们试试在集群外通过 Apache APISIX 访问示例项目。
root@apisix:~$ kubectl -n apisix get svc -l app.kubernetes.io/name=apisix
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
apisix-admin ClusterIP 10.96.33.97 9180/TCP 22m
apisix-gateway NodePort 10.96.126.83 80:31441/TCP 22m
在使用 Helm chart 部署的时候,默认会将 Apache APISIX 的端口通过 NodePort 的形式暴露出去。我们使用 Node IP + NodePort 的端口进行访问测试。
root@apisix:~$ curl http://172.18.0.5:31441/get -H "HOST: httpbin.org"
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "httpbin.org",
"User-Agent": "curl/7.76.1",
"X-Forwarded-Host": "httpbin.org"
},
"origin": "10.244.2.1",
"url": "http://httpbin.org/get"
}
可以看到,在集群外已经可以通过 Apache APISIX 作为网关代理 Kubernetes 集群内的服务了。
我们可以直接在 KubeSphere 中添加应用路由(Ingress) ,Apache APISIX Ingress Controller 会自动将路由规则同步至 Apache APISIX 中,完成服务的代理。
注意我们添加了 kubernetes.io/ingress.class: apisix
的 annotation 配置,用于支持集群内多 ingress-controller 的场景。
保存后,可看到如下界面:
在终端下测试是否代理成功:
root@apisix:~$ curl http://172.18.0.5:31441/get -H "HOST: http-ing.org"
{
"args": {},
"headers": {
"Accept": "*/*",
"Host": "http-ing.org",
"User-Agent": "curl/7.76.1",
"X-Forwarded-Host": "http-ing.org"
},
"origin": "10.244.2.1",
"url": "http://http-ing.org/get"
}
可以看到也正常代理了。
除了以上方式外,Apache APISIX Ingress Controller 通过 CRD 的方式对 Kubernetes 进行了扩展,你也可以通过发布 ApisixRoute
等这种自定义资源来完成 Kubernetes 中服务的对外暴露。
你可以在 KubeSphere 中使用 Apache APISIX 的官方 Helm 仓库直接部署 Apache APISIX 和 APISIX Ingress Controller 。并且 Apache APISIX 可通过作为网关,或者 APISIX Ingress Controller 的数据面来承载业务流量。
Apache APISIX 已经与 KubeSphere 社区达成合作,你可以直接在 KubeSphere 自带的应用仓库中找到 Apache APISIX ,不需要手动添加 Helm 仓库。
Apache APISIX 是一个动态、实时、高性能的开源 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX 可以帮忙企业快速、安全的处理 API 和微服务流量,包括网关、Kubernetes Ingress 和服务网格等。
全球已有数百家企业使用 Apache APISIX 处理关键业务流量,涵盖金融、互联网、制造、零售、运营商等等,比如美国航空航天局(NASA)、欧盟的数字工厂、中国航信、中国移动、腾讯、华为、微博、网易、贝壳找房、360、泰康、奈雪的茶等。
200 余位贡献者,一同缔造了 Apache APISIX 这个世界上最活跃的开源网关项目。聪明的开发者们!快来加入这个活跃而多样化的社区,一起来给这个世界带来更多美好的东西吧!