OpenShift Data Foundation アドオンの信頼できるプロファイルのセットアップ

仮想プライベートクラウド クラシッククラスタ

ODFの信頼済みプロファイルを使用して、クラスタ内で実行中のPodがアカウントまたはクラスタ内の他のリソースにアクセスできるように制限できます。 トラステッド・プロファイルについて詳しくは、 トラステッド・プロファイルの作成 を参照してください。

OpenShift Data Foundation アドオンの有効化

  1. アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  2. クラスターでこのアドオンを有効にしてください。 「 パラメーター・リファレンス」を確認します。

    コマンド例:

    ibmcloud oc cluster addon enable openshift-data-foundation -c CLUSTER_NAME --version 4.X.X
    
  3. アドオンの状態が normal であり、状況が ready であることを確認します。

    ibmcloud oc cluster addon ls --cluster CLUSTER-ID
    
  4. メトリック・エージェント・ポッドがデプロイされ、状況が Running であることを確認します。

    kubectl get pods -n kube-system | grep ibm-storage-metrics-agent
    

    出力例:

    ibm-storage-metrics-agent-644cd95b5b-rh2gd        2/2     Running   0          7h42m
    

ODF用の信頼できるプロファイルの設定

  1. ステップに従って、 トラステッド・プロファイルを作成します。 プロファイルの 「条件」 で、必ず以下のアクセス権限を指定してください。

    • 「名前空間」kube-system の場合にアクセスを許可する
    • Satellite サービス役割- Satellite Link 管理者、リーダー
    • Kubernetes Service の役割-マネージャー、エディター
    • 請求サービス役割-リーダー、オペレーター
  2. トラステッド・プロファイルを作成した後、コンソールの 「トラステッド・プロファイル」 ページから ID をコピーします。

  3. アドオンが使用する Kubernetes シークレットで、 プロファイル ID または API キー を使用するかどうかを決定します。 トラステッド・プロファイルの ID または API キーを使用して、シークレットを作成できます。 以下のテキストを保存し、資格情報を入力します。 この手順に従ってシークレットを手動で作成することも、シェル・スクリプトを使用して クラスター内にシークレットを自動的に作成 することもできます。

    ポッド ID を使用した資格情報の例:

    IBMCLOUD_AUTHTYPE=pod-identity
    IBMCLOUD_PROFILEID=<TRUSTED-PROFILE-ID>
    

    API キーを使用した資格情報の例。

    IBMCLOUD_AUTHTYPE=iam
    IBMCLOUD_APIKEY=<API-KEY>
    
  4. 認証情報を base64 にエンコードします。

    echo -n "IBMCLOUD_AUTHTYPE=<IAM-OR-POD-IDENTITY>
    IBMCLOUD_APIKEY=<API-KEY>" | base64
    
  5. 信頼できるプロファイルの資格情報を含むシークレットをクラスター内に作成します。 以下の YAML を ibm-cloud-credentials.yaml というファイルに保存します。 ibm-credentials.env: フィールドに、 base64 でエンコードされた API キーまたはトラステッド・プロファイルの ID を入力します。

    apiVersion: v1
    data:
      ibm-credentials.env: # Trusted profile ID
    kind: Secret
    metadata:
      name: ibm-cloud-credentials
      namespace: kube-system
    type: Opaque
    
  6. アカウントにログインします。 該当する場合は、適切なリソース・グループをターゲットにします。 クラスターのコンテキストを設定します。

  7. クラスター内にシークレットを作成します。

    kubectl apply -f ibm-cloud-credentials.yaml
    
  8. エージェント・ポッドを再始動します。

    kubectl delete pod <ibm-storage-metrics-agent> -n kube-system>
    

