IDCF テックブログ

IDCF テックブログ

クラウド・データセンターを提供するIDCフロンティアの公式テックブログ

IDCFクラウドコンテナサービスのAPIを使ってみた。

はじめまして、オペレーション本部サービス運用部の荒木です。 普段はIDCFクラウド上で提供している各種プロダクトの監視・運用設計・運用改善をメインに行っております。

今回は、昨年5月にリリースしたIDCFクラウド コンテナの監視設計や実装を行ってきた中でRancherAPIを利用する機会がありましたので、そこからいくつか紹介したいと思います。

IDCFクラウドコンテナAPI = RancherAPI

IDCFクラウドコンテナサービスはサービス提供基盤に独SUSEのSUSE Rancherを採用しており、Rancherが提供しているAPIを基本そのまま利用することが可能です。
また、API以外にもRancher提供のCLIツール Rancher CLIを利用することも可能となっています。

なお、API・CLIともにIDCFでは正式なサポートは行っておらず*1、ベストエフォートサポートでの対応となります。 利用時は予めご留意ください。m(_ _)m

作業環境

  • CentOS 7
    • bash
    • jq

事前準備(トークンの取得)

  1. コンテナコンソールのアカウントメニューからAPI & キーをクリック。

  2. キーを追加をクリック。

  3. 詳細情報・失効日・スコープを任意で設定し、作成をクリック。

  4. 発行されたBearerトークンを控えておく。

クラスターを作成する

クラスターを追加する

トークンが取得できたので、さっそくクラスターを作成していきます。利用するAPI Resourcesは/v3/clusterです。

クラスター構成情報
 - クラスター名:sample-cluster
 - クラスタータイプ:IDCFクラウド
 - ゾーン:ampere
 - VMタイプ:HighCPU.M4
 - ノード構成:
  - MasterNode (etcd, controlPlane)× 3
  - WorkerNode (worker) × 3

今回は、コンテナコンソールからクラスターを作成する際のデフォルト設定と同じ設定でリクエストボディを準備しました。
clusterTemplateRevisionId": "cattle-global-data:ctr-dtg7xは2022/4時点の最新リビジョン情報となり、今後バージョンアップ等で変更となる可能性があります。

{
    "answers":{
        "values": {
            "rancherKubernetesEngineConfig.ingress.provider": "none",
            "rancherKubernetesEngineConfig.kubernetesVersion": "v1.19.15-rancher1-1",
            "rancherKubernetesEngineConfig.monitoring.provider": "metrics-server",
            "rancherKubernetesEngineConfig.services.etcd.backupConfig.intervalHours": 12,
            "rancherKubernetesEngineConfig.services.etcd.backupConfig.retention": 6,
            "rancherKubernetesEngineConfig.services.kubeApi.secretsEncryptionConfig.enabled": "false",
            "rancherKubernetesEngineConfig.services.kubeApi.serviceNodePortRange": "32000-32767",
            "rancherKubernetesEngineConfig.upgradeStrategy.drain": "false",
            "rancherKubernetesEngineConfig.upgradeStrategy.nodeDrainInput.deleteLocalData": "false",
            "rancherKubernetesEngineConfig.upgradeStrategy.nodeDrainInput.force": "false"
            }
        },
    "clusterTemplateId": "cattle-global-data:ct-djcqr",
    "clusterTemplateRevisionId": "cattle-global-data:ctr-dtg7x",
    "name": "sample-cluster"
   }

これをcurlで投げれるよう、スクリプト(add_cluster.sh)にして、
api_tokenには、先に控えておいたBearerトークンを入力してください。

#!/bin/bash
api_url='https://container.idcfcloud.com'
api_token='token-wxxt:nf4jzxxxxxxxxxxxxxxxxxxxxxxxxxxxxwcnk27'

create_cluster_data()
{
  cat <<EOF
{
    "answers":{
        "values": {
            "rancherKubernetesEngineConfig.kubernetesVersion": "v1.19.15-rancher1-1",
            "rancherKubernetesEngineConfig.services.etcd.backupConfig.intervalHours": 12,
            "rancherKubernetesEngineConfig.services.etcd.backupConfig.retention": 6,
            "rancherKubernetesEngineConfig.services.kubeApi.secretsEncryptionConfig.enabled": "false",
            "rancherKubernetesEngineConfig.services.kubeApi.serviceNodePortRange": "30000-32767",
            "rancherKubernetesEngineConfig.upgradeStrategy.drain": "false",
            "rancherKubernetesEngineConfig.upgradeStrategy.nodeDrainInput.deleteLocalData": "false",
            "rancherKubernetesEngineConfig.upgradeStrategy.nodeDrainInput.force": "false"
            }
        },
    "clusterTemplateId": "cattle-global-data:ct-djcqr",
    "clusterTemplateRevisionId": "cattle-global-data:ctr-dtg7x",
    "name": "sample-cluster"
}
EOF
}
curl -s -k -X POST \
    -H "Authorization: Bearer ${api_token}" \
    -H "Content-Type: application/json" \
    -d "$(create_cluster_data)" $api_url/v3/cluster?_replace=true

