Hinweis:

Secrets mit Oracle Cloud Native Environment verwenden

Einführung

Viele Anwendungen verfügen über Informationen wie Passwörter, auf die nur autorisierte Benutzer zugreifen dürfen. In dieser Situation können Kubernetes-Secrets helfen. Sie bieten eine Möglichkeit, vertrauliche Daten wie Passwörter, SSH- und API-Schlüssel sicher zu verwalten. Die Verwendung von Secrets ermöglicht die Trennung vertraulicher Daten vom Code der Anwendung. Dadurch wird das Risiko verringert, dass sensible Daten während des Workflows Ihrer Pods offengelegt oder geändert werden.

Bevor Sie beginnen, können Sie einige grundlegende Details zu Kubernetes-Secrets kennen:

Wichtig: Kubernetes-Secrets werden nicht standardmäßig verschlüsselt, weil sie nur Base64-codiert sind und unverschlüsselt in etcd gespeichert werden. So kann jeder mit Zugriff auf etcd ein Secret anzeigen oder ändern. Die Verwendung von Kubernetes-Secrets kann mit einer der folgenden Methoden sicher gemacht werden:

Dieses Tutorial behandelt die Grundlagen von Kubernetes Secrets und zeigt einen einfachen Anwendungsfall.

Weitere Informationen zu Oracle Cloud Native Environment 2 finden Sie auf der aktuellen Releasedokumentations-site.

Ziele

In diesem Tutorial lernen Sie:

Voraussetzungen

Oracle Cloud Native Environment konfigurieren

Hinweis: Wenn Sie in Ihrem eigenen Mandanten ausgeführt werden, lesen Sie das Projekt linux-virt-labs GitHub README.md, und schließen Sie die Voraussetzungen ab, bevor Sie die Übungsumgebung bereitstellen.

  1. Öffnen Sie ein Terminal im Luna-Desktop.

  2. Klonen Sie das Projekt linux-virt-labs GitHub.

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. Wechseln Sie in das Arbeitsverzeichnis.

    cd linux-virt-labs/ocne2
    
  4. Installieren Sie die erforderlichen Sammlungen.

    ansible-galaxy collection install -r requirements.yml
    
  5. Bereitstellen der Übungsumgebung.

    ansible-playbook create_instance.yml -e localhost_python_interpreter="/usr/bin/python3.6" -e install_ocne_rpm=true -e create_ocne_cluster=true -e "ocne_cluster_node_options='-n 1 -w 1'"
    

    Die kostenlose Übungsumgebung erfordert die zusätzliche Variable local_python_interpreter, die ansible_python_interpreter für Wiedergaben festlegt, die auf localhost ausgeführt werden. Diese Variable ist erforderlich, da die Umgebung das RPM-Package für das Oracle Cloud Infrastructure-SDK für Python unter den python3.6-Modulen installiert.

    Die Standard-Deployment-Ausprägung verwendet AMD-CPU und Oracle Linux 8. Um eine Intel CPU oder Oracle Linux 9 zu verwenden, fügen Sie dem Deployment-Befehl -e instance_shape="VM.Standard3.Flex" oder -e os_version="9" hinzu.

    Wichtig: Warten Sie, bis das Playbook erfolgreich ausgeführt wird, und erreichen Sie die Unterbrechungsaufgabe. In dieser Phase des Playbooks ist die Installation von Oracle CNE abgeschlossen, und die Instanzen sind bereit. Notieren Sie sich die vorherige Wiedergabe, in der die öffentlichen und privaten IP-Adressen der bereitgestellten Knoten und alle anderen Deployment-Informationen gedruckt werden, die während der Ausführung der Übung erforderlich sind.

Auf Kubernetes-Cluster zugreifen

  1. Öffnen Sie ein Terminal, und stellen Sie eine SSH-Verbindung zur ocne-Instanz her.

    ssh oracle@<ip_address_of_instance>
    
  2. Warten Sie, bis sich das Cluster stabilisiert und alle Pods in einem aktiven Status gemeldet werden.

    watch kubectl get pods -A
    

    Wenn alle Pods den STATUS Wird ausgeführt aufweisen, geben Sie ctrl-c ein, um den Befehl watch zu beenden.

  3. Prüfen Sie, wie viele Knoten vorhanden sind.

    kubectl get nodes
    

Secrets erstellen

Es gibt drei Möglichkeiten, Kubernetes-Secrets zu erstellen:

Kubectl direkt über die Befehlszeile verwenden

