Workloads Zugriff auf OCI-Ressourcen erteilen

Erfahren Sie, wie Sie mit der Identität einer Workload, die auf einem Kubernetes-Cluster ausgeführt wird, der Workload einen feingranulierten Zugriff auf andere OCI-Ressourcen mit der Kubernetes Engine (OKE) erteilen.

Hinweis

Sie können mit Workload-Identitäten nur Zugriff auf OCI-Ressourcen erteilen, wenn Sie erweiterte Cluster verwenden. Siehe Erweiterte Cluster.

In Kubernetes ist eine Workload eine Anwendung, die auf einem Kubernetes-Cluster ausgeführt wird. Eine Workload kann eine Anwendungskomponente sein, die in einem einzelnen Pod ausgeführt wird, oder mehrere Anwendungskomponenten, die in einer Gruppe von Pods ausgeführt werden, die zusammenarbeiten. Alle Pods in der Workload werden im selben Namespace ausgeführt.

Um allen Pods in einer Workload Zugriff auf Kubernetes-Ressourcen zu erteilen, können Sie angeben, dass jeder Pod in der Workload denselben Kubernetes-Serviceaccount verwenden soll. Anschließend können Sie dem Serviceaccount Berechtigungen für die Kubernetes-Clusterrolle erteilen. Es ist der Serviceaccount, der die Pods in der Workload an Cluster-Rollenberechtigungen bindet und den Pods Zugriff auf Kubernetes-Ressourcen erteilt.

In Oracle Cloud Infrastructure wird eine Workload, die auf einem Kubernetes-Cluster ausgeführt wird, als eigene Ressource betrachtet. Eine Workload-Ressource wird durch die eindeutige Kombination aus Cluster, Namespace und Serviceaccount identifiziert. Diese eindeutige Kombination wird als Workload-Identität bezeichnet. Sie können die Workload-Identität bei der Definition von IAM-Policys verwenden, um feingranulierten Zugriff auf andere OCI-Ressourcen (wie Object Storage-Buckets) zu erteilen. Darüber hinaus können Sie mit Oracle Cloud Infrastructure Audit Complianceanforderungen erfüllen, indem Sie Anforderungen der Workload-Identität verfolgen. So können Sie unbefugten Zugriff und verdächtige Aktivitäten überwachen und melden.

So erteilen Sie allen Pods in einer Workload Zugriff auf OCI-Ressourcen:

  • Erstellen Sie einen Namespace für einen Serviceaccount.
  • Erstellen Sie einen Serviceaccount für die zu verwendende Anwendung.
  • Definieren Sie eine IAM-Policy, um der Workload-Ressource Zugriff auf andere OCI-Ressourcen zu erteilen.
  • Laden Sie das entsprechende OCI-SDK für die Sprache herunter, in der die Anwendung geschrieben ist, und konfigurieren Sie es.
  • Bearbeiten Sie die Anwendung, um Folgendes anzugeben:
    • dass Workload-Anforderungen mit dem Workload-Identitätsprovider der Kubernetes-Engine authentifiziert werden müssen
    • auf die OCI-Ressourcen zugegriffen werden soll
  • Aktualisieren Sie die Deployment-Spezifikation der Anwendung, um anzugeben, dass jeder Pod in der Workload den Serviceaccount verwenden soll.

Beachten Sie Folgendes, wenn Sie Workload-Identitäten verwenden:

  • Sie können Workload-Identitäten derzeit nicht mit dynamischen Gruppen verwenden.
  • Sie können Workload-Identitäten nur mit einem OCI-SDK verwenden, nicht mit der Konsole oder der API.
  • Die folgenden OCI-SDKs unterstützen derzeit Workload-Identitäten:
    • Go SDK v65.32.0 (und höher)
    • Java SDK v2.54.0 (und höher)
    • Python-SDK v2.111.0 (und höher)
    • .NET SDK v87.3.0 (und höher)
    • Ruby-SDK v2.19.0 (und höher)
  • Um eine effiziente Tokenwiederverwendung sicherzustellen und unnötige Tokengenerierung zu reduzieren, erstellen Sie nur eine Instanz des Workload-Identitätsproviders der Kubernetes Engine, und verwenden Sie diese Instanz in allen Teilen der Anwendung wieder, die eine Authentifizierung erfordern. Jede Instanz verwaltet ihr eigenes gecachtes Token. Wenn Sie also mehrere Instanzen erstellen, werden mehrere Token unabhängig abgerufen und verwaltet. Dies führt zu doppelten Tokenabrufen, unnötiger Belastung des Authentifizierungsservice, ineffizienter Ressourcennutzung und eingeschränkten Systemantwortzeiten.

