Otorgamiento de acceso a cargas de trabajo a recursos de OCI

Descubra cómo utilizar la identidad de una carga de trabajo que se ejecuta en un cluster de Kubernetes para otorgar acceso detallado a la carga de trabajo a otros recursos de OCI mediante Container Engine for Kubernetes (OKE).

Nota

Solo puede utilizar identidades de carga de trabajo para otorgar acceso a los recursos de OCI al utilizar clusters mejorados. Consulte Enhanced Clusters.

En Kubernetes, una carga de trabajo es una aplicación que se ejecuta en un cluster de Kubernetes. Una carga de trabajo puede ser un componente de aplicación que se ejecuta dentro de un único pod o varios componentes de aplicación que se ejecutan dentro de un juego de pods que funcionan conjuntamente. Todos los pods de la carga de trabajo se ejecutan en el mismo espacio de nombres.

Para otorgar a todos los pods de una carga de trabajo acceso a los recursos de Kubernetes, puede especificar que cada pod de la carga de trabajo utilice la misma cuenta de servicio de Kubernetes. A continuación, puede otorgar permisos de rol de cluster de Kubernetes a la cuenta de servicio. Es la cuenta de servicio que enlaza los pods de la carga de trabajo a permisos de rol de cluster y otorga a los pods acceso a los recursos de Kubernetes.

En Oracle Cloud Infrastructure, una carga de trabajo que se ejecuta en un cluster de Kubernetes se considera un recurso por derecho propio. Un recurso de carga de trabajo se identifica mediante la combinación única de cluster, espacio de nombres y cuenta de servicio. Esta combinación única se denomina identidad de carga de trabajo. Puede utilizar la identidad de carga de trabajo al definir políticas de IAM para otorgar acceso detallado a otros recursos de OCI (como cubos de Object Storage). Además, puede utilizar Oracle Cloud Infrastructure Audit para cumplir los requisitos de conformidad mediante el seguimiento de las solicitudes realizadas por la identidad de la carga de trabajo, lo que le permite supervisar y notificar el acceso no autorizado y la actividad sospechosa.

Para otorgar a todos los pods de una carga de trabajo acceso a los recursos de OCI:

  • Cree un espacio de nombres para una cuenta de servicio.
  • Cree una cuenta de servicio para la aplicación que se va a utilizar.
  • Defina una política de IAM para otorgar acceso al recurso de carga de trabajo a otros recursos de OCI.
  • Descargue y configure el SDK de OCI adecuado para el idioma en el que se escribe la aplicación.
  • Edite la aplicación para especificar:
    • que las solicitudes de carga de trabajo se deben autenticar mediante el proveedor de identidad de carga de trabajo de Container Engine for Kubernetes
    • los recursos de OCI a los que se va a acceder
  • Actualice la especificación de despliegue de la aplicación para especificar que cada pod de la carga de trabajo va a utilizar la cuenta de servicio.

Tenga en cuenta lo siguiente al utilizar identidades de carga de trabajo:

  • Actualmente no puede utilizar identidades de carga de trabajo con grupos dinámicos.
  • Solo puede utilizar identidades de carga de trabajo con un SDK de OCI, no con la consola o la API.
  • Los siguientes SDK de OCI soportan actualmente identidades de carga de trabajo:
    • SDK de Go v65.32.0 (y posterior)
    • SDK de Java v2.54.0 (y posterior)
    • SDK de Python v2.111.0 (y posterior)

Ejemplo: uso del SDK de Go para otorgar acceso a las cargas de trabajo de aplicaciones a los recursos de OCI

