주:

Oracle Cloud Native Environment에서 비밀 사용

소개

많은 응용 프로그램에는 권한이 부여된 사용자만 액세스할 수 있는 암호와 같은 정보가 있습니다. 이 상황에서 Kubernetes Secrets가 도움이 될 수 있습니다. 또한 암호, SSH 및 API 키와 같은 중요한 데이터를 안전하게 관리할 수 있는 방법을 제공합니다. 비밀을 사용하면 애플리케이션의 코드에서 기밀 데이터를 분리할 수 있으므로 파드의 워크플로 중에 민감한 데이터가 노출되거나 수정될 위험이 줄어듭니다.

시작하기 전에 Kubernetes 비밀에 대한 몇 가지 기본적인 세부 사항을 알 수 있습니다.

중요: Kubernetes 암호는 Base64 인코딩으로만 암호화되고 etcd에 암호화되지 않은 상태로 저장되기 때문에 기본적으로 암호화되지 않습니다. 따라서 etcd에 액세스 할 수있는 사람은 비밀을 보거나 변경할 수 있습니다. 다음 방법 중 하나를 사용하여 Kubernetes 암호를 안전하게 사용할 수 있습니다.

이 자습서에서는 Kubernetes Secrets의 기초를 다루고 간단한 사용 사례를 보여줍니다.

Oracle Cloud Native Environment 2에 대한 자세한 내용은 현재 릴리스 설명서 사이트를 참조하십시오.

목표

이 자습서에서는 다음 내용을 학습합니다.

필요 조건

Oracle Cloud Native Environment 구성

주: 고유 테넌시에서 실행 중인 경우 linux-virt-labs GitHub 프로젝트 README.md를 읽고 실습 환경을 배치하기 전에 필요 조건을 완료하십시오.

  1. Luna Desktop에서 터미널을 엽니다.

  2. linux-virt-labs GitHub 프로젝트를 복제합니다.

    git clone https://github.com/oracle-devrel/linux-virt-labs.git
    
  3. 작업 디렉토리로 변경합니다.

    cd linux-virt-labs/ocne2
    
  4. 필요한 모음을 설치합니다.

    ansible-galaxy collection install -r requirements.yml
    
  5. lab 환경을 배치합니다.

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

    무료 실습 환경에는 localhost에서 실행되는 재생에 대해 ansible_python_interpreter를 설정하는 추가 변수 local_python_interpreter이 필요합니다. 이 변수는 환경이 python3.6 모듈 아래에 있는 Oracle Cloud Infrastructure SDK for Python용 RPM 패키지를 설치하기 때문에 필요합니다.

    기본 배치 구성은 AMD CPU 및 Oracle Linux 8을 사용합니다. Intel CPU 또는 Oracle Linux 9를 사용하려면 배치 명령에 -e instance_shape="VM.Standard3.Flex" 또는 -e os_version="9"를 추가합니다.

    중요: 플레이북이 성공적으로 실행될 때까지 기다렸다가 일시 중지 작업에 도달합니다. 플레이북의 이 단계에서 Oracle CNE 설치가 완료되고 인스턴스가 준비됩니다. 이전 플레이에서 배치하는 노드의 공용(public) 및 전용(private) IP 주소와 실습을 실행하는 동안 필요한 기타 배치 정보를 출력합니다.

Kubernetes 클러스터 액세스

  1. 터미널을 열고 SSH를 통해 ocne 인스턴스에 연결합니다.

    ssh oracle@<ip_address_of_instance>
    
  2. 클러스터가 안정화되고 모든 포드가 실행 중 상태로 보고될 때까지 기다립니다.

    watch kubectl get pods -A
    

    모든 포드가 RunningSTATUS를 표시하면 ctrl-c를 입력하여 watch 명령을 종료합니다.

  3. 노드가 몇 개 있는지 확인합니다.

    kubectl get nodes
    

암호 만들기

다음과 같은 세 가지 방법으로 Kubernetes 암호를 만들 수 있습니다.

명령행에서 직접 Kubectl 사용

