Octroi de l'accès aux ressources OCI aux charges globales

Découvrez comment utiliser l'identité d'une charge globale exécutée sur un cluster Kubernetes pour accorder à la charge globale un accès affiné à d'autres ressources OCI à l'aide de Kubernetes Engine (OKE).

Remarque

Vous pouvez uniquement utiliser les identités de charge globale pour accorder l'accès aux ressources OCI lorsque vous utilisez des clusters améliorés. Reportez-vous à la section Enhanced Clusters.

Dans Kubernetes, une charge de travail est une application exécutée sur un cluster Kubernetes. Une charge globale peut être un composant d'application s'exécutant dans un seul pod ou plusieurs composants d'application s'exécutant dans un ensemble de pods qui fonctionnent ensemble. Tous les pods de la charge globale sont exécutés dans le même espace de noms.

Pour accorder à tous les pods d'une charge globale l'accès aux ressources Kubernetes, vous pouvez indiquer que chaque pod de la charge globale doit utiliser le même compte de service Kubernetes. Vous pouvez ensuite accorder des droits d'accès au rôle de cluster Kubernetes au compte de service. Il s'agit du compte de service qui lie les pods de la charge globale aux droits d'accès de rôle de cluster et accorde aux pods l'accès aux ressources Kubernetes.

Dans Oracle Cloud Infrastructure, une charge globale exécutée sur un cluster Kubernetes est considérée comme une ressource à part entière. Une ressource de charge globale est identifiée par la combinaison unique de cluster, d'espace de noms et de compte de service. Cette combinaison unique est appelée identité de charge globale. Vous pouvez utiliser l'identité de charge globale lors de la définition de stratégies IAM pour accorder un accès affiné à d'autres ressources OCI (telles que les buckets Object Storage). En outre, vous pouvez utiliser Oracle Cloud Infrastructure Audit pour répondre aux exigences de conformité en suivant les demandes envoyées par l'identité de charge globale, ce qui vous permet de surveiller et de signaler les accès non autorisés et les activités suspectes.

Pour accorder à tous les pods d'une charge globale l'accès aux ressources OCI, procédez comme suit :

  • Créez un espace de noms pour un compte de service.
  • Créez un compte de service pour l'application à utiliser.
  • Définissez une stratégie IAM pour accorder à la ressource de charge globale l'accès à d'autres ressources OCI.
  • Téléchargez et configurez le kit SDK OCI approprié pour le langage dans lequel l'application est écrite.
  • Modifiez l'application pour indiquer :
    • que les demandes de charge globale doivent être authentifiées à l'aide du fournisseur d'identités de charge globale Kubernetes Engine
    • les ressources OCI auxquelles accéder
  • Mettez à jour la spécification de déploiement de l'application pour indiquer que chaque pod de la charge globale doit utiliser le compte de service.

Lorsque vous utilisez des identités de charge globale, tenez compte des points suivants :

  • Actuellement, vous ne pouvez pas utiliser d'identités de charge globale avec des groupes dynamiques.
  • Vous pouvez uniquement utiliser des identités de charge globale avec un kit SDK OCI, et non avec la console ou l'API.
  • Les kits SDK OCI suivants prennent actuellement en charge les identités de charge globale :
    • Go SDK v65.32.0 (et versions ultérieures)
    • SDK Java v2.54.0 (et versions ultérieures)
    • Kit SDK Python v2.111.0 (et versions ultérieures)
    • SDK .NET v87.3.0 (et versions ultérieures)
    • Kit SDK Ruby v2.19.0 (et versions ultérieures)
  • Pour garantir une réutilisation efficace des jetons et réduire la génération inutile de jetons, créez une seule instance du fournisseur d'identités de charge globale Kubernetes Engine et réutilisez cette instance dans toutes les parties de l'application qui nécessitent une authentification. Chaque instance conserve son propre jeton mis en cache. Par conséquent, la création de plusieurs instances entraîne l'extraction et la gestion indépendantes de plusieurs jetons, ce qui entraîne des extractions de jeton en double, une charge inutile sur le service d'authentification, une utilisation inefficace des ressources et des temps de réponse système dégradés.

Exemple : utilisation du kit SDK Go pour accorder aux charges globales d'application l'accès aux ressources OCI

