Helmを使ってKongのStandalone構成を試す
はじめに
Helmを使ったKongのインストールを確認していきます。
Kongとはハイブリッドおよびマルチクラウドで構築され、マイクロサービスや分散アーキテクチャ向けに最適化されたAPIゲートウェイです。モジュールやプラグインを介して拡張することもできます。
環境情報
AKSのデプロイ方法などは省略します。
以下の環境が整っていることを前提として話を進めていきます。
ubuntu: 20.04
aks version: v1.23.5
kubectl version --client --short
Client Version: v1.24.3
helm version --short
v3.9.2+g1addefb
準備
Helmリポジトリの追加を行います。
$ helm repo add kong https://charts.konghq.com
"kong" has been added to your repositories
$ helm repo list
NAME URL
kong https://charts.konghq.com
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "kong" chart repository
Update Complete. ⎈Happy Helming!⎈
HelmでインストールするChartのバージョン確認します。
$ helm search repo kong --versions | head
NAME CHART VERSION APP VERSION DESCRIPTION
kong/kong 2.11.0 2.8 The Cloud-Native Ingress and API-management
kong/kong 2.10.2 2.8 The Cloud-Native Ingress and API-management
kong/kong 2.10.1 2.8 The Cloud-Native Ingress and API-management
kong/kong 2.10.0 2.8 The Cloud-Native Ingress and API-management
kong/kong 2.9.1 2.8 The Cloud-Native Ingress and API-management
kong/kong 2.9.0 2.8 The Cloud-Native Ingress and API-management
kong/kong 2.8.2 2.8 The Cloud-Native Ingress and API-management
kong/kong 2.8.1 2.8 The Cloud-Native Ingress and API-management
kong/kong 2.8.0 2.8 The Cloud-Native Ingress and API-management
今回使用するChart Versionの資材を取得します。
$ helm pull kong/kong --untar --version 2.11.0
$ ls kong/
CHANGELOG.md Chart.lock Chart.yaml FAQs.md README.md UPGRADE.md charts ci crds example-values templates values.yaml
Namespaceの作成を行います。
$ kubectl create ns kong
namespace/kong created
Kongデプロイ
Standalone最小構成のサンプルYamlがあるのでそれを使ってデプロイします。
$ cat kong/example-values/minimal-kong-standalone.yaml
image:
repository: kong
tag: "2.8"
env:
prefix: /kong_prefix/
database: postgres
admin:
enabled: true
http:
enabled: true
servicePort: 8001
containerPort: 8001
postgresql:
enabled: true
auth:
username: kong
database: kong
ingressController:
enabled: false
Version2.11.0
を指定してHelmインストールを行います。
$ helm install kong kong/kong -n kong -f kong/example-values/minimal-kong-standalone.yaml --version 2.11.0
NAME: kong
LAST DEPLOYED: Sun Jul 31 10:09:40 2022
NAMESPACE: kong
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
To connect to Kong, please execute the following commands:
HOST=$(kubectl get svc --namespace kong kong-kong-proxy -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
PORT=$(kubectl get svc --namespace kong kong-kong-proxy -o jsonpath='{.spec.ports[0].port}')
export PROXY_IP=${HOST}:${PORT}
curl $PROXY_IP
Once installed, please follow along the getting started guide to start using
Kong: https://docs.konghq.com/kubernetes-ingress-controller/latest/guides/getting-started/
デプロイできたか確認します。
$ kubectl get pod -n kong
NAME READY STATUS RESTARTS AGE
kong-kong-8b8488cf9-sxknx 1/1 Running 0 50s
kong-kong-init-migrations-5r4fr 0/1 Completed 0 50s
kong-postgresql-0 1/1 Running 0 50s
ちなみにStandaloneの最小構成デプロイではIngressControllerはデプロイされません。
このままだとAdmin APIにもアクセスできないのでポート転送を行います。
kubectl -n kong port-forward deploy/kong-kong 8001:8001 &
Forwarding from 127.0.0.1:8001 -> 8001
Forwarding from [::1]:8001 -> 8001
Admin APIへのアクセス確認を行います。
$ curl -s localhost:8001/status
Handling connection for 8001
{"memory":{"workers_lua_vms":[{"pid":1109,"http_allocated_gc":"55.43 MiB"},{"pid":1110,"http_allocated_gc":"39.22 MiB"}],"lua_shared_dicts":{"prometheus_metrics":{"capacity":"5.00 MiB","allocated_slabs":"0.04 MiB"},"kong":{"capacity":"5.00 MiB","allocated_slabs":"0.04 MiB"},"kong_locks":{"capacity":"8.00 MiB","allocated_slabs":"0.06 MiB"},"kong_healthchecks":{"capacity":"5.00 MiB","allocated_slabs":"0.04 MiB"},"kong_process_events":{"capacity":"5.00 MiB","allocated_slabs":"0.04 MiB"},"kong_cluster_events":{"capacity":"5.00 MiB","allocated_slabs":"0.04 MiB"},"kong_rate_limiting_counters":{"capacity":"12.00 MiB","allocated_slabs":"0.08 MiB"},"kong_core_db_cache":{"capacity":"128.00 MiB","allocated_slabs":"0.76 MiB"},"kong_core_db_cache_miss":{"capacity":"12.00 MiB","allocated_slabs":"0.09 MiB"},"kong_db_cache":{"capacity":"128.00 MiB","allocated_slabs":"0.76 MiB"},"kong_db_cache_miss":{"capacity":"12.00 MiB","allocated_slabs":"0.08 MiB"}}},"database":{"reachable":true},"server":{"connections_reading":0,"connections_writing":2,"connections_handled":10890,"connections_waiting":12,"total_requests":997,"connections_accepted":10890,"connections_active":14}}
試しにServiceの取得をしてみます。
まだ何も登録していないので中身は空っぽですね。
$ curl -s localhost:8001/services/
Handling connection for 8001
{"data":[],"next":null}
httpbinをサービスに登録します。
httpbinはシンプルなHTTPリクエストとレスポンスを返してくれるサービスです。
$ curl -i -X POST --url http://localhost:8001/services --data 'name=httpbin' --data 'url=https://httpbin.org/'
Handling connection for 8001
HTTP/1.1 201 Created
Date: Sun, 31 Jul 2022 12:00:45 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Content-Length: 369
X-Kong-Admin-Latency: 10
Server: kong/2.8.1
{"retries":5,"enabled":true,"port":443,"client_certificate":null,"id":"1d2590eb-eb25-4860-864e-98178b1a61fd","path":"/","protocol":"https","ca_certificates":null,"connect_timeout":60000,"name":"httpbin","read_timeout":60000,"tls_verify_depth":null,"host":"httpbin.org","tls_verify":null,"created_at":1659268845,"updated_at":1659268845,"write_timeout":60000,"tags":null}
再度Serviceの取得を行います。
先ほど登録したhttpbinが登録されており、Admin APIが機能していることがわかりますね。
$ curl -s localhost:8001/services/ | jq
Handling connection for 8001
{
"data": [
{
"retries": 5,
"enabled": true,
"port": 443,
"client_certificate": null,
"id": "1d2590eb-eb25-4860-864e-98178b1a61fd",
"path": "/",
"protocol": "https",
"ca_certificates": null,
"connect_timeout": 60000,
"name": "httpbin",
"read_timeout": 60000,
"tls_verify_depth": null,
"host": "httpbin.org",
"tls_verify": null,
"created_at": 1659268845,
"updated_at": 1659268845,
"write_timeout": 60000,
"tags": null
}
],
"next": null
}
Routeも登録してKong経由でhttpbinのページにアクセスできるか確認します。
作成したhttpbinという名前のServiceオブジェクトに対して、httpbin-routeという名前でpathを /httpbinとし、routeを作成します。
$ curl -i -X POST --url http://localhost:8001/services/httpbin/routes --data 'name=httpbin-route' --data 'paths[]=/httpbin'
Handling connection for 8001
HTTP/1.1 201 Created
Date: Sun, 31 Jul 2022 12:12:30 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Access-Control-Allow-Origin: *
Content-Length: 488
X-Kong-Admin-Latency: 17
Server: kong/2.8.1
{"hosts":null,"regex_priority":0,"request_buffering":true,"id":"32f4a5c3-9eab-40b6-bcec-f25c560b56a4","snis":null,"tags":null,"preserve_host":false,"name":"httpbin-route","paths":["/httpbin"],"strip_path":true,"service":{"id":"1d2590eb-eb25-4860-864e-98178b1a61fd"},"headers":null,"protocols":["http","https"],"methods":null,"sources":null,"destinations":null,"https_redirect_status_code":426,"created_at":1659269550,"updated_at":1659269550,"response_buffering":true,"path_handling":"v0"}
Kubernetes Serviceのkong-kong-proxyのEXTERNAL-IPとポートを指定し、先ほど作成したRouteのパスを指定してリクエストを投げるとhttpbinにアクセスできることが確認できます。
$ kubectl get svc -n kong
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kong-kong-admin NodePort 10.0.25.1 <none> 8001:30848/TCP,8444:32118/TCP 116m
kong-kong-proxy LoadBalancer 10.0.145.116 20.63.135.57 80:32328/TCP,443:32111/TCP 116m
kong-postgresql ClusterIP 10.0.193.115 <none> 5432/TCP 116m
kong-postgresql-hl ClusterIP None <none> 5432/TCP 116m
さいごに
今回はHelmを使ったKongのデプロイとAdmin APIの動作確認を行いました。
Helmを使うことで簡単にKongをデプロイできますね。
細かい設定を行うには他にもパラメータを設定する必要があります。
次回はIngress Controllerを使ったKongのデプロイも試してみようと思います。
Discussion