尝试安装Kong网关

首先

看来我们需要构建一个将API网关安装在本地环境的配置。本来想使用AWS的API Gateway,但是听说使用开源软件Kong Gateway和Kong Ingress Controller也可以解决问题,所以打算尝试安装。

根据文件中的安装说明进行安装,适合那些想要尝试安装或作为入门使用者的人使用。

必需品 (bì

    • Kubeadm/kubectl/kubelet 1.28.4

 

    helm 3.13.1

不考虑网络、服务器实例的建设以及Kubernetes的安装。

试试看

安装helm

$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
$ chmod 700 get_helm.sh
$ ./get_helm.sh

安装Kong网关

创建命名空间

$ kubectl create namespace kong

安装Kong

孔正在使用helm进行安装。

# Gateway APIのカスタムリソース(CRD)をインストール
$ kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml

# GatewayとGatewayClassを作成
$ echo "
---
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
 name: kong
 annotations:
   konghq.com/gatewayclass-unmanaged: 'true'

spec:
 controllerName: konghq.com/kic-gateway-controller
---
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
 name: kong
spec:
 gatewayClassName: kong
 listeners:
 - name: proxy
   port: 80
   protocol: HTTP
" | kubectl apply -f -

$ helm repo add kong https://charts.konghq.com
$ helm repo update

# Kong Ingress ControllerとKong Gatewayをインストール
$ helm install kong kong/ingress -n kong --create-namespace

$  kubectl get ns
NAME              STATUS   AGE
default           Active   6m38s
kong              Active   4m48s
kube-flannel      Active   5m42s
kube-node-lease   Active   6m38s
kube-public       Active   6m39s
kube-system       Active   6m39s

$ kubectl get pods -ALL
NAMESPACE      NAME                                     READY   STATUS    RESTARTS   AGE     L
kong           kong-controller-7dcb48b75d-2hgx6         1/1     Running   0          35s     
kong           kong-gateway-697fdd75fd-8sd9n            1/1     Running   0          35s     
kube-flannel   kube-flannel-ds-lr6hv                    1/1     Running   0          5m57s   
kube-system    coredns-5dd5756b68-6w8jn                 1/1     Running   0          6m38s   
kube-system    coredns-5dd5756b68-lhqp2                 1/1     Running   0          6m38s   
kube-system    etcd-ip-10-0-100-55                      1/1     Running   0          6m52s   
kube-system    kube-apiserver-ip-10-0-100-55            1/1     Running   0          6m52s   
kube-system    kube-controller-manager-ip-10-0-100-55   1/1     Running   0          6m50s   
kube-system    kube-proxy-vpqft                         1/1     Running   0          6m38s   
kube-system    kube-scheduler-ip-10-0-100-55            1/1     Running   0          6m50s 

$ kubectl get svc -ALL -o wide
NAMESPACE     NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE    SELECTOR                                                                                                                                                                                            L
default       kubernetes                           ClusterIP      10.96.0.1        <none>        443/TCP                         8m6s   <none>                                                                                                                                                                                              
kong          kong-controller-validation-webhook   ClusterIP      10.105.250.203   <none>        443/TCP                         109s   app.kubernetes.io/component=app,app.kubernetes.io/instance=kong,app.kubernetes.io/managed-by=Helm,app.kubernetes.io/name=controller,app.kubernetes.io/version=3.4,helm.sh/chart=controller-2.31.0   
kong          kong-gateway-admin                   ClusterIP      None             <none>        8444/TCP                        109s   app.kubernetes.io/component=app,app.kubernetes.io/instance=kong,app.kubernetes.io/name=gateway                                                                                                      
kong          kong-gateway-manager                 NodePort       10.103.106.63    <none>        8002:31082/TCP,8445:30532/TCP   109s   app.kubernetes.io/component=app,app.kubernetes.io/instance=kong,app.kubernetes.io/name=gateway                                                                                                      
kong          kong-gateway-proxy                   LoadBalancer   10.103.60.0      <pending>     80:32115/TCP,443:32090/TCP      109s   app.kubernetes.io/component=app,app.kubernetes.io/instance=kong,app.kubernetes.io/name=gateway                                                                                                      
kube-system   kube-dns                             ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP          8m4s   k8s-app=kube-dns 

对Kong进行连接测试

如果前端有负载均衡器,请指定其IP地址或主机名。

$ curl -i http://localhost:32115/
HTTP/1.1 404 Not Found
Date: Tue, 21 Nov 2023 12:00:48 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 52
X-Kong-Response-Latency: 0
Server: kong/3.4.2

{
  "message":"no Route matched with those values"
}

部署测试用的应用程序

$ kubectl apply -f https://docs.konghq.com/assets/kubernetes-ingress-controller/examples/echo-service.yaml
service/echo created
deployment.apps/echo created

将路由设置为部署目标

$ echo "
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
 name: echo
 annotations:
   konghq.com/strip-path: 'true'
spec:
 parentRefs:
 - name: kong
 rules:
 - matches:
   - path:
       type: PathPrefix
       value: /echo
   backendRefs:
   - name: echo
     kind: Service
     port: 1027
" | kubectl apply -f -
httproute.gateway.networking.k8s.io/echo created

确认路由

确认 Kong Gateway 可以正确地将流量路由到在 Kubernetes 内部运行的应用程序。

$ curl -i http://localhost:32115/echo
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 139
Connection: keep-alive
Date: Tue, 21 Nov 2023 12:02:13 GMT
X-Kong-Upstream-Latency: 1
X-Kong-Proxy-Latency: 0
Via: kong/3.4.2

Welcome, you are connected to node ip-10-0-100-55.
Running on Pod echo-74c66b778-krftv.
In namespace default.
With IP address 10.244.0.6.

创建费率限制插件

创建KongPlugin定义,并将konghq.com/plugins注释添加到Kubernetes资源中。

$ echo "
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
 name: rate-limit-5-min
 annotations:
   kubernetes.io/ingress.class: kong
config:
 minute: 5
 policy: local
plugin: rate-limiting
" | kubectl apply -f -
kongplugin.configuration.konghq.com/rate-limit-5-min created

将插件与服务或根目录相关联。

$ kubectl annotate service echo konghq.com/plugins=rate-limit-5-min
service/echo annotated

插件的功能验证

这句话表明速率限制插件阻止了请求到达上游服务。

$ for i in `seq 6`; do curl -sv http://localhost:32115/echo 2>&1 | grep "< HTTP"; done
< HTTP/1.1 200 OK
< HTTP/1.1 200 OK
< HTTP/1.1 200 OK
< HTTP/1.1 200 OK
< HTTP/1.1 200 OK
< HTTP/1.1 429 Too Many Requests

创建Proxy-Cache的KongClusterPlugin

KongPlugin可以应用于特定的服务或路由,而KongClusterPlugin则适用于所有服务的全局服务。
为了验证,我们将创建一个KongClusterPlugin,用于缓存所有GET和HEAD请求的所有HTTP 200响应,缓存时间为300秒。

$ echo '
apiVersion: configuration.konghq.com/v1
kind: KongClusterPlugin
metadata:
 name: proxy-cache-all-endpoints
 annotations:
   kubernetes.io/ingress.class: kong
 labels:
   global: "true"
plugin: proxy-cache
config:
 response_code:
 - 200
 request_method:
 - GET
 - HEAD
 content_type:
 - text/plain; charset=utf-8
 cache_ttl: 300
 strategy: memory
' | kubectl apply -f -
kongclusterplugin.configuration.konghq.com/proxy-cache-all-endpoints created

代理缓存的插件功能验证

最初的请求是以X-Cache-Status: Miss返回的,表示请求被发送到上游服务了。
接下来的四个响应是以X-Cache-Status: Hit返回的,表示请求是从缓存中发送的。

最后需要注意的是,当HTTP 429请求由于速率限制插件返回时,X-Cache-Status标头不会显示。这是因为速率限制先于代理缓存执行。

$ for i in `seq 6`; do curl -sv http://localhost:32115/echo 2>&1 | grep -E "(Status|< HTTP)"; done
< HTTP/1.1 200 OK
< X-Cache-Status: Miss
< HTTP/1.1 200 OK
< X-Cache-Status: Hit
< HTTP/1.1 200 OK
< X-Cache-Status: Hit
< HTTP/1.1 200 OK
< X-Cache-Status: Hit
< HTTP/1.1 200 OK
< X-Cache-Status: Hit
< HTTP/1.1 429 Too Many Requests

在之前的应用中添加认证功能

#key-authプラグインを作成する
$ echo "
apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
  name: key-auth
plugin: key-auth
config:
  key_names:
  - apikey
" | kubectl apply -f -
kongplugin.configuration.konghq.com/key-auth created

#echoサービスに、前回のrate-limitプラグインに加えて、key-authプラグインを適用する。
$ kubectl annotate service echo konghq.com/plugins=rate-limit-5-min,key-auth --overwrite
service/echo annotated

对API进行访问并确认认证功能正常。

由于没有密钥,无法进行认证。

$ curl -i http://localhost:32115/echo
HTTP/1.1 401 Unauthorized
Date: Tue, 21 Nov 2023 12:06:31 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
WWW-Authenticate: Key realm="kong"
Content-Length: 45
X-Kong-Response-Latency: 1
Server: kong/3.4.2

{
  "message":"No API key found in request"
}

创建密钥

Kong Gateway的密钥认证使用consumer对象。密钥分配给consumer,在请求中进行密钥认证。密钥被保存为k8s秘密并由Kong Consumer CRD进行管理。

#kongCredType=key-authとして新しいシークレットを作成する。
$ kubectl create secret generic alex-key-auth \\
  --from-literal=kongCredType=key-auth \
  --from-literal=key=hello_world
secret/alex-key-auth created

#新しいconsumerを作成し、credentialをアタッチする。
$ echo "apiVersion: configuration.konghq.com/v1
kind: KongConsumer
metadata:
  name: alex
  annotations:
    kubernetes.io/ingress.class: kong
username: alex
credentials:
- alex-key-auth
" | kubectl apply -f -
kongconsumer.configuration.konghq.com/alex created

确认动作

$ curl -H 'apikey: hello_world' http://localhost:32115/echo
Welcome, you are connected to node ip-10-0-100-55.
Running on Pod echo-74c66b778-krftv.
In namespace default.
With IP address 10.244.0.6.

请参考

Kubernetes的信息。

 kubectl get all -ALL
NAMESPACE      NAME                                         READY   STATUS    RESTARTS   AGE   L
default        pod/echo-74c66b778-krftv                     1/1     Running   0          24m   
kong           pod/kong-controller-7dcb48b75d-2hgx6         1/1     Running   0          27m   
kong           pod/kong-gateway-697fdd75fd-8sd9n            1/1     Running   0          27m   
kube-flannel   pod/kube-flannel-ds-lr6hv                    1/1     Running   0          33m   
kube-system    pod/coredns-5dd5756b68-6w8jn                 1/1     Running   0          33m   
kube-system    pod/coredns-5dd5756b68-lhqp2                 1/1     Running   0          33m   
kube-system    pod/etcd-ip-10-0-100-55                      1/1     Running   0          34m   
kube-system    pod/kube-apiserver-ip-10-0-100-55            1/1     Running   0          34m   
kube-system    pod/kube-controller-manager-ip-10-0-100-55   1/1     Running   0          34m   
kube-system    pod/kube-proxy-vpqft                         1/1     Running   0          33m   
kube-system    pod/kube-scheduler-ip-10-0-100-55            1/1     Running   0          34m   

NAMESPACE     NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                         AGE   L
default       service/echo                                 ClusterIP      10.110.174.199   <none>        1025/TCP,1026/TCP,1027/TCP      24m   
default       service/kubernetes                           ClusterIP      10.96.0.1        <none>        443/TCP                         34m   
kong          service/kong-controller-validation-webhook   ClusterIP      10.105.250.203   <none>        443/TCP                         27m   
kong          service/kong-gateway-admin                   ClusterIP      None             <none>        8444/TCP                        27m   
kong          service/kong-gateway-manager                 NodePort       10.103.106.63    <none>        8002:31082/TCP,8445:30532/TCP   27m   
kong          service/kong-gateway-proxy                   LoadBalancer   10.103.60.0      <pending>     80:32115/TCP,443:32090/TCP      27m   
kube-system   service/kube-dns                             ClusterIP      10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP          34m   

NAMESPACE      NAME                             DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE   L
kube-flannel   daemonset.apps/kube-flannel-ds   1         1         1       1            1           <none>                   33m   
kube-system    daemonset.apps/kube-proxy        1         1         1       1            1           kubernetes.io/os=linux   34m   

NAMESPACE     NAME                              READY   UP-TO-DATE   AVAILABLE   AGE   L
default       deployment.apps/echo              1/1     1            1           24m   
kong          deployment.apps/kong-controller   1/1     1            1           27m   
kong          deployment.apps/kong-gateway      1/1     1            1           27m   
kube-system   deployment.apps/coredns           2/2     2            2           34m   

NAMESPACE     NAME                                         DESIRED   CURRENT   READY   AGE   L
default       replicaset.apps/echo-74c66b778               1         1         1       24m   
kong          replicaset.apps/kong-controller-7dcb48b75d   1         1         1       27m   
kong          replicaset.apps/kong-gateway-697fdd75fd      1         1         1       27m   
kube-system   replicaset.apps/coredns-5dd5756b68           2         2         2       33m 

・在Kubernetes上安装
・安装KIC
・安装helm
・网关
・网关类别
・网关API
・HTTP路由
・注解

bannerAds