Es gibt zwei Möglichkeiten, Secrets zu erstellen:

  1. Erstellen Sie ein Secret mit Literalwerten, die direkt aus der Befehlszeile übergeben werden.

    kubectl create secret generic my-literal-secret --from-literal=username=my-user --from-literal=password=my-password
    

    Hinweis: Verwenden Sie einfache Anführungszeichen '', um Sonderzeichen wie $, \, $, &, = und ! zu maskieren, die in den Zeichenfolgenwerten enthalten sind. Andernfalls interpretiert die Befehls-Shell sie.

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl create secret generic my-literal-secret --from-literal=username=my-user --from-literal=password=my-password
    secret/my-literal-secret created
    

Kubectl mit gespeicherten Zugangsdaten verwenden

Der Inhalt der Datei wird zum Wert, und der Dateiname wird zum KEY.

  1. Erstellen Sie die Zugangsdaten.

    echo -n 'admin' > ./username.txt
    echo -n 'S!B\*d$zDsb=' > ./password.txt
    
  2. Erstellen Sie ein Secret mit gespeicherten Dateien.

    kubectl create secret generic my-file-secret \
     --from-file=username=./username.txt \
     --from-file=password=./password.txt
    

    Hinweis: Beim Standardverhalten wird der Dateiname als KEY-Wert verwendet, um zu zeigen, wie das Standardverhalten außer Kraft gesetzt und der KEY-Namenswert mit der Methode --from-file=[key]=[path to file] direkt aus der Befehlszeile deklariert wird.

    Zusätzliche Information:

    Alternativ können Sie ein Secret aus mehreren Dateien erstellen, die in einem Unterverzeichnis gespeichert sind.

    1. Unterverzeichnis erstellen

      mkdir secrets
      
    2. Erstellen Sie die Zugangsdaten.

      echo -n 'user1' > ./secrets/username.txt
      echo -n 'my-super-secret-password' > ./secrets/password.txt
      
    3. Erstellen Sie ein Secret mit Zugangsdatendateien in einem Unterverzeichnis.

      kubectl create secret generic my-secret --from-file=./secrets/
      

      Hinweis: Bei dieser Methode wird jeder Dateiname als KEY-Wert und der Inhalt der Datei als VALUE verwendet.

YAML-Konfigurationsdatei mit Kubectl anwenden

  1. Erstellen Sie die YAML-Definitionsdatei für Secrets.

    cat << EOF | tee db-credentials.yaml > /dev/null
    apiVersion: v1
    kind: Secret
    metadata:
      name: db-credentials
      # immutable: true
    type: Opaque
    data:
      username: "bXktdXNlcg=="
      password: "bXktcGFzc3dvcmQ="
    EOF
    

    Hinweis: Die Secret-Werte in der YAML-Datei müssen BASE64 codiert sein.

  2. Wenden Sie das Secret an.

    kubectl apply -f db-credentials.yaml
    

Kustomize mit einer kustomization.yaml-Datei verwenden

Für das Erstellen von Secrets mit Kustomize ist eine Datei kustomization.yaml erforderlich. Diese Datei muss eine secretGenerator mit einer der folgenden Methoden definieren:

Für alle oben genannten Werte müssen die Secret-Werte bei Verwendung von Kustomize nicht Base64 codiert werden. Der Name der von Kustomize verwendeten YAML-Datei muss entweder kustomization.yaml oder kustomization.yml lauten.

In diesem Beispiel wird gezeigt, wie Sie mit Literalen ein Secret erstellen.

  1. Erstellen Sie die Datei secretGenerator.

    cat << EOF | tee kustomization.yaml > /dev/null
    secretGenerator:
    - name: database-credentials
      literals:
      - username=admin
      - password=password
    EOF
    
  2. Erstelle das Geheimnis mit Kustomize.

    kubectl -n default apply -k .
    

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl -n default apply -k .
    secret/database-credentials-fd8288cb7g created
    

Kubernetes-Secrets verwalten

Sie können Kubernetes-Secrets in verschiedenen Namespaces speichern. Daher müssen Sie die Option -n verwenden, um Secrets aus einem bestimmten Namespace abzurufen, oder --all-namespaces oder -A verwenden, um Secrets aus allen Namespaces abzurufen. Der Befehl kubectl verwendet den default-Namespace, wenn Sie keinen Namespace angeben. Dasselbe Verhalten gilt beim Erstellen eines Kubernetes-Secrets.