Beispiel: Mit dem Go-SDK Anwendungs-Workloads Zugriff auf OCI-Ressourcen erteilen

So erteilen Sie Go-Anwendungs-Workloads, die auf einem Kubernetes-Cluster ausgeführt werden, Zugriff auf andere OCI-Ressourcen:

  1. Falls noch nicht geschehen, führen Sie die Schritte zum Einrichten der kubeconfig-Konfigurationsdatei des Clusters aus, und legen Sie (gegebenenfalls) die Umgebungsvariable KUBECONFIG so fest, dass sie auf die Datei verweist. Beachten Sie, dass Sie Ihre eigene kubeconfig-Datei einrichten müssen. Sie können nicht mit einer kubeconfig-Datei, die von einem anderen Benutzer eingerichtet wurde, auf ein Cluster zugreifen. Siehe Clusterzugriff einrichten.
  2. Rufen Sie die OCID des Clusters ab (Beispiel: in der Konsole auf der Registerkarte Clusterdetails).
  3. Erstellen Sie einen Namespace für den zu verwendenden Kubernetes-Serviceaccount, indem Sie Folgendes eingeben:

    kubectl create namespace <namespace-name>

    Beispiel:

    kubectl create namespace finance
  4. Erstellen Sie einen Kubernetes-Serviceaccount für die zu verwendende Anwendung, indem Sie Folgendes eingeben:
    kubectl create serviceaccount <service-account-name> --namespace <namespace-name>

    Beispiel:

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. Definieren Sie eine IAM-Policy, damit die Workload auf die erforderlichen OCI-Ressourcen zugreifen kann:
    1. Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Policys aus.
    2. Folgen Sie den Anweisungen unter So erstellen Sie eine Policy, und geben Sie der Policy einen Namen (Beispiel: acme-oke-finance-workload-policy).
    3. Geben Sie eine Policy-Anweisung ein, damit die Workload auf die erforderlichen OCI-Ressourcen im folgenden Format zugreifen kann:

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

      Hierbei gilt:

      • <namespace-name> ist der Name des zuvor erstellten Namespace.
      • <service-account-name> ist der Name des Serviceaccounts, den Sie zuvor erstellt haben.
      • <cluster-ocid> ist die OCID des Clusters, die Sie zuvor abgerufen haben.

      Beispiel:

      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. Wählen Sie Erstellen aus, um die neue Policy zu erstellen.
  6. Installieren Sie das OCI-SDK für Go (siehe SDK für Go).
  7. Fügen Sie in Ihrem Go-Anwendungscode Folgendes hinzu:

    • den Kubernetes Engine-Workload-Identitätsprovider (OkeWorkloadIdentityConfigurationProvider)
    • die OCI-Ressource für den Zugriff

    Beispiel: Das folgende Code-Snippet verwendet die Workload-Identität zur Authentifizierung, erstellt einen Bucket im Object Storage-Service in der Region Pheonix (PHX) und lädt eine Datei in den Bucket hoch:

    // 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. Öffnen Sie die Deployment-Spezifikation der Anwendung in einem Texteditor, und führen Sie folgende Schritte aus:
    1. Fügen Sie serviceAccountName hinzu, und setzen Sie es auf den Namen des Serviceaccounts, den Sie zuvor erstellt haben. Beispiel: serviceAccountName: financeserviceaccount.
    2. Fügen Sie automountServiceAccountToken hinzu, und setzen Sie es auf true.

    Beispiel:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
     serviceAccountName: financeserviceaccount
     automountServiceAccountToken: true
     containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
         - containerPort: 80
  9. Deployment der Anwendung durch Eingabe von:
    kubectl create -f <filename>
    Beispiel:
    kubectl create -f financeworkloadidentity.yaml

Beispiel: Mit dem Java-SDK Anwendungs-Workloads Zugriff auf OCI-Ressourcen erteilen

