OCI 上に OKE クラスタと踏み台サーバを構築する Terraform スクリプトを作った

Oracle Cloud Infrastructure (OCI) 上に、プライベートサブネットに配置した Oracle Container Engine for Kubernetes (OKE) クラスタを作り、そこに SSH 接続するための踏み台サーバも構築する、という Terraform スクリプトを作った。

ソースコードは以下の「Terraform Private OKE Cluster With Bastion」リポジトリよりドウゾ。

Load Balancer や踏み台サーバは、インターネットからのアクセスを受け付けるため Internet Gateway を適用した。

OKE クラスタの Worker Node にはインターネットから直接侵入されたくないので、パブリック IP を持たないプライベートサブネットに作った。Worker Node やその上で動く Pod、Docker コンテナに通信が到達するには、Load Balancer か踏み台サーバからしかアクセスできない、ということだ。

プライベートサブネットからインターネットに通信したいことはあると思うので、NAT Gateway を適用することで、プライベートサブネットから外 (インターネット) に出る通信は邪魔しないようになっている。後は Object Storage とか Oracle Management Cloud の Cloud Agent とかを使っていれば、Service Gateway を組み合わせても良いかも。Service Gateway については今回適用していない。

ソースコードの一部を修正すれば、OCI Resource Manager でも実行できるようにしてある。OCI Resource Manager で Terraform スクリプトを実行する際、provider "oci" ブロックでユーザ情報を指定していると、

provider.oci: user credentials user_ocid, fingerprint, private_key_path should be removed from the configuration

というエラーが発生してしまうので、OCI Provider に対するユーザ情報の設定を削ることになる。

それに付随して、KubeConfig を取得する DataSource も実行できなくなることに注意。oci_containerengine_cluster_kube_config データソースは、OCI Provider に設定したユーザ情報を利用して KubeConfig ファイルを生成しているためだ。当然、Resource Manager で実行した場合は local_file の出力場所もないので、OCI Resource Manager 利用時は KubeConfig の出力は諦めよう。

OKE クラスタを3つの AD に分散させる前提で実装しているので、本稿執筆時点で1つの Availability Domain しかない東京リージョンに対してはこのソースコードは使えないので注意。あくまで「よくある OKE クラスタのインフラ構成」を Terraform で実装する際の参考程度に留めていただければ。

何か不具合、改善要望などあれば GitHub Issues にてドウゾ。