Para otorgar a las cargas de trabajo de la aplicación Go que se ejecutan en un cluster de Kubernetes acceso a otros recursos de OCI:

  1. Si todavía no lo ha hecho, siga los pasos para configurar el archivo de configuración kubeconfig del cluster y (si es necesario) defina la variable de entorno KUBECONFIG para que apunte al archivo. Tenga en cuenta que debe configurar su propio archivo kubeconfig. No puede acceder a un cluster utilizando un archivo kubeconfig que haya configurado un usuario diferente. Consulte Configuración del acceso a los clusters.
  2. Obtenga el OCID del cluster (por ejemplo, mediante el separador Detalles de cluster de la consola).
  3. Cree un espacio de nombres para la cuenta de servicio de Kubernetes que se va a utilizar introduciendo:

    kubectl create namespace <namespace-name>

    Por ejemplo:

    kubectl create namespace finance
  4. Cree una cuenta de servicio de Kubernetes para que la aplicación la utilice introduciendo:
    kubectl create serviceaccount <service-account-name> --namespace <namespace-name>

    Por ejemplo:

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. Defina una política de IAM para permitir que la carga de trabajo acceda a los recursos de OCI necesarios:
    1. Abra el menú de navegación y haga clic en Identidad y seguridad. En Identidad, haga clic en Políticas.
    2. Siga las instrucciones de Para crear una política y asigne un nombre a la política (por ejemplo, acme-oke-finance-workload-policy).
    3. Introduzca una sentencia de política para permitir que la carga de trabajo acceda a los recursos de OCI necesarios, con el formato:

      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>'}

      donde:

      • <namespace-name> es el nombre del espacio de nombres que ha creado anteriormente.
      • <service-account-name> es el nombre de la cuenta de servicio que ha creado anteriormente.
      • <cluster-ocid> es el OCID del cluster que ha obtenido anteriormente.

      Por ejemplo:

      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. Haga clic en Crear para crear la nueva política.
  6. Instale el SDK de OCI para Go (consulte SDK para Go).
  7. En el código de aplicación Go, agregue:

    • el proveedor de identidad de carga de trabajo de Container Engine for Kubernetes (OkeWorkloadIdentityConfigurationProvider)
    • el recurso de OCI al que acceder

    Por ejemplo, el siguiente fragmento de código utiliza la identidad de carga de trabajo para la autenticación, crea un cubo en el servicio Object Storage de la región Pheonix (PHX) y carga un archivo en el cubo:

    // ExampleObjectStorage_UploadFile shows how to create a bucket and upload a file using OKE Workload Identity
      
     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. Abra la especificación de despliegue de la aplicación en un editor de texto y:
    1. Agregue serviceAccountName y defínalo con el nombre de la cuenta de servicio que ha creado anteriormente. Por ejemplo, serviceAccountName: financeserviceaccount.
    2. Agregue automountServiceAccountToken y defínalo en true.

    Por ejemplo:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
     serviceAccountName: financeserviceaccount
     automountServiceAccountToken: true
     containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
         - containerPort: 80
  9. Para desplegar la aplicación, introduzca:
    kubectl create -f <filename>
    Por ejemplo:
    kubectl create -f financeworkloadidentity.yaml

Ejemplo: uso del SDK de Java para otorgar acceso a las cargas de trabajo de aplicaciones a los recursos de OCI