Pour accorder aux charges globales d'application Go exécutées sur un cluster Kubernetes l'accès à d'autres ressources OCI, procédez comme suit :

  1. Si vous ne l'avez pas encore fait, suivez les étapes permettant de configurer le fichier de configuration Kubeconfig du cluster et (si nécessaire) de définir la variable d'environnement KUBECONFIG de sorte qu'elle pointe vers le fichier. Vous devez configurer votre propre fichier Kubeconfig. Vous ne pouvez pas accéder à un cluster à l'aide d'un fichier Kubeconfig configuré par un autre utilisateur. Reportez-vous à Configuration de l'accès à un cluster.
  2. Obtenez l'OCID du cluster (par exemple, à l'aide de l'onglet Détails du cluster de la console).
  3. Créez un espace de noms pour le compte de service Kubernetes à utiliser en saisissant ce qui suit :

    kubectl create namespace <namespace-name>

    Par exemple :

    kubectl create namespace finance
  4. Créez un compte de service Kubernetes pour l'application à utiliser en saisissant ce qui suit :
    kubectl create serviceaccount <service-account-name> --namespace <namespace-name>

    Par exemple :

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. Définissez une stratégie IAM pour permettre à la charge globale d'accéder aux ressources OCI nécessaires :
    1. Ouvrez le menu de navigation et sélectionnez Identité et sécurité. Sous Identité, sélectionnez Stratégies.
    2. Suivez les instructions dans Procédure de création d'une stratégie et donnez un nom à cette stratégie (par exemple, acme-oke-finance-workload-policy).
    3. Entrez une instruction de stratégie pour permettre à la charge globale d'accéder aux ressources OCI nécessaires, au format suivant :

      Allow any-user to <verb> <resource> in <location> where all {
      request.principal.type = 'workload',
      request.principal.namespace = '<namespace-name>',
      request.principal.service_account = '<service-account-name>',
      request.principal.cluster_id = '<cluster-ocid>'}

      où :

      • <namespace-name> est le nom de l'espace de noms que vous avez créé précédemment.
      • <service-account-name> est le nom du compte de service que vous avez créé précédemment.
      • <cluster-ocid> est l'OCID du cluster que vous avez obtenu précédemment.

      Par exemple :

      Allow any-user to manage objects in tenancy where all {
      request.principal.type = 'workload',
      request.principal.namespace = 'finance',
      request.principal.service_account = 'financeserviceaccount',
      request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd'}
    4. Sélectionnez Créer pour créer la stratégie.
  6. Installez le kit SDK OCI pour Go (reportez-vous à Kit SDK pour Go).
  7. Dans le code de l'application Go, ajoutez :

    • fournisseur d'identités de charge globale Kubernetes Engine (OkeWorkloadIdentityConfigurationProvider)
    • la ressource OCI pour y accéder

    Par exemple, le fragment de code suivant utilise l'identité de charge globale pour l'authentification, crée un bucket dans le service Object Storage de la région Pheonix (PHX) et télécharge un fichier vers le bucket :

    // ExampleObjectStorage_UploadFile shows how to create a bucket and upload a file using OKE Workload Identity
    // Ensure only a single instance of the identity provider is used to optimize token reuse.
    // Creating multiple instances may result in redundant token generation for the same workload.
    
     func ExampleObjectStorage_UploadFile() {
            rp, err := auth.OkeWorkloadIdentityConfigurationProvider()
            if err != nil
            { panic(err) }
    
            c, clerr := objectstorage.NewObjectStorageClientWithConfigurationProvider(rp)
    
            c.SetRegion("us-phoenix-1")
    
            helpers.FatalIfError(clerr)
     
            ctx := context.Background()
            bname := helpers.GetRandomString(8)
            namespace := getNamespace(ctx, c)
             
            createBucket(ctx, c, namespace, bname)
     
            contentlen := 1024 * 1000
            filepath, filesize := helpers.WriteTempFileOfSize(int64(contentlen))    
            filename := path.Base(filepath)
            defer func() {
                    os.Remove(filename)
            }()
     
            file, e := os.Open(filepath)
            defer file.Close()
            helpers.FatalIfError(e)
              
            e = putObject(ctx, c, namespace, bname, filename, filesize, file, nil)
            helpers.FatalIfError(e)
     
     
            // Output:
            // get namespace
            // create bucket
            // put object
  8. Ouvrez la spécification de déploiement de l'application dans un éditeur de texte et :
    1. Ajoutez serviceAccountName et définissez-le sur le nom du compte de service que vous avez créé précédemment. Par exemple, serviceAccountName: financeserviceaccount.
    2. Ajoutez automountServiceAccountToken et définissez-le sur true.

    Par exemple :

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
     serviceAccountName: financeserviceaccount
     automountServiceAccountToken: true
     containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
         - containerPort: 80
  9. Déployez l'application en saisissant ce qui suit :
    kubectl create -f <filename>
    Par exemple :
    kubectl create -f financeworkloadidentity.yaml

Exemple : utilisation du kit SDK Java pour accorder aux charges globales d'application l'accès aux ressources OCI

Pour accorder aux charges globales d'application Java exécutées sur un cluster Kubernetes l'accès à d'autres ressources OCI, procédez comme suit :

  1. Si vous ne l'avez pas encore fait, suivez les étapes permettant de configurer le fichier de configuration Kubeconfig du cluster et (si nécessaire) de définir la variable d'environnement KUBECONFIG de sorte qu'elle pointe vers le fichier. Vous devez configurer votre propre fichier Kubeconfig. Vous ne pouvez pas accéder à un cluster à l'aide d'un fichier Kubeconfig configuré par un autre utilisateur. Reportez-vous à Configuration de l'accès à un cluster.
  2. Obtenez l'OCID du cluster (par exemple, à l'aide de l'onglet Détails du cluster dans la console).
  3. Créez un espace de noms pour le compte de service Kubernetes à utiliser en saisissant ce qui suit :

    kubectl create namespace <namespace-name>

    Par exemple :

    kubectl create namespace finance
  4. Créez un compte de service Kubernetes pour l'application à utiliser en saisissant ce qui suit :
    kubectl create serviceaccount <service-account-name> --namespace <namespace-name>

    Par exemple :

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. Définissez une stratégie IAM pour permettre à la charge globale d'accéder aux ressources OCI nécessaires :
    1. Ouvrez le menu de navigation et sélectionnez Identité et sécurité. Sous Identité, sélectionnez Stratégies.
    2. Suivez les instructions dans Procédure de création d'une stratégie et donnez un nom à cette stratégie (par exemple, acme-oke-finance-workload-policy).
    3. Entrez une instruction de stratégie pour permettre à la charge globale d'accéder aux ressources OCI nécessaires, au format suivant :

      Allow any-user to <verb> <resource> in <location> where all {
      request.principal.type = 'workload',
      request.principal.namespace = '<namespace-name>',
      request.principal.service_account = '<service-account-name>',
      request.principal.cluster_id = '<cluster-ocid>'}

      où :

      • <namespace-name> est le nom de l'espace de noms que vous avez créé précédemment.
      • <service-account-name> est le nom du compte de service que vous avez créé précédemment.
      • <cluster-ocid> est l'OCID du cluster que vous avez obtenu précédemment.

      Par exemple :

      Allow any-user to manage objects in tenancy where all {
      request.principal.type = 'workload',
      request.principal.namespace = 'finance',
      request.principal.service_account = 'financeserviceaccount',
      request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd'}
    4. Sélectionnez Créer pour créer la stratégie.
  6. Installez le kit SDK OCI pour Java (reportez-vous à Kit SDK pour Java).
  7. Dans le fichier pom.xml de l'application, ajoutez l'artefact oci-java-sdk-addons-oke-workload-identity en tant que dépendance :
    <dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-addons-oke-workload-identity</artifactId>
    <version>2.54.0</version>
    </dependency>
    
    <dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-common</artifactId>
    <version>2.54.0</version>
    </dependency>
    Notez que la version du kit SDK doit être 2.54.0 ou une version ultérieure.
  8. Dans le code de l'application Java, ajoutez :
    • fournisseur d'identités de charge globale Kubernetes Engine (OkeWorkloadIdentityAuthenticationDetailsProvider)
    • la ressource OCI pour y accéder

    Par exemple, le fragment de code suivant utilise l'identité de charge globale pour l'authentification, crée un bucket dans le service Object Storage de la région Pheonix (PHX) et télécharge un fichier vers le bucket :

    import com.oracle.bmc.Region;
    import com.oracle.bmc.auth.AuthenticationDetailsProvider;
    import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
    import com.oracle.bmc.auth.okeworkloadidentity.OkeWorkloadIdentityAuthenticationDetailsProvider;
    import com.oracle.bmc.objectstorage.ObjectStorage;
    import com.oracle.bmc.objectstorage.ObjectStorageClient;
    import com.oracle.bmc.objectstorage.model.BucketSummary;
    import com.oracle.bmc.objectstorage.requests.GetNamespaceRequest;
    import com.oracle.bmc.objectstorage.requests.GetObjectRequest;
    import com.oracle.bmc.objectstorage.requests.ListBucketsRequest;
    import com.oracle.bmc.objectstorage.requests.ListBucketsRequest.Builder;
    import com.oracle.bmc.objectstorage.responses.GetNamespaceResponse;
    import com.oracle.bmc.objectstorage.responses.GetObjectResponse;
    import com.oracle.bmc.objectstorage.responses.ListBucketsResponse;
    
    import java.io.InputStream;
    
    public class ObjectStorageSyncExample {
    
        public static void main(String[] args) throws Exception {
            /* Config the Container Engine for Kubernetes workload identity provider */
            /*Ensure only a single instance of the identity provider is used to optimize token reuse. Creating multiple instances may lead to redundant token generation for the same workload.*/
            final OkeWorkloadIdentityAuthenticationDetailsProvider provider = new OkeWorkloadIdentityAuthenticationDetailsProvider
                    .OkeWorkloadIdentityAuthenticationDetailsProviderBuilder()
                    .build();
    
            /* Configure the client to use workload identity provider*/
            ObjectStorage client =
                    ObjectStorageClient.builder().region(Region.US_PHOENIX_1).build(provider);
    
            GetNamespaceResponse namespaceResponse =
                    client.getNamespace(GetNamespaceRequest.builder().build());
            String namespaceName = namespaceResponse.getValue();
            System.out.println("Using namespace: " + namespaceName);
    
            Builder listBucketsBuilder =
                    ListBucketsRequest.builder()
                            .namespaceName(namespaceName)
                            .compartmentId("enter tenancy id");
    
            String nextToken = null;
            do {
                listBucketsBuilder.page(nextToken);
                ListBucketsResponse listBucketsResponse =
                        client.listBuckets(listBucketsBuilder.build());
                for (BucketSummary bucket : listBucketsResponse.getItems()) {
                    System.out.println("Found bucket: " + bucket.getName());
                }
                nextToken = listBucketsResponse.getOpcNextPage();
            } while (nextToken != null);
    
            // fetch the file from the object storage
            String bucketName = null;
            String objectName = null;
            GetObjectResponse getResponse =
                    client.getObject(
                            GetObjectRequest.builder()
                                    .namespaceName(namespaceName)
                                    .bucketName(bucketName)
                                    .objectName(objectName)
                                    .build());
    
            // stream contents should match the file uploaded
            try (final InputStream fileStream = getResponse.getInputStream()) {
                // use fileStream
            } // try-with-resources automatically closes fileStream
    
            client.close();
        }
    }
  9. Ouvrez la spécification de déploiement de l'application dans un éditeur de texte et :
    1. Ajoutez serviceAccountName et définissez-le sur le nom du compte de service que vous avez créé précédemment. Par exemple, serviceAccountName: financeserviceaccount.
    2. Ajoutez automountServiceAccountToken et définissez-le sur true.

    Par exemple :

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
     serviceAccountName: financeserviceaccount
     automountServiceAccountToken: true
     containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
         - containerPort: 80
  10. Déployez l'application en saisissant ce qui suit :
    kubectl create -f <filename>
    Par exemple :
    kubectl create -f financeworkloadidentity.yaml

Exemple : utilisation du kit SDK Java pour accorder aux charges globales d'application l'accès aux ressources OCI dans un autre compartiment

Pour accorder aux charges globales d'application Java exécutées sur un cluster Kubernetes dans un compartiment l'accès à d'autres ressources OCI dans un autre compartiment, procédez comme suit :

  1. Si vous ne l'avez pas encore fait, suivez les étapes permettant de configurer le fichier de configuration Kubeconfig du cluster et (si nécessaire) de définir la variable d'environnement KUBECONFIG de sorte qu'elle pointe vers le fichier. Vous devez configurer votre propre fichier Kubeconfig. Vous ne pouvez pas accéder à un cluster à l'aide d'un fichier Kubeconfig configuré par un autre utilisateur. Reportez-vous à Configuration de l'accès à un cluster.
  2. Obtenez l'OCID du cluster (par exemple, à l'aide de l'onglet Détails du cluster dans la console).
  3. En tant qu'administrateur de cluster, créez un espace de noms pour le compte de service Kubernetes à utiliser en saisissant ce qui suit :
    kubectl create namespace <namespace-name>

    Par exemple :

    kubectl create namespace finance
  4. En tant qu'administrateur de cluster, créez un compte de service Kubernetes pour l'application à utiliser en saisissant ce qui suit :

    kubectl create serviceaccount <service-account-name> --namespace <namespace-name>

    Par exemple :

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. En tant qu'administrateur de location, définissez une stratégie IAM pour permettre à un administrateur de cluster de lier les charges globales exécutées sur un cluster dans un compartiment, à d'autres ressources OCI dans un autre compartiment :

    1. Ouvrez le menu de navigation et sélectionnez Identité et sécurité. Sous Identité, sélectionnez Stratégies.
    2. Suivez les instructions dans Procédure de création d'une stratégie et donnez un nom à cette stratégie (par exemple, acme-oke-finance-workload-policy).
    3. Entrez des instructions de stratégie pour autoriser un administrateur de cluster à lier les charges globales exécutées sur un cluster dans un compartiment, à d'autres ressources OCI dans un autre compartiment, au format suivant :

      Allow group cluster-admins to manage cluster-workload-mappings in compartment <compartment-one>
      Allow group cluster-admins to {CLUSTER_WORKLOAD_COMPARTMENT_BIND,CLUSTER_WORKLOAD_COMPARTMENT_UNBIND} in compartment <compartment-two>

      où :

      • <compartment-one> est le compartiment auquel appartient le cluster
      • <compartment-two> est le compartiment auquel les autres ressources OCI appartiennent.

      Par exemple :

      Allow group cluster-admins to manage cluster-workload-mappings in compartment finance
      Allow group cluster-admins to {CLUSTER_WORKLOAD_COMPARTMENT_BIND,CLUSTER_WORKLOAD_COMPARTMENT_UNBIND} in compartment sales
      Si un groupe ne se trouve pas dans le domaine d'identité par défaut, ajoutez un préfixe au nom de domaine d'identité au format group '<identity-domain-name>'/'group-name'. Vous pouvez également indiquer un groupe à l'aide de son OCID, au format group id <group-ocid>.
    4. Sélectionnez Créer pour créer la stratégie.
  6. En tant qu'administrateur de cluster, dans le compartiment auquel le cluster appartient, créez une correspondance de charge globale qui met en correspondance les charges globales exécutées sur le cluster avec le compartiment auquel appartiennent les autres ressources OCI :

    oci ce workload-mapping create --namespace <namespace-name> --mapped-compartment-id <compartment-two-ocid> --cluster-id <cluster-ocid>

    Par exemple :

    oci ce workload-mapping create --namespace finance --mapped-compartment-id ocid1.compartment.oc1..aaaaaaaaad______fda --cluster-id ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd
  7. En tant qu'administrateur de la ressource dans le deuxième compartiment, définissez une stratégie IAM pour permettre à la charge globale d'accéder aux ressources OCI dans le compartiment :

    1. Ouvrez le menu de navigation et sélectionnez Identité et sécurité. Sous Identité, sélectionnez Stratégies.
    2. Suivez les instructions dans Procédure de création d'une stratégie et donnez un nom à cette stratégie (par exemple, acme-oke-finance-workload-policy).
    3. Entrez une instruction de stratégie pour permettre à la charge globale d'accéder aux ressources OCI nécessaires, au format suivant :

      Allow any-user to <verb> <resource> in <location> where all {
      request.principal.type = 'workload',
      request.principal.namespace = '<namespace-name>',
      request.principal.service_account = '<service-account-name>',
      request.principal.cluster_id = '<cluster-ocid>'}

      où :

      • <namespace-name> est le nom de l'espace de noms que vous avez créé précédemment.
      • <service-account-name> est le nom du compte de service que vous avez créé précédemment.
      • <cluster-ocid> est l'OCID du cluster que vous avez obtenu précédemment.

      Par exemple :

      Allow any-user to manage objects in compartment sales where all {
      request.principal.type = 'workload',
      request.principal.namespace = 'finance',
      request.principal.service_account = 'financeserviceaccount',
      request.principal.cluster_id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd'}
    4. Sélectionnez Créer pour créer la stratégie.
  8. Installez le kit SDK OCI pour Java (reportez-vous à Kit SDK pour Java). Notez que la version du kit SDK doit être 2.66.0 ou ultérieure (ou 3.18.0 ou ultérieure).
  9. Dans le fichier pom.xml de l'application, ajoutez l'artefact oci-java-sdk-addons-oke-workload-identity en tant que dépendance :
    <dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-addons-oke-workload-identity</artifactId>
    <version>2.66.0</version>
    </dependency>
    
    <dependency>
    <groupId>com.oracle.oci.sdk</groupId>
    <artifactId>oci-java-sdk-common</artifactId>
    <version>2.66.0</version>
    </dependency>
    Notez que la version du SDK doit être 2.66.0 ou ultérieure (ou 3.18.0 ou ultérieure).
  10. Dans le code de l'application Java, ajoutez :
    • fournisseur d'identités de charge globale Kubernetes Engine (OkeWorkloadIdentityAuthenticationDetailsProvider)
    • la ressource OCI pour y accéder

    Par exemple, le fragment de code suivant utilise l'identité de charge globale pour l'authentification, crée un bucket dans le service Object Storage de la région Pheonix (PHX) et télécharge un fichier vers le bucket :

    import com.oracle.bmc.Region;
    import com.oracle.bmc.auth.AuthenticationDetailsProvider;
    import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
    import com.oracle.bmc.auth.okeworkloadidentity.OkeWorkloadIdentityAuthenticationDetailsProvider;
    import com.oracle.bmc.objectstorage.ObjectStorage;
    import com.oracle.bmc.objectstorage.ObjectStorageClient;
    import com.oracle.bmc.objectstorage.model.BucketSummary;
    import com.oracle.bmc.objectstorage.requests.GetNamespaceRequest;
    import com.oracle.bmc.objectstorage.requests.GetObjectRequest;
    import com.oracle.bmc.objectstorage.requests.ListBucketsRequest;
    import com.oracle.bmc.objectstorage.requests.ListBucketsRequest.Builder;
    import com.oracle.bmc.objectstorage.responses.GetNamespaceResponse;
    import com.oracle.bmc.objectstorage.responses.GetObjectResponse;
    import com.oracle.bmc.objectstorage.responses.ListBucketsResponse;
    
    import java.io.InputStream;
    
    public class ObjectStorageSyncExample {
    
        public static void main(String[] args) throws Exception {
            /* Config the Container Engine for Kubernetes workload identity provider */
            /*Ensure only a single instance of the identity provider is used to optimize token reuse. Creating multiple instances may lead to redundant token generation for the same workload.*/
            final OkeWorkloadIdentityAuthenticationDetailsProvider provider = new OkeWorkloadIdentityAuthenticationDetailsProvider
                    .OkeWorkloadIdentityAuthenticationDetailsProviderBuilder()
                    .build();
    
            /* Configure the client to use workload identity provider*/
            ObjectStorage client =
                    ObjectStorageClient.builder().region(Region.US_PHOENIX_1).build(provider);
    
            GetNamespaceResponse namespaceResponse =
                    client.getNamespace(GetNamespaceRequest.builder().build());
            String namespaceName = namespaceResponse.getValue();
            System.out.println("Using namespace: " + namespaceName);
    
            Builder listBucketsBuilder =
                    ListBucketsRequest.builder()
                            .namespaceName(namespaceName)
                            .compartmentId("enter tenancy id");
    
            String nextToken = null;
            do {
                listBucketsBuilder.page(nextToken);
                ListBucketsResponse listBucketsResponse =
                        client.listBuckets(listBucketsBuilder.build());
                for (BucketSummary bucket : listBucketsResponse.getItems()) {
                    System.out.println("Found bucket: " + bucket.getName());
                }
                nextToken = listBucketsResponse.getOpcNextPage();
            } while (nextToken != null);
    
            // fetch the file from the object storage
            String bucketName = null;
            String objectName = null;
            GetObjectResponse getResponse =
                    client.getObject(
                            GetObjectRequest.builder()
                                    .namespaceName(namespaceName)
                                    .bucketName(bucketName)
                                    .objectName(objectName)
                                    .build());
    
            // stream contents should match the file uploaded
            try (final InputStream fileStream = getResponse.getInputStream()) {
                // use fileStream
            } // try-with-resources automatically closes fileStream
    
            client.close();
        }
    }
  11. Ouvrez la spécification de déploiement de l'application dans un éditeur de texte et :
    1. Ajoutez namespace et définissez-le sur le nom de l'espace de noms que vous avez créé précédemment. Par exemple, namespace: finance.
    2. Ajoutez serviceAccountName et définissez-le sur le nom du compte de service que vous avez créé précédemment. Par exemple, serviceAccountName: financeserviceaccount.
    3. Ajoutez automountServiceAccountToken et définissez-le sur true.

    Par exemple :

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      namespace: finance
    spec:
      serviceAccountName: financeserviceaccount
      automountServiceAccountToken: true
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80
  12. Déployez l'application en saisissant ce qui suit :
    kubectl create -f <filename>
    Par exemple :
    kubectl create -f financeworkloadidentity.yaml