So erteilen Sie Java-Anwendungs-Workloads, die auf einem Kubernetes-Cluster ausgeführt werden, Zugriff auf andere OCI-Ressourcen:

  1. Falls noch nicht geschehen, führen Sie die Schritte zum Einrichten der kubeconfig-Konfigurationsdatei des Clusters aus, und legen Sie (gegebenenfalls) die Umgebungsvariable KUBECONFIG so fest, dass sie auf die Datei verweist. Beachten Sie, dass Sie Ihre eigene kubeconfig-Datei einrichten müssen. Sie können nicht mit einer kubeconfig-Datei, die von einem anderen Benutzer eingerichtet wurde, auf ein Cluster zugreifen. Siehe Clusterzugriff einrichten.
  2. Rufen Sie die OCID des Clusters ab (z.B. mit der Registerkarte Clusterdetails in der Konsole).
  3. Erstellen Sie einen Namespace für den zu verwendenden Kubernetes-Serviceaccount, indem Sie Folgendes eingeben:

    kubectl create namespace <namespace-name>

    Beispiel:

    kubectl create namespace finance
  4. Erstellen Sie einen Kubernetes-Serviceaccount für die zu verwendende Anwendung, indem Sie Folgendes eingeben:
    kubectl create serviceaccount <service-account-name> --namespace <namespace-name>

    Beispiel:

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. Definieren Sie eine IAM-Policy, damit die Workload auf die erforderlichen OCI-Ressourcen zugreifen kann:
    1. Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Policys aus.
    2. Folgen Sie den Anweisungen unter So erstellen Sie eine Policy, und geben Sie der Policy einen Namen (Beispiel: acme-oke-finance-workload-policy).
    3. Geben Sie eine Policy-Anweisung ein, damit die Workload auf die erforderlichen OCI-Ressourcen im folgenden Format zugreifen kann:

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

      Hierbei gilt:

      • <namespace-name> ist der Name des zuvor erstellten Namespace.
      • <service-account-name> ist der Name des Serviceaccounts, den Sie zuvor erstellt haben.
      • <cluster-ocid> ist die OCID des Clusters, die Sie zuvor abgerufen haben.

      Beispiel:

      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. Wählen Sie Erstellen aus, um die neue Policy zu erstellen.
  6. Installieren Sie das OCI-SDK für Java (siehe SDK für Java).
  7. Fügen Sie im pom.xml der Anwendung das Artefakt oci-java-sdk-addons-oke-workload-identity als Abhängigkeit hinzu:
    <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>
    Beachten Sie, dass die SDK-Version 2.54.0 oder höher sein muss.
  8. Fügen Sie in Ihrem Java-Anwendungscode Folgendes hinzu:
    • den Kubernetes Engine-Workload-Identitätsprovider (OkeWorkloadIdentityAuthenticationDetailsProvider)
    • die OCI-Ressource für den Zugriff

    Beispiel: Das folgende Code-Snippet verwendet die Workload-Identität zur Authentifizierung, erstellt einen Bucket im Object Storage-Service in der Region Pheonix (PHX) und lädt eine Datei in den Bucket hoch:

    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. Öffnen Sie die Deployment-Spezifikation der Anwendung in einem Texteditor, und führen Sie folgende Schritte aus:
    1. Fügen Sie serviceAccountName hinzu, und setzen Sie es auf den Namen des Serviceaccounts, den Sie zuvor erstellt haben. Beispiel: serviceAccountName: financeserviceaccount.
    2. Fügen Sie automountServiceAccountToken hinzu, und setzen Sie es auf true.

    Beispiel:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
    spec:
     serviceAccountName: financeserviceaccount
     automountServiceAccountToken: true
     containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
         - containerPort: 80
  10. Deployment der Anwendung durch Eingabe von:
    kubectl create -f <filename>
    Beispiel:
    kubectl create -f financeworkloadidentity.yaml

Beispiel: Mit dem Java-SDK Anwendungs-Workloads Zugriff auf OCI-Ressourcen in einem anderen Compartment erteilen

