(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【IBMCloud/IKS】Private側からのapi-serverに接続する流れ

スポンサーリンク

はじめに

IBM Cloud Kubernetes Serviceではパブリック・サービス・エンドポイントとプライベート・サービス・エンドポイントがありますが、後者は特定ユーザー専用のプライベートVLAN経由でアクセスするためセキュリティを考慮した環境にて利用されます。が、このプライベート側のIPにVPNで繋ぎに行く場合、名前解決を手動で行う必要があるのでその流れを記載しました。

環境情報
$ ibmcloud --version
... version 0.22.0...
$ bash --version
GNU bash, バージョン 4.4.12(3)-release (x86_64-unknown-cygwin)

事前準備

ibmcloud ksを利用するために以下で必要なモジュールをインストールします。

$ ibmcloud plugin install kubernetes-service
リポジトリー 'IBM Cloud' から 'kubernetes-service' を検索しています...
プラグイン 'container-service/kubernetes-service 1.0.171' がリポジトリー 'IBM Cloud' 内で見つかりました
...
C:\Program Files\IBM\Cloud\bin\ibmcloud.exe plugin show container-service' を使用して詳細を表示してください。

また、該当のapi-serverにアクセスを行うために認証が期限切れとなっている場合は認証情報を取りに行きます。

$ ibmcloud login --sso
...
One Time Code >
認証中です...
OK

接続情報を取得する

以下構文を利用して作成済のCluster情報を取りに行きます。

ks,cs,oc cluster get
クラスターの詳細を表示します。

まずは取得できるクラスター情報を以下コマンドで確認し、クラスターの名前を控えたら

$ ibmcloud ks clusters
...
名前 ID 状態 作成 ワーカー ロケーション バージョン リソース グループ名 プロバイダー
hoge-cluster ...

同クラスター名を引数に以下のようにクラスターの詳細情報が取得可能です。

$ ibmcloud ks cluster get --cluster hoge-cluster
...
クラスター hoge-cluster を取得中...
OK
...
名前:                                         hoge-cluster
ID:                                           xxxxxxxxxx
...
パブリック・サービス・エンドポイント URL:     -
プライベート・サービス・エンドポイント URL:   <HOSTNAME:PORT>
...

引数にIDを入力して接続に必要な情報をconfigに追記します。

$ ibmcloud ks cluster config --cluster xxxxxxxxxx
OK
xxxxxxxxxx の構成は正常にダウンロードされました。
xxxxxxxxxx のコンテキストを現在の kubeconfig ファイルに追加しました。

自動的にコンテキストが切り替わります。

$ kubectl config get-contexts
CURRENT   NAME                                CLUSTER                             AUTHINFO
               NAMESPACE
*         hoge-cluster/xxxxxxxxxxxxx   ...   default
          docker-desktop                      docker-desktop                      docker-desktop

ただし、冒頭で述べたようにこの状態では以下のようなエラーとなります。

$ kubectl cluster-info
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Unable to connect to the server: dial tcp <IP>: i/o timeout

というのも.kube/configの実体を見るとサーバの宛先にドメインが格納されているも

apiVersion: v1
clusters:
- cluster:
    certificate-authority: C:\Users\xx\.bluemix\plugins\container-service\clusters\..xx.pem
    server: <HOSTNAME:PORT>
  name: xx
...

同ドメインはパブリック側の宛先となっているからです。

$ nslookup <HOSTNAME>
...
名前:    <HOSTNAME>
Addresses:  PUBLIC_IP

プライベートサービスエンドポイントの実IPを確認する

同クラスターに展開されている”kube-api-via-nlb”というロードバランサのIPを確認します。

default                     kube-api-via-nlb                      LoadBalancer   xx     xx   ..:../TCP   

ちなみにこのIPはWoerkerNodeが属するVLANのPortableIPから割り当てられます

後は同IPとホスト名を紐付けるようにhostsに登録すれば、指定したExternal EndpointsのIPアドレス向けにpingが飛ぶようになり

$ ping  <HOSTNAME>
<HOSTNAME> [PRIVATE_IP]に ping を送信しています

ここまでくれば該当のクラスターに正常に接続ができています。

$ kubectl cluster-info
Kubernetes master is running at xxxxxx
CoreDNS is running at ...
kubernetes-dashboard is running at ...
Metrics-server is running at ...
NodeLocalDNS is running at ...
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

終わりに

巷のサイトでは以下のステップで接続できるように書かれていますが、プライベートIPに向けて接続する場合はhostsに追記が必要です。

ibmcloud login -a cloud.ibm.com -r jp-tok -g xxx
ibmcloud ks cluster config --cluster xxxxxxxx

以上、ご参考になれば幸いです。