Para otorgar a las cargas de trabajo de aplicaciones Java que se ejecutan en un cluster de Kubernetes acceso a otros recursos de OCI:

  1. Si todavía no lo ha hecho, siga los pasos para configurar el archivo de configuración kubeconfig del cluster y (si es necesario) defina la variable de entorno KUBECONFIG para que apunte al archivo. Tenga en cuenta que debe configurar su propio archivo kubeconfig. No puede acceder a un cluster utilizando un archivo kubeconfig que haya configurado un usuario diferente. Consulte Configuración del acceso a los clusters.
  2. Obtenga el OCID del cluster (por ejemplo, mediante el separador Detalles de cluster de la consola).
  3. Cree un espacio de nombres para la cuenta de servicio de Kubernetes que se va a utilizar introduciendo:

    kubectl create namespace <namespace-name>

    Por ejemplo:

    kubectl create namespace finance
  4. Cree una cuenta de servicio de Kubernetes para que la aplicación la utilice introduciendo:
    kubectl create serviceaccount <service-account-name> --namespace <namespace-name>

    Por ejemplo:

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. Defina una política de IAM para permitir que la carga de trabajo acceda a los recursos de OCI necesarios:
    1. Abra el menú de navegación y haga clic en Identidad y seguridad. En Identidad, haga clic en Políticas.
    2. Siga las instrucciones de Para crear una política y asigne un nombre a la política (por ejemplo, acme-oke-finance-workload-policy).
    3. Introduzca una sentencia de política para permitir que la carga de trabajo acceda a los recursos de OCI necesarios, con el formato:

      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>'}

      donde:

      • <namespace-name> es el nombre del espacio de nombres que ha creado anteriormente.
      • <service-account-name> es el nombre de la cuenta de servicio que ha creado anteriormente.
      • <cluster-ocid> es el OCID del cluster que ha obtenido anteriormente.

      Por ejemplo:

      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. Haga clic en Crear para crear la nueva política.
  6. Instale el SDK de OCI para Java (consulte SDK para Java).
  7. En pom.xml de la aplicación, agregue el artefacto oci-java-sdk-addons-oke-workload-identity como dependencia:
    <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>
    Tenga en cuenta que la versión de SDK debe ser 2.54.0 o posterior.
  8. En el código de la aplicación Java, agregue:
    • el proveedor de identidad de carga de trabajo de Container Engine for Kubernetes (OkeWorkloadIdentityAuthenticationDetailsProvider)
    • el recurso de OCI al que acceder

    Por ejemplo, el siguiente fragmento de código utiliza la identidad de carga de trabajo para la autenticación, crea un cubo en el servicio Object Storage de la región Pheonix (PHX) y carga un archivo en el cubo:

    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 */
            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. Abra la especificación de despliegue de la aplicación en un editor de texto y:
    1. Agregue serviceAccountName y defínalo con el nombre de la cuenta de servicio que ha creado anteriormente. Por ejemplo, serviceAccountName: financeserviceaccount.
    2. Agregue automountServiceAccountToken y defínalo en true.

    Por ejemplo:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
     serviceAccountName: financeserviceaccount
     automountServiceAccountToken: true
     containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
         - containerPort: 80
  10. Para desplegar la aplicación, introduzca:
    kubectl create -f <filename>
    Por ejemplo:
    kubectl create -f financeworkloadidentity.yaml

Ejemplo: uso del SDK de Java para otorgar acceso a las cargas de trabajo de aplicaciones a los recursos de OCI en diferentes compartimentos