シェル・スクリプトを使用したシークレットの自動作成

  1. ステップに従って、 トラステッド・プロファイルを作成します。 プロファイルの 「条件」 で、必ず以下のアクセス権限を指定してください。

    • 「名前空間」kube-system の場合にアクセスを許可する
    • Satellite サービス役割- Satellite Link 管理者、リーダー
    • Kubernetes Service の役割-マネージャー、エディター
    • 請求サービス役割-リーダー、オペレーター
  2. 以下のスクリプトを generate-secret.sh というファイルに保存します。

    IBMCLOUD_AUTHTYPE=
    SECRET=
    error() {
        if [[ $? != 0 ]]; then
            echo "$1"; exit 1
        fi
    }
    #validate_arguments validates the arguments provided to the script
    validate_arguments() {
        if [[ "$#" -eq 1 ]]; then
        if [[ "$1" == "-h" ]] || [[ "$1" == "--help" ]]; then
            usage; exit 1
        fi
        fi
            #number of arguments provided to the script must be 2
        if [[ "$#" -ne 2 ]]; then
            echo "Invalid number of arguments provided"
            usage; exit 1
        fi
        #1st argument must be 'iam' or 'pod-identity'
        if [[ "$1" != "iam" ]] && [[ "$1" != "pod-identity" ]]; then
            echo "Provide a valid auth-type"
            usage; exit 1
        fi
        IBMCLOUD_AUTHTYPE=$1
        SECRET=$2
    }
    #usage - prints the usage for execution of script
    usage() {
        echo "USAGE:
        bash generate-secret.sh <auth-type> <apikey/profile-id>
        auth-type: auth-type should be either iam or pod-identity. Provide iam to use api
    key, pod-identity to use trusted profile"
    }
    #main
    main() {
        validate_arguments "$@"
        auth_type="IBMCLOUD_AUTHTYPE=$IBMCLOUD_AUTHTYPE"
        secret=
        if [[ "$IBMCLOUD_AUTHTYPE" == "iam" ]]; then
            secret="IBMCLOUD_APIKEY=$SECRET"
        else
            secret="IBMCLOUD_PROFILEID=$SECRET"
        fi
        encodedValue=$(echo -e "$auth_type\n$secret" | base64)
        #on certain os, base64 encoding introduces newline, removing the same here.
        encodedValue=${encodedValue//$'\n'/}
        #fetch the agent pod name
        agentPodName=$(kubectl get pods -n kube-system | grep ibm-storage-metrics-agent | awk '{print $1}')
        error "$(date +"%b %d %G %H:%M:%S"):  Unable to fetch ODF agent pod."
        if [[ "$agentPodName" == "" ]]; then
            echo "$(date +"%b %d %G %H:%M:%S"):  Error - ibm-storage-metrics-agent pod
    not found"
            exit 1
        fi
        echo "apiVersion: v1
    data:
    ibm-credentials.env: $encodedValue
    kind: Secret
    metadata:
    name: ibm-cloud-credentials
    namespace: kube-system
    type: Opaque" > ibm-cloud-credentials.yaml
        #create the k8s secret
        kubectl apply -f ibm-cloud-credentials.yaml &> /dev/null
        error "$(date +"%b %d %G %H:%M:%S"):  Error creating ibm-cloud-credentials
    secret."
        echo "$(date +"%b %d %G %H:%M:%S"):  Created ibm-cloud-credentials secret"
        #restart the ODF agent pod
        echo "$(date +"%b %d %G %H:%M:%S"):  Restarting $agentPodName pod"
        kubectl delete pod "$agentPodName" -n kube-system &> /dev/null
        error "$(date +"%b %d %G %H:%M:%S"):  Error restarting $agentPodName pod in
    kube-system namespace."
        agentPodStatus=
        for i in {1..12}
        do
            sleep 5
            agentPodStatus=$(kubectl get pods -n kube-system | grep ibm-storage-metrics-agent | awk '{print $3}')
            if [[ "$agentPodStatus" == "Running" ]]; then
                echo "$(date +"%b %d %G %H:%M:%S"):  $i: ODF billing agent is now using
    ibm-cloud-credentials secret"
                rm ibm-cloud-credentials.yaml
                error "Error deleting ibm-cloud-credentials.yaml."
                exit 0
            fi
        done
        error "$(date +"%b %d %G %H:%M:%S"):  Error - ibm-storage-metrics-agent is in
    $agentPodStatus state"
    }
    main "$@"
    
  3. generate-secret.sh スクリプトを実行し、 IBMCLOUD_AUTHTYPE として iam または pod-identity を指定し、 PROFILE-ID または API-KEY を指定します。

    信頼できるプロファイル ID を持つ pod-identity を使用して generate-secret.sh を実行するコマンドの例。

    sh ./generate-secret.sh pod-identity PROFILE-ID
    

    API キーを指定して iam を使用し、 generate-secret.sh を実行するコマンドの例。

    sh ./generate-secret.sh iam API-KEY
    
  4. エージェント・ポッドを再始動します。

    oc delete pod <ibm-storage-metrics-agent> -n kube-sysem
    
  5. 出力で secret type を探して、エージェント・ポッドのログを取得し、ドライバーが正しい資格情報を使用していることを確認します。 例えば、"secret-used":"ibm-cloud-credentials","type":"pod-identity"などです。

    oc logs ibm-storage-metrics-agent-xxx -c storage-secret-sidecar -n kube-system