So erteilen Sie Java-Anwendungs-Workloads, die auf einem Kubernetes-Cluster in einem Compartment ausgeführt werden, Zugriff auf andere OCI-Ressourcen in einem anderen Compartment:

  1. Falls noch nicht geschehen, führen Sie die Schritte zum Einrichten der kubeconfig-Konfigurationsdatei des Clusters aus, und legen Sie (gegebenenfalls) die Umgebungsvariable KUBECONFIG so fest, dass sie auf die Datei verweist. Beachten Sie, dass Sie Ihre eigene kubeconfig-Datei einrichten müssen. Sie können nicht mit einer kubeconfig-Datei, die von einem anderen Benutzer eingerichtet wurde, auf ein Cluster zugreifen. Siehe Clusterzugriff einrichten.
  2. Rufen Sie die OCID des Clusters ab (z.B. mit der Registerkarte Clusterdetails in der Konsole).
  3. Erstellen Sie als Clusteradministrator einen Namespace für den zu verwendenden Kubernetes-Serviceaccount, indem Sie Folgendes eingeben:
    kubectl create namespace <namespace-name>

    Beispiel:

    kubectl create namespace finance
  4. Erstellen Sie als Clusteradministrator einen Kubernetes-Serviceaccount für die zu verwendende Anwendung, indem Sie Folgendes eingeben:

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

    Beispiel:

    kubectl create serviceaccount financeserviceaccount --namespace finance
  5. Definieren Sie als Mandantenadministrator eine IAM-Policy, damit ein Clusteradministrator Workloads, die in einem Cluster in einem Compartment ausgeführt werden, an andere OCI-Ressourcen in einem anderen Compartment binden kann:

    1. Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Policys aus.
    2. Folgen Sie den Anweisungen unter So erstellen Sie eine Policy, und geben Sie der Policy einen Namen (Beispiel: acme-oke-finance-workload-policy).
    3. Geben Sie Policy-Anweisungen ein, damit ein Clusteradministrator Workloads, die in einem Cluster in einem Compartment ausgeführt werden, an andere OCI-Ressourcen in einem anderen Compartment im folgenden Format binden kann:

      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>

      Hierbei gilt:

      • <compartment-one> ist das Compartment, zu dem das Cluster gehört
      • <compartment-two> ist das Compartment, zu dem die anderen OCI-Ressourcen gehören

      Beispiel:

      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
      Wenn eine Gruppe nicht in der Standardidentitätsdomain enthalten ist, stellen Sie dem Gruppennamen den Namen der Identitätsdomain im Format group '<identity-domain-name>'/'group-name' voran. Sie können eine Gruppe auch mit ihrer OCID im Format group id <group-ocid> angeben.
    4. Wählen Sie Erstellen aus, um die neue Policy zu erstellen.
  6. Erstellen Sie als Clusteradministrator in dem Compartment, zu dem das Cluster gehört, eine Workload-Zuordnung, die Workloads, die im Cluster ausgeführt werden, dem Compartment zuordnet, zu dem die anderen OCI-Ressourcen gehören:

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

    Beispiel:

    oci ce workload-mapping create --namespace finance --mapped-compartment-id ocid1.compartment.oc1..aaaaaaaaad______fda --cluster-id ocid1.cluster.oc1.iad.aaaaaaaaaf______jrd
  7. Definieren Sie als Administrator der Ressource im zweiten Compartment eine IAM-Policy, damit die Workload auf die OCI-Ressourcen im Compartment zugreifen kann:

    1. Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Policys aus.
    2. Folgen Sie den Anweisungen unter So erstellen Sie eine Policy, und geben Sie der Policy einen Namen (Beispiel: acme-oke-finance-workload-policy).
    3. Geben Sie eine Policy-Anweisung ein, damit die Workload auf die erforderlichen OCI-Ressourcen im folgenden Format zugreifen kann:

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

      Hierbei gilt:

      • <namespace-name> ist der Name des zuvor erstellten Namespace.
      • <service-account-name> ist der Name des Serviceaccounts, den Sie zuvor erstellt haben.
      • <cluster-ocid> ist die OCID des Clusters, die Sie zuvor abgerufen haben.

      Beispiel:

      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. Wählen Sie Erstellen aus, um die neue Policy zu erstellen.
  8. Installieren Sie das OCI-SDK für Java (siehe SDK für Java). Beachten Sie, dass die SDK-Version 2.66.0 oder höher (oder 3.18.0 oder höher) sein muss.
  9. Fügen Sie im pom.xml der Anwendung das Artefakt oci-java-sdk-addons-oke-workload-identity als Abhängigkeit hinzu:
    <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>
    Beachten Sie, dass die SDK-Version 2.66.0 oder höher (oder 3.18.0 oder höher) sein muss.
  10. Fügen Sie in Ihrem Java-Anwendungscode Folgendes hinzu:
    • den Kubernetes Engine-Workload-Identitätsprovider (OkeWorkloadIdentityAuthenticationDetailsProvider)
    • die OCI-Ressource für den Zugriff

    Beispiel: Das folgende Code-Snippet verwendet die Workload-Identität zur Authentifizierung, erstellt einen Bucket im Object Storage-Service in der Region Pheonix (PHX) und lädt eine Datei in den Bucket hoch:

    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. Öffnen Sie die Deployment-Spezifikation der Anwendung in einem Texteditor, und führen Sie folgende Schritte aus:
    1. Fügen Sie namespace hinzu, und setzen Sie es auf den Namen des zuvor erstellten Namespace. Beispiel: namespace: finance.
    2. Fügen Sie serviceAccountName hinzu, und setzen Sie es auf den Namen des Serviceaccounts, den Sie zuvor erstellt haben. Beispiel: serviceAccountName: financeserviceaccount.
    3. Fügen Sie automountServiceAccountToken hinzu, und setzen Sie es auf true.

    Beispiel:

    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. Deployment der Anwendung durch Eingabe von:
    kubectl create -f <filename>
    Beispiel:
    kubectl create -f financeworkloadidentity.yaml