0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Konnectに繋ぐData PlaneをCLIのみで起動する

Posted at

Konnect環境を用意する際に自動化する上で大きな障壁となるのはData Planeの構築だったりする。
Conrol Planeの用意やKonnect内の設定はKonnectへのAPIでどうにでもなり、TerraformのProviderも提供されていたりするが、Data PlaneはCloud Gatewayを使わない限りはユーザー側が用意した基盤に導入する必要があり、この基盤へのData PlaneへのイントールはKonnectのAPIでは行う事が出来ない。

ここでは自動化の足がかりとして、このData Planeの導入をKonnectのUIを使わずCLIで実施する方法を検証する。

Data Planeの導入手順確認

自動化するにあたり、そもそものData Planeの導入手順を確認する。
導入方法によって手順は異なるが、ここでは汎用性の高いDockerでの導入手順を確認する。
KonnectのUIでの導入手順を細分化すると以下となる。

  1. 証明書の作成
  2. 証明書のKonnectへの登録
  3. 以下の環境固有情報をコンテナの環境変数にセットしてData Planeコンテナを起動
    • Control Planeのエンドポイン
    • Control Planeのテレメトリのエンドポイント
    • 作成した証明書の内容

2についてはUIで操作していると意識しないが、Generate certificateをクリックするとそのタイミングで自動的に登録されている。
(余談だが、これはその後のData Planeのインストール手順をキャンセルしても残るため、キャンセルした場合はその後手動で削除した方がいい)
3のControl Planeの各エンドポイントはUIで操作した場合はインストールコマンド内に自動で反映されているが、このURLを知る手段はUI上では提供されておらず、APIで取得する必要がある。
実際のコンテナ起動コマンドは以下のような感じになるが、エンドポイントのURLはa123cc23ad.us.{cp0|tp0}.konghq.comの部分であり、これをコンテナ起動前にどうにかして知る必要がある。

docker run -d \
-e "KONG_ROLE=data_plane" \
-e "KONG_DATABASE=off" \
-e "KONG_VITALS=off" \
-e "KONG_CLUSTER_MTLS=pki" \
-e "KONG_CLUSTER_CONTROL_PLANE=a123cc23ad.us.cp0.konghq.com:443" \
-e "KONG_CLUSTER_SERVER_NAME=a123cc23ad.us.cp0.konghq.com" \
-e "KONG_CLUSTER_TELEMETRY_ENDPOINT=a123cc23ad.us.tp0.konghq.com:443" \
-e "KONG_CLUSTER_TELEMETRY_SERVER_NAME=a123cc23ad.us.tp0.konghq.com" \
-e "KONG_CLUSTER_CERT=-----BEGIN CERTIFICATE-----
MIICBjCCAaygAwIBAgIBATAKBggqhkjOPQQDBDA0MTIwCQYDVQQGEwJVUzAlBgNV
:(省略)
yBWFKRSDwwIhAOZq+56ybcj2bDfKO+52slecKRhPeEHMcf76A0FYQuQB
-----END CERTIFICATE-----" \
-e "KONG_CLUSTER_CERT_KEY=-----BEGIN PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgCkjOZDXO2vt4CGf/
:(省略)
Ei6vSHun
-----END PRIVATE KEY-----" \
-e "KONG_LUA_SSL_TRUSTED_CERTIFICATE=system" \
-e "KONG_KONNECT_MODE=on" \
-e "KONG_CLUSTER_DP_LABELS=created-by:quickstart,type:docker-macOsArmOS" \
-p 8000:8000 \
-p 8443:8443 \
kong/kong-gateway:3.9

検証

ここでは以下の手順で検証する。

  1. 証明書の作成
  2. 証明書のKonnectへの登録
  3. Control Planeのエンドポイントの取得
  4. Data Planeコンテナの起動

証明書の作成

証明書の更新に関する公式ドキュメントにCLIでの証明書の発行方法が記載されているので、こちらに従って作成する。

mkdir certs
openssl req -new -x509 -nodes -newkey rsa:2048 -subj "/CN=kongdp/C=US" -keyout ./certs/tls.key -out ./certs/tls.crt -days 3650

作成した証明書はUIで作った時と同じく10年の有効期限とした。

$ cat ./certs/tls.crt | openssl x509 -noout -dates
notBefore=Jan 31 01:18:45 2025 GMT
notAfter=Jan 29 01:18:45 2035 GMT