Vorhandene Kubernetes-Secrets auflisten

  1. Listen Sie die neu erstellten Secrets auf.

    kubectl get secrets
    

    Beispielausgabe:

    NAME                              TYPE     DATA   AGE
    database-credentials-fd8288cb7g   Opaque   2      34s
    db-credentials                    Opaque   2      2m16s
    my-file-secret                    Opaque   2      2m40s
    my-literal-secret                 Opaque   2      2m51s
    
  2. Weitere Informationen zu den neu erstellten Secrets.

    kubectl describe secrets
    

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl describe secrets
    Name:         database-credentials-fd8288cb7g
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  8 bytes
    username:  5 bytes
    
    
    Name:         db-credentials
    Namespace:    default
    ...
    ...
    
    Name:         my-literal-secret
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    username:  7 bytes
    password:  11 bytes
    

    Beachten Sie, dass die Befehle kubectl get und kubectl describe den Inhalt eines secret nicht anzeigen, um eine versehentliche Exposition oder Aufnahme in eine Logdatei zu verhindern.

  3. Informationen für eines der Secrets anzeigen.

    kubectl -n default describe secret db-credentials
    

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl -n default describe secret db-credentials
    Name:         db-credentials
    Namespace:    default
    Labels:       <none>
    Annotations:  <none>
    
    Type:  Opaque
    
    Data
    ====
    password:  11 bytes
    username:  7 bytes
    

Kubernetes-Secret entschlüsseln

  1. Die gespeicherten Daten für eines der Secrets anzeigen.

    kubectl -n default get secret db-credentials -o jsonpath='{.data}'
    

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl -n default get secret db-credentials -o jsonpath='{.data}'
    {"password":"bXktcGFzc3dvcmQ=","username":"bXktdXNlcg=="}[oracle@ocne ~]$ 
    

    In der Ausgabe werden die codierten Schlüssel/Wert-Paare für die Secret-Daten angezeigt. Die Wertedaten sind base64-codiert.

  2. Entschlüsseln Sie die codierten Schlüssel-Wert-Daten.

    echo <BASE64-VALUE-FOR-PASSWORD> | base64 --decode
    

    Beispielausgabe:

    [oracle@ocne ~]$ echo bXktc3VwZXItc2VjcmV0LXBhc3Nvd3Jk | base64 --decode
    my-password[oracle@ocne ~]$ 
    

    WARNUNG: Diese Schritte können zu einem Datensatz der Secret-Daten in der Shell-Historie führen. Vermeiden Sie dies, indem Sie beide Schritte kombinieren, wie im nächsten Schritt gezeigt.

  3. Eine sicherere Methode zum Decodieren von codierten Key:Value-Daten.

    kubectl -n default get secret db-credentials -o jsonpath='{.data.password}' | base64 --decode
    

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl -n default get secret db-credentials -o jsonpath='{.data.password}' | base64 --decode
    my-password[oracle@ocne ~]$ 
    

Secret bearbeiten

Wie viele Kubernetes-Objekte können Sie ein Kubernetes-Secret bearbeiten. Die einzige Ausnahme ist, wenn ein Secret als unveränderbar deklariert wird.

  1. Secret bearbeiten.

    kubectl edit secrets my-literal-secret
    

    Der Standardeditor wird geöffnet (standardmäßig vi), damit Sie die Base64-codierten Secret-Werte im Feld data: aktualisieren können.

    Beispielausgabe:

    # Please edit the object below. Lines beginning with a '#' will be ignored,
    # and an empty file will abort the edit. If an error occurs while saving this file will be
    # reopened with the relevant failures.
    #
    apiVersion: v1
    data:
      password: bXktcGFzc3dvcmQ=
      username: bXktdXNlcg==
    kind: Secret
    metadata:
      creationTimestamp: "2025-05-09T10:56:14Z"
      name: my-literal-secret
      namespace: default
      resourceVersion: "1689"
      uid: 394dfda3-025a-417d-bbfe-c4851a6b6cff
    type: Opaque
    ~                                                                                                                                       
    ~                                                                                                                                             
    ~                                                                                                                                       
    ~                                                                                                                                             
    "/tmp/kubectl-edit-1267071353.yaml" 16L, 480C
    
  2. Beenden Sie den Editor ohne zu speichern, indem Sie die Esc-Taste gefolgt von den :q!-Tasten drücken.

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl edit secrets my-literal-secret
    Edit cancelled, no changes made.
    

Secret entfernen

Sie können ein Secret mit dem Befehl kubectl -n <NAMESPACE> delete entfernen.

  1. Secrets löschen

    kubectl -n default delete secret my-file-secret my-literal-secret
    

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl -n default delete secret my-file-secret  my-literal-secret
    secret "my-file-secret" deleted
    secret "my-literal-secret" deleted
    

    Hinweis: Sie können mehrere Secrets löschen, indem Sie sie durch Leerzeichen trennen.

