サービス認証情報をクラスタにバインドする
IBM Cloud サービスを追加して、Watson AI、データ、セキュリティー、モノのインターネット (IoT) などの領域の追加機能によって Kubernetes クラスターを拡張します。
2025年8月4日より、 IBM Cloud、新しいサービスインスタンスにおけるすべてのリソース認証情報のデフォルト動作をワンタイムビューにします。 service bind CLIを使用してクラスタにサービス資格情報を追加する代わりに、手順に従って クラスタにサービス資格情報を手動で追加して ください。 詳細については、 ワンタイム・クレデンシャルを 参照のこと。
- IBM Cloud サービス・バインディングとは何ですか?
- サービス・バインディングは、IBM Cloud サービスのサービス資格情報を迅速に作成できる方法です。そのパブリック・クラウド・サービス・エンドポイントを使用して、クラスターの Kubernetes シークレット内にこれらの資格情報を保管することにより作成します。 クラスターにサービスをバインドするには、まずそのサービスのインスタンスをプロビジョンする必要があります。 次に、サービスを 手動でクラスタに バインドするか、
service bindサービス資格情報と Kubernetes シークレットを作成するための CLI コマンド。 - どのようなタイプのサービスをクラスターにバインドできますか?
- IBM Cloud Identity and Access Management (IAM) が有効になっているサービスをバインドできます。 IAM 対応サービスは、より細かいアクセス制御を可能にし、IBM Cloud リソース・グループ内で管理できます。 詳しくは、リソースに対するアクセス権限の管理を参照してください。 サポートされている IBM Cloud サービスのリストについては、 IBM Cloud のカタログを参照してください。
- クラスタの秘密をさらに安全にするには?
- クラスター管理者に連絡してクラスター内の 鍵管理サービス・プロバイダーを有効にしてもらい、IBM Cloud サービス・インスタンスの資格情報を保管するシークレットなどの、新しいシークレットと既存のシークレットを暗号化します。
- すべての IBM Cloud サービスをクラスター内で使用できますか?
- サービス・バインディングを使用できるのは、サービス・キーをサポートしているサービスのみに対してです。サービス・キーがサポートされている場合は、そのサービスの資格情報を自動的に作成して Kubernetes シークレットに保管できます。 サービスをアプリに接続する方法については、 「サービスをアプリに接続する」 を参照してください。
- サービス・キーをサポートしないサービスは通常、アプリで使用できる API を提供します。 サービス・バインディング方式では、アプリに対する API アクセスは自動的にセットアップされません。 必ず、ご使用のサービスの API 資料を参照して、アプリに API インターフェースを実装してください。
- 既存の IBM Cloud サービスインスタンスをクラスタにバインドできますか?
- はい、命名要件を満たすサービスを使用し、それらをクラスタにバインドするときにサービスの資格情報を再利用できます。 サービス名が以下の正規表現形式であることを確認してください。
[a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?). 許可される名前の例として、myserviceやexample.comなどがあります。 使用できない文字には、スペースと下線が含まれます。 - 複数の IBM Cloud サービスを一度に複数のクラスターにバインドできますか?
- IBM Cloud のサービス・バインディングは、クラスターごと、サービスごとに行い、ポッドがマウントできる Kubernetesシークレットを作成することで機能します。
- 複数のクラスターおよびサービスの場合は、代わりに IAM トラステッド・プロファイルを使用できます。 IAM で、必要な IBM Cloud サービスに対するアクセス・ポリシーを指定してトラステッド・プロファイルを作成します。 次に、そのトラステッド・プロファイルを条件 (特定のリソース・グループのクラスター内のすべての
prodKubernetes 名前空間など) に基づいて任意の数のクラスターにリンクします。 最後に、Kubernetes サービス・アカウントでプロジェクションされたボリュームをポッドがマウントすると、IAM トークンと交換できるトークンを取得できます。アプリでは、交換された IAM トークンを使用して IBM Cloud サービスで認証を受けることができます。
手動でサービス認証情報をクラスタにバインドする
始める前に
- 以下の役割があることを確認してください。
- エディター または 管理者 IBM Cloud IAMプラットフォームアクセスロール サービスをバインドしたいクラスタの
- ライター または マネージャー IBM Cloud IAM サービスアクセスロール サービスをバインドしたい Kubernetes ネームスペースのためのものです。
- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
以下の手順を実行することで、クラスタにサービス資格情報を手動で追加できます。
-
クラスタに追加したいサービスのインスタンス名を取得します。
ibmcloud resource service-instances -
サービス・キーを作成します。 詳しくは コマンド・リファレンスを 参照のこと。
ibmcloud resource service-key-create NAME [ROLE] --instance-name SERVICE_INSTANCE -
Credentialsの部分をコピーして、credsという拡張子のないファイルに保存します。 -
作成した認証情報ファイルを使用して、 Kubernetes の秘密鍵を作成します。
kubectl create secret generic my-secret --from-file=path/to/creds
service bind CLIを使用したクラスタへのサービスの追加
- バインディング時に既存のサービス認証情報を使用できますか?
- オプションで、
service bindコマンドを実行するときに--keyパラメータを指定し、既存のサービス資格情報の名前を指定することができます。 IBM Cloud サービスバインディングは、既存のサービス資格情報を使用して Kubernetes シークレットを自動的に作成します。 - 既存のクレデンシャルがワンタイム・ビューのクレデンシャルである場合はどうなりますか?
service bindコマンドは、独自のワンタイム・ビュー認証情報の持ち込みをサポートしていない。 したがって、service bindコマンドを使用したい場合は、--keyパラメータを指定しないでください。--keyを指定せずにコマンドを実行すると、新しい認証情報のセットが作成される。- ワンタイム・ビューの認証情報を使用する場合は、サービスを クラスタに手動で バインドする必要があります。 このオプションでは、既存のワンタイムビュー認証情報を使用できます。
- プライベート・クラウド・サービス・エンドポイントを使用するサービス資格情報を使用する場合はどうすればよいですか?
- デフォルトでは、
service bindコマンドはパブリック・クラウド・サービス・エンドポイントにサービス・クレデンシャルを作成する。 プライベート・クラウド・サービス・エンドポイントを使用するには、プライベート・クラウド・サービス・エンドポイントを使用するサービスのサービス資格情報を手動で作成してから、--keyオプションを使用して既存のサービス資格情報の名前を指定する必要があります。 自分のクレデンシャルを持参する予定の場合は、既存のクレデンシャルがワンタイム・ビュー・クレデンシャルでないことを確認してください。 詳細については、 ワンタイム・クレデンシャルを 参照のこと。 - 使用しているサービスが、まだプライベート・クラウド・サービス・エンドポイントをサポートしていない可能性もあります。 プライベート専用クラスターがある場合は、プライベート・クラウド・サービス・エンドポイントを使用するサービス資格情報を使用するか、パブリック IP アドレスとポートを開いてサービスに接続する必要があります。
サービス資格情報をクラスタにバインドする手順については、以下のセクションを参照してください。
IBM Cloud サービス・バインディングを使用して、ご使用の IBM Cloud サービスのサービス資格情報を自動的に作成して、これらの資格情報を Kubernetes シークレットに保管します。
サービスがプライベート・クラウド・サービス・エンドポイントをサポートしている場合、プライベート・クラウド・サービス・エンドポイントを使用してサービス・クレデンシャルを手動で作成し、 --key オプションを使用してクレデンシャルの名前を指定できます。
始める前に
- 以下の役割があることを確認してください。
- エディター または 管理者 IBM Cloud IAMプラットフォームアクセスロール サービスをバインドしたいクラスタの
- ライター または マネージャー IBM Cloud IAM サービスアクセスロール サービスをバインドしたい Kubernetes ネームスペースのためのものです。
- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
クラスターに IBM Cloud サービスを追加するには、以下の手順を実行します。
-
- 一部の IBM Cloud サービスは、選択されたリージョンでのみ使用可能です。 サービスがクラスターと同じリージョンで使用可能な場合にのみ、サービスをクラスターにバインドできます。 さらに、ワシントン DC ゾーンでサービス・インスタンスを作成する場合は、CLI を使用する必要があります。
- IAM 対応サービスの場合: クラスターと同じリソース・グループ内にサービス・インスタンスを作成する必要があります。 サービスは 1 つのリソース・グループ内にしか作成できず、作成後にそのリソース・グループを変更することはできません。
- サービス名の形式が
myserviceまたはexample.comであることを確認してください。 スペースとアンダースコアは使用できません。
-
作成したサービスのタイプを確認し、サービス・インスタンスの名前をメモします。
ibmcloud resource service-instances出力例
NAME Location State Type Tags <iam_service_instance_name> <region> active service_instance -
サービスを追加するために使用するクラスターの名前空間を識別します。
kubectl get namespaces -
サービスをクラスターにバインドして、パブリック・クラウド・サービス・エンドポイントを使用するサービスのサービス資格情報を作成して、それらの資格情報を Kubernetes シークレットに保管します。 既存のサービス・クレデンシャルがある場合は、
--keyオプションを使用してクレデンシャルの名前を指定します。 IAM 対応サービスの場合、資格情報は Writer サービス・アクセス・ロールで自動的に作成されますが、--roleオプションを使用して別のサービス・アクセス・ロールを指定できます。--keyオプションを使用する場合は、--roleオプションを含めないでください。独自のクレデンシャルを持参する予定の場合は、既存のクレデンシャルがワンタイム・ビュー・クレデンシャルでないことを確認するか、クラスタにサービス・クレデンシャルを手動で保存する推奨方法を使用してください。 詳細については、 ワンタイム・クレデンシャルを 参照のこと。
ibmcloud ks cluster service bind --cluster <cluster_name_or_ID> --namespace <namespace> --service <service_instance_name> [--key <service_instance_key>] [--role <IAM_service_role>]サービス資格情報が正常に作成されると、
binding-<service_instance_name>という名前の Kubernetes シークレットが作成されます。出力例
ibmcloud ks cluster service bind --cluster mycluster --namespace mynamespace --service cleardb Binding service instance to namespace... OK Namespace: mynamespace Secret name: binding-<service_instance_name> -
Kubernetes シークレットでサービス資格情報を確認します。
- シークレットの詳細を取得し、binding 値をメモします。 binding 値は base64 エンコードであり、サービス・インスタンスの資格情報を JSON 形式で保持します。
出力例kubectl get secrets binding-<service_instance_name> --namespace=<namespace> -o yamlapiVersion: v1 data: binding: <binding> kind: Secret metadata: annotations: service-instance-id: 1111aaaa-a1aa-1aa1-1a11-111aa111aa11 service-key-id: 2b22bb2b-222b-2bb2-2b22-b22222bb2222 creationTimestamp: 2018-08-07T20:47:14Z name: binding-<service_instance_name> namespace: <namespace> resourceVersion: "6145900" selfLink: /api/v1/namespaces/default/secrets/binding-mycloudant uid: 33333c33-3c33-33c3-cc33-cc33333333c type: Opaque - バインディング値をデコードします。
出力例echo "<binding>" | base64 -D{"apikey":"<API_key>","host":"<ID_string>-bluemix.cloudant.com","iam_apikey_description":"Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloudantnosqldb:us-south:a/<ID_string>::","iam_apikey_name":"auto-generated-apikey-<ID_string>","iam_role_crn":"crn:v1:bluemix:public:iam::::serviceRole:Writer","iam_serviceid_crn":"crn:v1:bluemix:public:iam-identity::a/1234567890brasge5htn2ec098::serviceid:ServiceId-<ID_string>","password":"<ID_string>","port":443,"url":"https://<ID_string>-bluemix.cloudant.com","username":"123b45da-9ce1-4c24-ab12-rinwnwub1294-bluemix"} - オプション: 前のステップでデコードしたサービス資格情報を、IBM Cloud ダッシュボードのサービス・インスタンスで検索したサービス資格情報と比較します。
- シークレットの詳細を取得し、binding 値をメモします。 binding 値は base64 エンコードであり、サービス・インスタンスの資格情報を JSON 形式で保持します。
-
これでサービスがクラスターにバインドされたため、Kubernetes シークレットのサービス資格情報にアクセスするために、アプリを構成する必要があります。
アプリからのサービス資格情報へのアクセス
アプリから IBM Cloud サービス・インスタンスにアクセスするには、Kubernetes シークレットに保管されているサービス資格情報をアプリで使用可能にする必要があります。
サービス・インスタンスの資格情報は base64 エンコードであり、JSON 形式でシークレットの内部に保管されます。 シークレットにあるデータにアクセスするには、次のオプションの中から選択します。
始める前に
kube-systemネームスペースの Writer または Manager IBM Cloud IAM サービス・アクセス・ロールが あることを確認します。- アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。
- IBM Cloud サービスをクラスターに追加します。
シークレットをボリュームとしてポッドにマウントする
シークレットをボリュームとしてポッドにマウントすると、binding という名前のファイルがボリューム・マウント・ディレクトリーに保管されます。 JSON 形式の binding ファイルには、IBM Cloud サービスにアクセスするために必要なすべての情報と資格情報が格納されます。
-
クラスター内の使用可能なシークレットをリストし、シークレットの name をメモします。 Opaque タイプのシークレットを探します。 複数のシークレットが存在する場合は、クラスター管理者に連絡して、サービスに対応する正しいシークレットを確認してください。
kubectl get secrets出力例
NAME TYPE DATA AGE binding-<service_instance_name> Opaque 1 3m -
Kubernetes デプロイメントの YAML ファイルを作成し、シークレットをボリュームとしてポッドにマウントします。
apiVersion: apps/v1 kind: Deployment metadata: labels: app: secret-test name: secret-test namespace: <my_namespace> spec: selector: matchLabels: app: secret-test replicas: 1 template: metadata: labels: app: secret-test spec: containers: - image: icr.io/ibm/liberty:latest name: secret-test volumeMounts: - mountPath: <mount_path> name: <volume_name> volumes: - name: <volume_name> secret: defaultMode: 420 secretName: binding-<service_instance_name>volumeMounts.mountPath- コンテナー内でボリュームがマウントされるディレクトリーの絶対パス。
volumeMounts.nameおよびvolumes.name- ポッドにマウントするボリュームの名前。
secret.defaultMode- シークレットに対する読み取りおよび書き込みアクセス権。 読み取り専用アクセス権を設定するには、
420を使用します。 secret.secretName- 前のステップでメモしたシークレットの名前。
-
ポッドを作成して、シークレットをボリュームとしてマウントします。
kubectl apply -f secret-test.yaml -
ポッドが作成されたことを確認します。
kubectl get podsCLI 出力例:
NAME READY STATUS RESTARTS AGE secret-test-1111454598-gfx32 1/1 Running 0 1m -
サービス資格情報にアクセスします。
-
ポッドにログインします。
kubectl exec <pod_name> -it bash -
先ほど定義したボリューム・マウント・パスにナビゲートし、ボリューム・マウント・パスのファイルをリストします。
cd <volume_mountpath> && ls出力例
bindingbindingファイルには、Kubernetes シークレットに保管したサービス資格情報が含まれています。 -
サービス資格情報を表示します。 資格情報は、JSON 形式でキー値ペアとして保管されています。
cat binding出力例
{"apikey":"<API_key>","host":"<ID_string>-bluemix.cloudant.com","iam_apikey_description":"Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloudantnosqldb:us-south:a/<ID_string>:<ID_string>::","iam_apikey_name":"auto-generated-apikey-<ID_string>","iam_role_crn":"crn:v1:bluemix:public:iam::::serviceRole:Writer","iam_serviceid_crn":"crn:v1:bluemix:public:iam-identity::a/<ID_string>::serviceid:ServiceId-<ID_string>","password":"<ID_string>","port":443,"url":"https://<ID_string>-bluemix.cloudant.com","username":"123b45da-9ce1-4c24-ab12-rinwnwub1294-bluemix"} -
JSON コンテンツを解析してサービスにアクセスするために必要な情報を取得するようにアプリを構成します。
-
環境変数でシークレットを参照する
Kubernetes シークレットのサービス資格情報およびその他のキー値ペアを、環境変数としてデプロイメントに追加できます。
-
クラスター内の使用可能なシークレットをリストし、シークレットの name をメモします。 Opaque タイプのシークレットを探します。 複数のシークレットが存在する場合は、クラスター管理者に連絡して、サービスに対応する正しいシークレットを確認してください。
kubectl get secrets出力例
NAME TYPE DATA AGE binding-<service_instance_name> Opaque 1 3m -
シークレットの詳細を入手して、ポッドで環境変数として参照できる潜在的なキー値ペアを検索します。 サービス資格情報は、シークレットの
bindingキーに保管されています。kubectl get secrets binding-<service_instance_name> --namespace=<namespace> -o yaml出力例
apiVersion: v1 data: binding: <binding> kind: Secret metadata: annotations: service-instance-id: 7123acde-c3ef-4ba2-8c52-439ac007fa70 service-key-id: 9h30dh8a-023f-4cf4-9d96-d12345ec7890 creationTimestamp: 2018-08-07T20:47:14Z name: binding-<service_instance_name> namespace: <namespace> resourceVersion: "6145900" selfLink: /api/v1/namespaces/default/secrets/binding-mycloudant uid: 12345a31-9a83-11e8-ba83-cd49014748f type: Opaque -
Kubernetes デプロイメントの YAML ファイルを作成し、
bindingキーを参照する環境変数を指定します。apiVersion: apps/v1 kind: Deployment metadata: labels: app: secret-test name: secret-test namespace: <my_namespace> spec: selector: matchLabels: app: secret-test template: metadata: labels: app: secret-test spec: containers: - image: icr.io/ibm/liberty:latest name: secret-test env: - name: BINDING valueFrom: secretKeyRef: name: binding-<service_instance_name> key: bindingcontainers.env.name- 環境変数の名前。
env.valueFrom.secretKeyRef.name- 前のステップでメモしたシークレットの名前。
env.valueFrom.secretKeyRef.key- シークレットの一部であり、環境変数で参照するキー。 サービス資格情報を参照するには、バインディングキーを使用する必要があります。
-
シークレットの
bindingキーを環境変数として参照するポッドを作成します。kubectl apply -f secret-test.yaml -
ポッドが作成されたことを確認します。
kubectl get podsCLI 出力例:
NAME READY STATUS RESTARTS AGE secret-test-1111454598-gfx32 1/1 Running 0 1m -
環境変数が正しく設定されていることを確認します。
- ポッドにログインします。
kubectl exec <pod_name> -it bash - すべての環境変数をポッド内にリストします。
出力例envBINDING={"apikey":"<API_key>","host":"<ID_string>-bluemix.cloudant.com","iam_apikey_description":"Auto generated apikey during resource-key operation for Instance - crn:v1:bluemix:public:cloudantnosqldb:us-south:a/<ID_string>::","iam_apikey_name":"auto-generated-apikey-<ID_string>","iam_role_crn":"crn:v1:bluemix:public:iam::::serviceRole:Writer","iam_serviceid_crn":"crn:v1:bluemix:public:iam-identity::a/1234567890brasge5htn2ec098::serviceid:ServiceId-<ID_string>","password":"<password>","port":443,"url":"https://<ID_string>-bluemix.cloudant.com","username":"<ID_string>-bluemix"}
- ポッドにログインします。
-
環境変数を読み取り、JSON コンテンツを解析してサービスにアクセスするために必要な情報を取得するようにアプリを構成します。
Python のコード例:
if os.environ.get('BINDING'): credentials = json.loads(os.environ.get('BINDING')) -
オプション: 予防措置として、
BINDING環境変数が適切に設定されていない場合のエラー処理をアプリに追加します。Java のコード例:
if (System.getenv("BINDING") == null) { throw new RuntimeException("Environment variable 'SECRET' is not set!"); }Node.js のコード例:
if (!process.env.BINDING) { console.error('ENVIRONMENT variable "BINDING" is not set!'); process.exit(1); }
クラスターからのサービスの削除
クラスターにバインドした IBM Cloud サービスを使用しない場合は、クラスターから Kubernetes シークレットと、シークレットにアクセスするポッドを手動で削除できます。
-
クラスターにバインドされているサービスをリストし、サービスの名前と、サービスがバインドされている名前空間をメモします。
ibmcloud ks cluster service ls --cluster出力例
OK Service Instance GUID Key Namespace myservice 12345ab1-1234-1abc-a12b-12abc12a12ab kube-a1a12abcd12a123abc1a12ab1a1234ab7.abcdefg0p1abcd123lgg.default default -
サービスがバインドされている名前空間内の Kubernetes シークレットをリストし、形式
binding-<service_name>に従う名前のシークレットを探します。kubectl get secrets -n <namespace> | grep Opaque出力例
binding-myservice Opaque 1 3d23h -
シークレットにアクセスするすべてのポッドを取得します。
kubectl get pods --all-namespaces -o=jsonpath='{range .items[*]}{"\n"}{.metadata.name}{":\t"}{range .spec.volumes[*]}{.secret.secretName}{" "}{end}{end}' | grep "<secret_name>"CLI 出力が空の場合は、このシークレットをマウントしたポッドがクラスターに存在しません。
-
シークレットをマウントしたポッドがある場合は、ポッドまたはポッドを管理するデプロイメントを削除するか、代わりに別のシークレットを使用するようにポッド YAML およびデプロイメント YAML を更新します。
- ポッドまたはデプロイメントを削除するには、以下のようにします。
kubectl delete pod <pod_name> -n <namespace>kubectl delete deployment <deployment_name> -n <namespace> - 既存のポッドまたはデプロイメントを更新するには、以下のようにします。
- ポッド YAML ファイルまたはデプロイメント YAML ファイルを取得します。
kubectl get pod <pod_name> -o yamlkubectl get deployment <deployment_name> -o yaml - YAML ファイルをコピーし、
spec.volumesセクションで、使用するシークレットの名前を変更します。 - 変更をクラスターに適用します。
kubectl apply -f pod.yamlkubectl apply -f deployment.yaml - 更新したボリューム仕様の新しいポッドが作成されていることを確認します。
kubectl get podskubectl describe pod <pod_name>
- ポッド YAML ファイルまたはデプロイメント YAML ファイルを取得します。
- ポッドまたはデプロイメントを削除するには、以下のようにします。
-
そのシークレットを削除します。
kubectl delete secret <secret_name> -n <namespace> -
シークレットが削除されたことを確認します。
kubectl get secrets -n <namespace> -
オプション。 IBM Cloud サービス・インスタンスを削除します。
ibmcloud resource service-instance-delete <service_name>