在 Kubernetes 上部署 Kong,并使用 Prometheus 监控流量
这是介绍在Kong和HashiCorp Meetup Tokyo #1上展示的演示的内容。
首先
我们举办了「Kong + HashiCorp Meetup Tokyo #1」活动。活动中将展示题为Kong的产品演示。如果一切准备就绪,您可以在大约10分钟内体验Kong的世界。
我们将使用「Kubernetes」和「Kubernetes Ingress Contoller for Kong」。
关于孔子
这款开源的API网关软件可以实现基于Web API的云计算和微服务的整合。它适用于Linux、Docker、Kubernetes、AWS、GCP、Azure等广泛环境,具有7500万次下载累计的高人气。
关于准备好的环境。
-
- MAC
macOS Mojave バージョン 10.14.6
プロセッサ : 3.1 Ghz
メモリ : 16 GB
VirtualBox
minikube を動作させるために必要
バージョン 6.0.6 r130520
Docker
Desktop Community Version 2.0.0.3
Kuvernetes: v1.10.11
事先準備
如果未安装
-
- VirtualBox インストール
- Docker インストール (Docker Destop for Mac)
有关从终端使用的命令的事项。
- helm (Kubernetes 用のパッケージマネージャー)
$ brew install kubernetes-helm
- minibule (Kubernetes ローカル環境で実行するためのツール)
$ brew cask install minikube
- kubectl (Kubernetes コマンドラインツール)
$ brew install kubectl
-
- watch (コマンド)
- watch コマンドは、インストール状況確認に便利です。(しなくても進められます。)
$ brew install watch
-
- munikube のメモリ設定について
- 4 GB ほど割り当てたほうが安定した動作確認がしやすいです。
设定的例子
$ minikube config set memory 4096
$ minikube delete (一旦 delete する必要あります)
$ minibuke start
Kong 演示
下面是Kong演示的介绍。
初始化(重置用途)
在需要重新开始时使用。
$ minikube delete
$ minubuke start
$ helm init
安装Kong
Kubernetes使用软件包管理器helm进行部署。
使用–namespace kong指定了命名空间进行部署。
$ helm install stable/kong --name kong --namespace kong --values https://bit.ly/2RgSRio --version 0.9.0
2. 确认Kong的安装情况
在这里,使用了watch命令。
如果没有安装watch命令,请多次执行以下kubectl命令。
$ watch -n 1 kubectl get pod -n kong
执行完成后
NAME READY STATUS RESTARTS AGE
kong-kong-58d994d4d8-z7cwv 1/1 Running 0 3m55s
kong-kong-controller-cb4c7977-cmd8h 2/2 Running 0 3m55s
kong-kong-init-migrations-fxt6r 0/1 Completed 0 3m55s
kong-postgresql-0 1/1 Running 0 3m55s
只要”migrations”项目以外的内容变为”Running”,安装就成功了!
姓名表示自上而下,
-
- プロキシリクエスト処理用、DataPlane
KongAPI を処理する、ControlPlane
データストアにテーブルを作成する、マイグレーション
データストア(postgresql)
设定了四个 POD。
3. 揭露孔公開
我要设置端口转发。
$ kubectl --namespace kong port-forward $(kubectl get pods --namespace kong -l "app=kong" -o jsonpath="{.items[0].metadata.name}") 8000 &
由于端口8000现在可以从外部访问,我们将进行确认。
4. 检查确保
使用cURL命令。
$ curl 127.0.0.1:8000
Handling connection for 8000
{“message”:“no Route matched with those values”}
如果能够得到这样的回应,那就成功了!
5. 安装服务
在这次演示中,我们将安装要使用的服务。
由于要向Kubernetes添加资源,所以需要应用YAML文件。
$ kubectl apply -f https://gist.githubusercontent.com/hbagdi/2d8ef66fe22cb99e1514f410f992268d/raw/a03d789b70c46ccd0b99d9f1ed838dc21419fc33/multiple-services.yaml
执行结果,
deployment.extensions/http-svc created
service/billing created
service/invoice created
service/comments created
6. 安装用于服务的入口控制(Ingress)
安装Ingress(用于负载均衡的API对象),以便可以从kubernetes集群外部访问服务。
$ echo "apiVersion: configuration.konghq.com/v1
kind: KongIngress
metadata:
name: strip-path
route:
strip_path: true
" | kubectl apply -f -
和
$ echo "apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
configuration.konghq.com: strip-path
name: sample-ingresses
spec:
rules:
- http:
paths:
- path: /billing
backend:
serviceName: billing
servicePort: 80
- path: /comments
backend:
serviceName: comments
servicePort: 80
- path: /invoice
backend:
serviceName: invoice
servicePort: 80" | kubectl apply -f -
7. 服务确认
我会确认能否调用服务。
$ curl -i http://localhost:8000/billing/status/200
完成之后,
Handling connection for 8000
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 0
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Kong-Upstream-Latency: 2
X-Kong-Proxy-Latency: 13
Via: kong/1.0.0
如果返回200 OK并获得响应,那么表示成功。
在此演示介绍中,我们希望进行流量监控,因此将使用循环处理来提供FakeTraffic。
由于某些计算机可能会出现高负载情况,因此可以调整sleep 0.01的值。
$ while true;
do
curl http://localhost:8000/billing/status/200
curl http://localhost:8000/billing/status/501
curl http://localhost:8000/billing/status/501
curl http://localhost:8000/invoice/status/201
curl http://localhost:8000/invoice/status/404
curl http://localhost:8000/comments/status/200
sleep 0.01
done
8. 交通监控
Prometheus 是一款资源监控软件,可以可视化基础设施状态。
安装Prometheus。
$ helm install --name prometheus stable/prometheus --namespace monitoring --values https://bit.ly/2RgzDtg --version 8.4.1
我们将安装Grafana来将Prometheus获取的信息绘制成图表。
在这里,我们指定了–namespace monitoring的命名空间来部署。
$ helm install stable/grafana --name grafana --namespace monitoring --values http://bit.ly/2FuFVfV --version 1.22.1
9. 确认 Prometheus 和 Grafana 的安装情况
查看通过命名空间监视指定的pod的状态。
$ watch -n 1 kubectl get pod -n monitoring
执行结果。
Every 1.0s: kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
grafana-95898fd7-htk7n 1/1 Running 0 11m
prometheus-alertmanager-845d9678b9-7h8k7 2/2 Running 0 14m
prometheus-kube-state-metrics-857f8ffb9d-jpxdz 1/1 Running 0 14m
prometheus-node-exporter-pltc7 1/1 Running 0 14m
prometheus-pushgateway-75f7fdb48b-cth7q 1/1 Running 0 14m
prometheus-server-6d6c5d6dd8-nwj52 2/2 Running 0 14m
如果所有的状态都变为”运行”,那么安装就完成了。
10. Prometheus 与 Grafana 的暴露
让外部可以访问,进行暴露。
普罗米修斯
$ kubectl --namespace monitoring port-forward $(kubectl get pods --namespace monitoring -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}") 9090 &
Grafana 可视化面板
$ kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
Prometheus通过9000端口进行了暴露,而Grafana则通过3000端口进行了暴露。
11. 验证 Grafana
打开浏览器,访问3000端口。
// ブラウザ
127.0.0.1:3000
我认为您可以访问Grafana并确认登录界面。
我将生成一个登录密码。
12. 密码生成
生成密码。密码将在终端上显示。
$ kubectl get secret --namespace monitoring grafana -o jsonpath=“{.data.admin-password}” | base64 --decode ; echo
13. Grahaa 仪表板
使用“admin”作为用户名和生成的密码重新登录Grafana。
点击左上角的“Home”菜单,选择“Kong”。
界面将切换到显示图表的页面,但目前还未开始监测。
14. 添加Kong插件
通过添加Kong提供的插件,使Prometeus生效。
Kong提供了各种各样的插件,可以方便地进行功能扩展。
$ echo "apiVersion: configuration.konghq.com/v1
kind: KongPlugin
metadata:
labels:
global: \"true\"
name: prometheus
plugin: prometheus
" | kubectl apply -f -
15. 监控确认
我会再次回到浏览器,检查Grahaa界面。
通过添加Kong插件,Prometheus可用于监控并开始监控。
监控(图表)将需要一些时间才能开始。
监控内容
另外,还可以监控“错误率”。
总结
当使用「Kubernetes Ingress Controller for Kong」的时候,管理员可以在Kubernetes上进行代理设置而无需调用Kong Admin API。换句话说,可以实现Kong API服务管理和Kubernetes容器管理的整合。
本次介绍了在Kubernetes上部署Kong,添加Prometheus插件,并使用Prometheus和Grafana监控流量的演示。
虽然只介绍了一个插件,但Kong可以安装在各种平台上,并提供了多种插件,使功能扩展变得容易。
※ 注意:这次的设置只是为了演示用途,实际使用时需要进行考虑。