Secrets mit einem Deployment verwenden

Als Nächstes erstellen Sie ein Deployment mit den von Ihnen erstellten Kubernetes-Secret-Daten.

  1. Listen Sie alle Secrets im Standard-Namespace auf.

    kubectl get secrets -n default
    

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl get secrets -n default
    NAME                              TYPE     DATA   AGE
    database-credentials-fd8288cb7g   Opaque   2      10m
    db-credentials                    Opaque   2      8m
    
  2. YAML-Datei für Deployment erstellen.

    cat << EOF | tee echo-deployment.yaml > /dev/null
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: echo-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: echo
      template:
        metadata:
          labels:
            app: echo
        spec:
          containers:
          - name: echo
            image: ghcr.io/oracle/oraclelinux:9
            command: ["/bin/bash", "-c"]
            args: ["echo 'Username: $USER' 'Password: $PASSWORD'; sleep infinity"]
            env:
            - name: USER
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: username
            - name: PASSWORD
              valueFrom:
                secretKeyRef:
                  name: db-credentials
                  key: password
          restartPolicy: Always
    EOF
    
  3. Deployment erstellen

    kubectl -n default apply -f echo-deployment.yaml
    
  4. Bestätigen Sie das Deployment.

    kubectl get deployments
    

    Möglicherweise müssen Sie während der Bereitstellung einige Male eine erneute Abfrage durchführen.

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl get deployments 
    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    echo-deployment   1/1     1            1           4m
    
  5. Rufen Sie den Namen des bereitgestellten Pods ab.

    kubectl get pods
    

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl get pods
    NAME                               READY   STATUS    RESTARTS   AGE
    echo-deployment-59bff74847-9nnkq   1/1     Running   0          6m
    

    Hinweis: Der Name Ihres Pods ist unterschiedlich.

  6. Prüfen Sie, ob der bereitgestellte Pod das Secret verwendet hat.

    kubectl -n default describe pod <POD-NAME>
    

    Dabei gilt:

    • <POD-NAME>: Der Podname in Ihrem Deployment.

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl -n default describe pod echo-deployment-59bff74847-9nnkq
    Name:             echo-deployment-59bff74847-9nnkq
    Namespace:        default
    Priority:         0
    Service Account:  default
    Node:             ocne-worker-1/192.168.122.77
    Start Time:       Mon, 12 May 2025 13:42:25 +0000
    ...
    ...
        Ready:          True
        Restart Count:  0
        Environment:
          USER:      <set to the key 'username' in secret 'db-credentials'>  Optional: false
          PASSWORD:  <set to the key 'password' in secret 'db-credentials'>  Optional: false
        Mounts:
          /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-5fp4d (ro)
    Conditions:
      Type                        Status
      PodReadyToStartContainers   True 
      Initialized                 True
    ...
    ..
    QoS Class:                   BestEffort
    Node-Selectors:              <none>
    Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
    Events:                      <none>
    [oracle@ocne ~]$ 
    

    Hinweis: Prüfen Sie im Abschnitt Environment:, ob die Variablen $USER und $PASSWORD vorhanden sind.

  7. Vergewissern Sie sich, dass die Umgebungsvariablen im bereitgestellten Pod vorhanden sind.

    kubectl exec -it <POD-NAME> -- printenv USER PASSWORD
    

    Dabei gilt:

    • <POD-NAME>: Der Podname in Ihrem Deployment.

    Beispielausgabe:

    [oracle@ocne ~]$ kubectl exec -it echo-deployment-59bff74847-9nnkq -- printenv USER PASSWORD
    my-user
    my-password
    

    Die Ausgabe bestätigt, dass Sie Kubernetes-Secrets erfolgreich als Umgebungsvariable im bereitgestellten Pod verwendet haben.

Nächste Schritte

In diesem Tutorial wurde gezeigt, wie Sie Kubernetes-Secrets erstellen und verwenden, um den unbefugten Zugriff auf vertrauliche Informationen einzuschränken. Dies ist jedoch nur der Anfang. Weitere Tutorials und Inhalte finden Sie in der Oracle Linux-Schulungsstation.

Weitere Lernressourcen

Sehen Sie sich weitere Übungen zu docs.oracle.com/learn an, oder greifen Sie auf weitere kostenlose Lerninhalte im Oracle Learning YouTube-Kanal zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um ein Oracle Learning Explorer zu werden.

Die Produktdokumentation finden Sie im Oracle Help Center.