Para otorgar a las cargas de trabajo de aplicaciones Java que se ejecutan en un cluster de Kubernetes en un compartimento acceso a otros recursos de OCI en un compartimento diferente:

  1. Si todavía no lo ha hecho, siga los pasos para configurar el archivo de configuración kubeconfig del cluster y (si es necesario) defina la variable de entorno KUBECONFIG para que apunte al archivo. Tenga en cuenta que debe configurar su propio archivo kubeconfig. No puede acceder a un cluster utilizando un archivo kubeconfig que haya configurado un usuario diferente. Consulte Configuración del acceso a los clusters.
  2. Obtenga el OCID del cluster (por ejemplo, mediante el separador Detalles de cluster de la consola).
  3. Como administrador del cluster, cree un espacio de nombres para que la cuenta de servicio de Kubernetes lo utilice introduciendo:
    kubectl create namespace <namespace-name>

    Por ejemplo:

    kubectl create namespace finance
  4. Como administrador del cluster, cree una cuenta de servicio de Kubernetes para que la aplicación la utilice introduciendo:

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

    Por ejemplo:

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. Como administrador de arrendamiento, defina una política de IAM para permitir que un administrador de cluster enlace cargas de trabajo que se ejecutan en un cluster en un compartimento a otros recursos de OCI en un compartimento diferente:

    1. Abra el menú de navegación y haga clic en Identidad y seguridad. En Identidad, haga clic en Políticas.
    2. Siga las instrucciones de Para crear una política y asigne un nombre a la política (por ejemplo, acme-oke-finance-workload-policy).
    3. Introduzca sentencias de política para permitir a un administrador de cluster enlazar cargas de trabajo que se ejecutan en un cluster en un compartimento a otros recursos de OCI en un compartimento diferente, con el formato:

      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>

      donde:

      • <compartment-one> es el compartimento al que pertenece el cluster
      • <compartment-two> es el compartimento al que pertenecen los demás recursos de OCI

      Por ejemplo:

      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
      Tenga en cuenta que si un grupo no está en el dominio de identidad por defecto, agregue un prefijo al nombre de grupo con el nombre de dominio de identidad, con el formato group '<identity-domain-name>'/'group-name'. También puede especificar un grupo mediante su OCID, con el formato group id <group-ocid>.
    4. Haga clic en Crear para crear la nueva política.
  6. Como administrador del cluster, en el compartimento al que pertenece el cluster, cree una asignación de carga de trabajo que asigne las cargas de trabajo que se ejecutan en el cluster al compartimento al que pertenecen los demás recursos de OCI:

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

    Por ejemplo:

    oci ce workload-mapping create --namespace finance --mapped-compartment-id ocid1.compartment.oc1..aaaaaaaaad______fda --cluster-id ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd
  7. Como administrador del recurso en el segundo compartimento, defina una política de IAM para permitir que la carga de trabajo acceda a los recursos de OCI del compartimento:

    1. Abra el menú de navegación y haga clic en Identidad y seguridad. En Identidad, haga clic en Políticas.
    2. Siga las instrucciones de Para crear una política y asigne un nombre a la política (por ejemplo, acme-oke-finance-workload-policy).
    3. Introduzca una sentencia de política para permitir que la carga de trabajo acceda a los recursos de OCI necesarios, con el formato:

      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>'}

      donde:

      • <namespace-name> es el nombre del espacio de nombres que ha creado anteriormente.
      • <service-account-name> es el nombre de la cuenta de servicio que ha creado anteriormente.
      • <cluster-ocid> es el OCID del cluster que ha obtenido anteriormente.

      Por ejemplo:

      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. Haga clic en Crear para crear la nueva política.
  8. Instale el SDK de OCI para Java (consulte SDK para Java). Tenga en cuenta que la versión de SDK debe ser 2.66.0 o posterior (o 3.18.0 o posterior).
  9. En pom.xml de la aplicación, agregue el artefacto oci-java-sdk-addons-oke-workload-identity como dependencia:
    <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>
    Tenga en cuenta que la versión de SDK debe ser 2.66.0 o posterior (o 3.18.0 o posterior).
  10. En el código de la aplicación Java, agregue:
    • el proveedor de identidad de carga de trabajo de Container Engine for Kubernetes (OkeWorkloadIdentityAuthenticationDetailsProvider)
    • el recurso de OCI al que acceder

    Por ejemplo, el siguiente fragmento de código utiliza la identidad de carga de trabajo para la autenticación, crea un cubo en el servicio Object Storage de la región Pheonix (PHX) y carga un archivo en el cubo:

    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 */
            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. Abra la especificación de despliegue de la aplicación en un editor de texto y:
    1. Agregue namespace y defínalo con el nombre del espacio de nombres creado anteriormente. Por ejemplo, namespace: finance.
    2. Agregue serviceAccountName y defínalo con el nombre de la cuenta de servicio que ha creado anteriormente. Por ejemplo, serviceAccountName: financeserviceaccount.
    3. Agregue automountServiceAccountToken y defínalo en true.

    Por ejemplo:

    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. Para desplegar la aplicación, introduzca:
    kubectl create -f <filename>
    Por ejemplo:
    kubectl create -f financeworkloadidentity.yaml