🦍

Helmを使ってKongのStandalone構成を試す

2022/07/31に公開

はじめに

Helmを使ったKongのインストールを確認していきます。

Kongとはハイブリッドおよびマルチクラウドで構築され、マイクロサービスや分散アーキテクチャ向けに最適化されたAPIゲートウェイです。モジュールやプラグインを介して拡張することもできます。
https://docs.konghq.com/gateway/latest/?_ga=2.268970545.1126820989.1653317581-188110107.1653317581

環境情報

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リクエストとレスポンスを返してくれるサービスです。
https://httpbin.org/

$ 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