証明書のKonnectへの登録

作成した証明書をKonnectのControl Planeに紐づける。
紐づけるためのControl PlaneのIDを最初に取得する。
Konnectに接続するためにまず環境変数にトークンを設定する。

KONNECT_TOKEN=kpat_ER1WQ0rnLX82VJghexxx

トークンはKonnect上で右上の自分のアカウントをクリックし、Personal Access Tokens->Generate Tokenから取得できる。
(システムトークンを使った方が良いが、今回は割愛)

KonnectのAPIのエンドポイントを環境変数に設定する。

KONNECT_API=https://us.api.konghq.com/v2

Control Planeの一覧は/control-planesから取得できるので、ここからIDを以下のようにして引っ張ってくる。

CP_NAME="default" #Control Planeの名前
CP_ID=$(curl -s -X GET \
  -H "Authorization: Bearer $KONNECT_TOKEN" \
  "${KONNECT_API}/control-planes" \
  | jq -r --arg name "$CP_NAME" '.data[] | select(.name==$name) | .id')

Control PlaneのIDが分かったら証明書を登録する。
先に証明書の内容を環境変数に設定する。

export CERT=$(awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' ./certs/tls.crt)

証明書の登録は/control-planes/${CP_ID}/dp-client-certificatesにPOSTすることで登録できるので、以下手順で登録する。

curl -sX POST \
  -H "Authorization: Bearer $KONNECT_TOKEN" \
  ${KONNECT_API}/control-planes/${CP_ID}/dp-client-certificates \
  --json '{"cert":"'"$CERT"'"}'

Control Planeの各エンドポイントの取得

Control Planeの各エンドポイントは先程Control PlaneのIDを取得したときと同じエンドポイントを叩いても取得できるが、せっかくControl PlaneのIDを取得したので個別のControl Planeの情報を取得するエンドポイント/control-planes/${CP_ID}から取得してみる。

CP_ENDPOINT=$(curl -s -X GET \
  -H "Authorization: Bearer $KONNECT_TOKEN" \
  "${KONNECT_API}/control-planes/${CP_ID}" \
  | jq -r '.config.control_plane_endpoint')
TP_ENDPOINT=$(curl -s -X GET \
  -H "Authorization: Bearer $KONNECT_TOKEN" \
  "${KONNECT_API}/control-planes/${CP_ID}" \
  | jq -r '.config.telemetry_endpoint')

取得した値は頭にhttps://がつくが、これは不要なので取っ払う。

CP_ENDPOINT=$(sed "s@https://@@" <<< $CP_ENDPOINT)
TP_ENDPOINT=$(sed "s@https://@@" <<< $TP_ENDPOINT)

Data Planeコンテナの起動

Data Planeコンテナを起動する。
起動前に証明書の内容を環境変数に読ませておく。

CERT=$(cat ./certs/tls.crt)
CERT_KEY=$(cat ./certs/tls.key)

コンテナを起動する。

docker run -d \
--name konnect-dp-manual \
-e "KONG_ROLE=data_plane" \
-e "KONG_DATABASE=off" \
-e "KONG_VITALS=off" \
-e "KONG_CLUSTER_MTLS=pki" \
-e "KONG_CLUSTER_CONTROL_PLANE=${CP_ENDPOINT}:443" \
-e "KONG_CLUSTER_SERVER_NAME=${CP_ENDPOINT}" \
-e "KONG_CLUSTER_TELEMETRY_ENDPOINT=${TP_ENDPOINT}:443" \
-e "KONG_CLUSTER_TELEMETRY_SERVER_NAME=${TP_ENDPOINT}" \
-e "KONG_CLUSTER_CERT=${CERT}" \
-e "KONG_CLUSTER_CERT_KEY=${CERT_KEY}" \
-e "KONG_LUA_SSL_TRUSTED_CERTIFICATE=system" \
-e "KONG_KONNECT_MODE=on" \
-e "KONG_CLUSTER_DP_LABELS=created-by:manual,type:docker-macOsArmOS" \
-p 8000:8000 \
-p 8443:8443 \
kong/kong-gateway:3.9

問題なければ以下のような感じでKonnectにData Planeが認識される。
20250131115409.png

ここで実施した手順をパイプライン化すれば、Data Planeのデプロイについても自動化できるはずだ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?