レスポンスボディにノード追加時に必要となるclusterIDが含まれるのでjqコマンドで抜き出す形で、スクリプトを実行します。

$ ./add_cluster.sh | jq .id
"c-rj62l"

コンテナコンソールを見て、ノードが0のクラスターができていればOKです。

クラスターにノードを追加する

続けてノードプール(ノード)を追加していきます。 利用するAPI Resourcesは/v3/nodepoolです。
先程同様、まずはリクエストボディを準備します。
clusterIdには先程出力されたidを入力してください。

MasterNode用

{
  "type": "nodePool",
  "clusterId": "c-rj62l",
  "hostnamePrefix": "master",
  "nodeTemplateId": "idcfcloud_jp-east-3_ampere_highcpu.M4_v1",
  "controlPlane": true,
  "etcd": true,
  "worker": false,
  "quantity": 3,
  "drainBeforeDelete": false,
  "deleteNotReadyAfterSecs": 0
}


WorkerNode用

{
  "type": "nodePool",
  "clusterId": "c-rj62l",
  "hostnamePrefix": "worker",
  "nodeTemplateId": "idcfcloud_jp-east-3_ampere_highcpu.M4_v1",
  "controlPlane": false,
  "etcd": false,
  "worker": true,
  "quantity": 3,
  "drainBeforeDelete": false,
  "deleteNotReadyAfterSecs": 0
}

同じく、curlで投げれるようにして、

MasterNode用(add_nodepool_master.sh)

#!/bin/bash
api_url='https://container.idcfcloud.com'
api_token='token-wxxt:nf4jzxxxxxxxxxxxxxxxxxxxxxxxxxxxxwcnk27'

add_node_data()
{
  cat <<EOF
{
  "type": "nodePool",
  "clusterId": "c-rj62l",
  "hostnamePrefix": "master",
  "nodeTemplateId": "idcfcloud_jp-east-3_ampere_highcpu.M4_v1",
  "controlPlane": true,
  "etcd": true,
  "worker": false,
  "quantity": 3,
  "drainBeforeDelete": false,
  "deleteNotReadyAfterSecs": 0
}
EOF
}
curl -s -k -X POST \
    -H "Authorization: Bearer ${api_token}" \
    -H "Content-Type: application/json" \
    -d "$(add_node_data)" $api_url/v3/nodepool


WorkerNode用(add_nodepool_worker.sh)

#!/bin/bash
api_url='https://container.idcfcloud.com'
api_token='token-wxxt:nf4jzxxxxxxxxxxxxxxxxxxxxxxxxxxxxwcnk27'

add_node_data()
{
  cat <<EOF
{
  "type": "nodePool",
  "clusterId": "c-rj62l",
  "hostnamePrefix": "worker",
  "nodeTemplateId": "idcfcloud_jp-east-3_ampere_highcpu.M4_v1",
  "controlPlane": false,
  "etcd": false,
  "worker": true,
  "quantity": 3,
  "drainBeforeDelete": false,
  "deleteNotReadyAfterSecs": 0
}
EOF
}
curl -s -k -X POST \
    -H "Authorization: Bearer ${api_token}" \
    -H "Content-Type: application/json" \
    -d "$(add_node_data)" $api_url/v3/nodepool

それぞれ実行。

$ ./add_nodepool_master.sh
$ ./add_nodepool_worker.sh

ノード数が6となりProvisioningが進み出せばOK。

クラスターを削除する

利用するAPI Resourcesは/v3/clusters です。
削除はシンプルにclusterIdを指定したcurlコマンドの実行だけでOKです。

$ curl -s -k -X DELETE \
     -H "Authorization: Bearer token-wxxt:nf4jzxxxxxxxxxxxxxxxxxxxxxxxxxxxxwcnk27" \
     -H "Content-Type: application/json" \
     https://container.idcfcloud.com/v3/clusters/c-rj62l

最後に

今回紹介した以外にも、RancherAPIには非常に多くのResourcesが用意されてますが、 反面 公式ドキュメントでの取り扱い情報が少なく、利用には若干のハードルを感じました。
IDCFとしても現状公式サポート対象外ではありますが、API活用方法などは引き続き当blogでご紹介いたしますのでご期待ください!

*1:2022年4月時点の情報です。

Copyright © IDC Frontier Inc.