Kubectl은 두 가지 방법 중 하나로 비밀을 만듭니다.

  1. 명령행에서 직접 전달된 리터럴 값을 사용하여 암호를 생성합니다.

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

    주: 문자열 값에 포함된 $, \, $, &, =!와 같은 특수 문자를 이스케이프하려면 작은 따옴표 ''를 사용하십시오. 그렇지 않으면 명령 셸이 이를 해석합니다.

    출력 예:

    [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 사용

파일의 컨텐츠는 VALUE가 되고 파일 이름은 KEY가 됩니다.

  1. 인증서 파일을 만듭니다.

    echo -n 'admin' > ./username.txt
    echo -n 'S!B\*d$zDsb=' > ./password.txt
    
  2. 저장된 파일을 사용하여 암호를 만듭니다.

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

    주: 기본 동작은 파일 이름을 KEY 값으로 사용하여 기본 동작을 무효화하는 방법을 표시하고 --from-file=[key]=[path to file] 메소드를 사용하여 명령줄에서 직접 KEY 이름 값을 선언합니다.

    추가 정보:

    또는 하위 디렉토리에 저장된 여러 파일에서 암호를 만들 수 있습니다.

    1. 하위 디렉토리를 생성합니다.

      mkdir secrets
      
    2. 인증서 파일을 만듭니다.

      echo -n 'user1' > ./secrets/username.txt
      echo -n 'my-super-secret-password' > ./secrets/password.txt
      
    3. 하위 디렉토리의 인증서 파일을 사용하여 암호를 생성합니다.

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

      주: 이 메소드는 각 파일 이름을 KEY 값으로 사용하고 파일의 내용을 VALUE로 사용합니다.

Kubectl을 사용하여 YAML 구성 파일 적용

  1. 암호 YAML 정의 파일을 만듭니다.

    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
    

    주: YAML 파일의 암호 값은 반드시 BASE64 인코딩이어야 합니다.

  2. 암호를 적용합니다.

    kubectl apply -f db-credentials.yaml
    

kustomization.yaml 파일로 사용자 정의 사용

사용자 정의로 암호를 만들려면 kustomization.yaml 파일이 필요합니다. 이 파일은 다음 방법 중 하나를 사용하여 secretGenerator를 정의해야 합니다.

위의 모든 사항은 Kustomize를 사용할 때 암호 값을 Base64로 인코딩할 필요가 없습니다. 사용자 정의에 사용되는 YAML 파일의 이름은 반드시 kustomization.yaml 또는 kustomization.yml이어야 합니다.

이 예제에서는 리터럴을 사용하여 암호를 생성하는 방법을 보여줍니다.

  1. secretGenerator 파일을 만듭니다.

    cat << EOF | tee kustomization.yaml > /dev/null
    secretGenerator:
    - name: database-credentials
      literals:
      - username=admin
      - password=password
    EOF
    
  2. Kustomize를 사용하여 암호를 생성합니다.

    kubectl -n default apply -k .
    

    출력 예:

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

Kubernetes 암호 관리

Kubernetes 암호는 여러 네임스페이스에 저장할 수 있습니다. 따라서 -n 옵션을 사용하여 특정 네임스페이스에서 암호를 검색하거나, --all-namespaces 또는 -A를 사용하여 모든 네임스페이스에서 암호를 검색해야 합니다. 네임스페이스를 지정하지 않은 경우 kubectl 명령은 default 네임스페이스를 사용합니다. Kubernetes 암호를 생성할 때도 동일한 동작이 적용됩니다.

기존 Kubernetes 암호 나열

  1. 새로 생성된 암호를 나열합니다.

    kubectl get secrets
    

    출력 예:

    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. 새로 생성된 암호에 대한 추가 세부정보를 가져옵니다.

    kubectl describe secrets
    

    출력 예:

    [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
    

    로그 파일에 우발적으로 노출되거나 포함되는 것을 방지하기 위해 kubectl getkubectl describe 명령은 secret의 내용을 표시하지 않습니다.

  3. 비밀 중 하나에 대한 정보를 봅니다.

    kubectl -n default describe secret db-credentials
    

    출력 예:

    [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 암호 디코딩

  1. 암호 중 하나에 대해 저장된 데이터를 확인합니다.

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

    출력 예:

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

    출력에는 암호 데이터에 대해 인코딩된 Key:Value 쌍이 표시됩니다. 값 데이터는 base64로 인코딩됩니다.

  2. 인코딩된 키:값 데이터를 디코딩합니다.

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

    출력 예:

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

    경고: 이러한 단계를 수행하면 셸 기록에 암호 데이터가 기록될 수 있습니다. 다음 단계에 표시된 것처럼 두 단계를 결합하여 이 작업을 수행하지 마십시오.

  3. 인코딩된 키:값 데이터를 디코딩하는 보다 안전한 방법입니다.

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

    출력 예:

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

암호 편집

많은 Kubernetes 객체와 마찬가지로 Kubernetes 암호를 편집할 수 있습니다. 유일한 예외는 암호가 immutable로 선언된 경우입니다.

  1. 암호를 편집합니다.

    kubectl edit secrets my-literal-secret
    

    기본 편집기가 열리면(기본적으로 vi) data: 필드에서 Base64 인코딩 암호 값을 업데이트할 수 있습니다.

    출력 예:

    # 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. Esc 키와 :q! 키를 차례로 눌러 저장하지 않고 편집기를 종료합니다.

    출력 예:

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

암호 제거

kubectl -n <NAMESPACE> delete 명령을 사용하여 암호를 제거할 수 있습니다.

  1. 비밀을 지워라.

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

    출력 예:

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

    주: 공백으로 구분하여 여러 암호를 삭제할 수 있습니다.

배치 시 암호 사용

다음으로 생성한 Kubernetes 암호 데이터를 사용하여 배치를 생성합니다.

  1. default 이름 공간에서 모든 암호를 나열합니다.

    kubectl get secrets -n default
    

    출력 예:

    [oracle@ocne ~]$ kubectl get secrets -n default
    NAME                              TYPE     DATA   AGE
    database-credentials-fd8288cb7g   Opaque   2      10m
    db-credentials                    Opaque   2      8m
    
  2. 배치 YAML 파일을 생성합니다.

    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. 배치 생성

    kubectl -n default apply -f echo-deployment.yaml
    
  4. 배치를 확인합니다.

    kubectl get deployments
    

    배치하는 동안 몇 번 재질의해야 할 수도 있습니다.

    출력 예:

    [oracle@ocne ~]$ kubectl get deployments 
    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    echo-deployment   1/1     1            1           4m
    
  5. 배치된 Pod의 이름을 가져옵니다.

    kubectl get pods
    

    출력 예:

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

    참고: Pod의 이름은 다를 수 있습니다.

  6. 배포된 Pod가 암호를 사용했는지 확인합니다.

    kubectl -n default describe pod <POD-NAME>
    

    설명:

    • <POD-NAME> - 배치의 Pod 이름입니다.

    출력 예:

    [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 ~]$ 
    

    주: Environment: 섹션에서 $USER$PASSWORD 변수가 있는지 확인합니다.

  7. 배포된 Pod에 환경 변수가 있는지 확인합니다.

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

    설명:

    • <POD-NAME> - 배치의 Pod 이름입니다.

    출력 예:

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

    출력은 Kubernetes Secrets를 배포된 포드에서 환경 변수로 성공적으로 사용했음을 확인합니다.

다음 단계

이 사용지침서에서는 Kubernetes 암호를 만들고 사용하여 민감한 정보에 대한 무단 액세스를 제한하는 방법을 보여줍니다. 그러나 이것은 단지 시작일 뿐이다. 추가 튜토리얼과 내용은 Oracle Linux Training Station을 확인하십시오.

추가 학습 자원

docs.oracle.com/learn에서 다른 랩을 탐색하거나 Oracle Learning YouTube 채널에서 더 많은 무료 학습 콘텐츠에 액세스하세요. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer가 되십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.